家居网购项目(手写分页)

文章目录

    • 1.后台管理—分页显示
        • 1.程序框架图
        • 2.编写数据模型
          • Page.java
        • 3.编写dao层
          • 1.修改FurnDao
            • 增加方法
          • 2.修改FurnDaoImpl
            • 增加方法
          • 3.单元测试
            • FurnDaoTest
        • 4.编写service层
          • 1.修改FurnService
            • 增加方法
          • 2.修改FurnServiceImpl
          • 增加方法
          • 3.单元测试
            • FurnServiceTest
        • 5.编写DataUtils
          • 增加方法
        • 6.编写FurnServlet
          • 增加方法
        • 7.修改manage_menu.jsp
        • 8.修改furn_manage.jsp
        • 9.结果展示
          • 1.点击家居管理
          • 2.只展示当前页的三个数据
    • 2.后台分页导航
        • 1.需求分析
        • 2.完成底部分页
          • 1.修改furn_manage.jsp
          • 2.结果展示
            • 1.限制显示5页
            • 2.末页只显示前面两页
            • 3.首页只显示后面两页
        • 3.完成修改家居后跳转原页面
          • 1.修改furn_manage.jsp
          • 2.修改furn_update.jsp
          • 3.修改FurnServlet
            • 更新updateFurn方法
          • 4.结果展示
            • 1.修改前是第4页
            • 2.点击修改
            • 3.回到第4页
        • 4.完成删除家居后跳转原页面
          • 1.修改furn_manage.jsp
          • 2.修改FurnServlet
            • 更新del方法
          • 3.结果展示
            • 1.删除前是第四页
            • 2.删除后还是第四页
        • 5.完成添加家居后跳转原页面
          • 1.修改furn_manage.jsp
          • 2.修改furn_add.jsp
          • 3.修改FurnServlet
            • 更新add方法
          • 4.结果展示
            • 1.添加家居前是第3页
            • 2.添加家居后还是3页
    • 3.首页分页
        • 1.需求分析
        • 2.分页显示家居
          • 1.编写CustomerFurnServlet
            • CustomerFurnServlet.java
          • 2.修改index.jsp
          • 3.index.html修改为index.jsp
            • 1.修改头部
            • 2.遍历显示家居
        • 3.分页导航条设置
          • 修改index.jsp
        • 4.单元测试
          • 图片重复问题
            • 原因
        • 5.结果展示
          • 1.首页显示
          • 2.分页导航条设置

1.后台管理—分页显示

1.程序框架图

image-20240206202839584

2.编写数据模型
Page.java
package com.sxs.furns.entity;

import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Page<T> {
    public static final Integer PAGE_SIZE = 3; //每页显示几条记录
    private Integer pageNo; //表示当前页
    private Integer pageSize = PAGE_SIZE; //表示每页显示几条记录
    private Integer pageTotalCount; //表示共有几页
    private Integer totalRow; //表示共有多少条记录
    private List<T> items; //表示当前页显示的数据
    private String url; //分页导航的字符串

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(Integer pageTotalCount) {
        this.pageTotalCount = pageTotalCount;
    }

    public Integer getTotalRow() {
        return totalRow;
    }

    public void setTotalRow(Integer totalRow) {
        this.totalRow = totalRow;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

3.编写dao层
1.修改FurnDao
增加方法
    //获取记录总数
    public int getTotalRow();
    //获取当前页要显示的数据
    public List<Furn> getPageItems(int begin, int pageSize);
2.修改FurnDaoImpl
增加方法
    /**
     * 获取总的记录条数
     *
     * @return 返回总的记录条数
     */
    @Override
    public int getTotalRow() {
        String sql = "SELECT COUNT(*) FROM furn";
        //注意这里的类型转换
        return ((Number) queryScalar(sql)).intValue();
    }

    /**
     * 获取当页要显示的数据
     *
     * @param begin 从第几条记录开始获取
     * @param pageSize 每页的大小
     * @return
     */
    @Override
    public List<Furn> getPageItems(int begin, int pageSize) {
        String sql ="select * from furn limit ?, ?";
        return queryMulti(sql, Furn.class, begin, pageSize);
    }
3.单元测试
FurnDaoTest
    @Test
    public void getTotalRow() {
        System.out.println("记录总数为:" + furnDao.getTotalRow());
    }

    @Test
    public void getPageItems() {
        List<Furn> pageItems = furnDao.getPageItems(3, 3);
        if (pageItems != null) {
            for (Furn pageItem : pageItems) {
                System.out.println(pageItem);
            }
        }
    }

image-20240207100046487

image-20240207100112517

4.编写service层
1.修改FurnService
增加方法
    //6.根据传入的begin和pageSize返回对应的page对象
    public Page<Furn> page(int pageNo, int pageSize);
2.修改FurnServiceImpl
增加方法
    /**
     * 根据传入的页号和每页的大小,返回page
     *
     * @param pageNo
     * @param pageSize
     * @return 返回page
     */
    @Override
    public Page<Furn> page(int pageNo, int pageSize) {
        Page<Furn> page = new Page<>();
        page.setPageNo(pageNo);
        page.setPageSize(pageSize);
        int totalRow = furnDao.getTotalRow();
        page.setTotalRow(totalRow);
        //计算总页数
        int pageTotalCount = totalRow / pageSize;
        if (totalRow % pageSize > 0) {
            pageTotalCount += 1;
        }
        page.setPageTotalCount(pageTotalCount);
        //计算当前页显示的记录
        int begin = pageSize * (pageNo - 1);
        List<Furn> pageItems = furnDao.getPageItems(begin, pageSize);
        page.setItems(pageItems);
        return page;
    }
3.单元测试
FurnServiceTest

image-20240207103549032

image-20240207103532536

5.编写DataUtils
增加方法
    /**
     * 字符串转换为Integer
     *
     * @param str 传入的字符串
     * @param def 默认值
     * @return
     */
    public static Integer parseInt(String str, Integer def) {
        if (null == str || "".equals(str)) {
            return  def;
        } else {
            return Integer.parseInt(str);
        }
    }
6.编写FurnServlet
增加方法
    /**
     * 处理分页请求
     * @param req
     * @param resp
     */
    public void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取pageNo和pageSize
        Integer pageNo = DataUtils.parseInt(req.getParameter("pageNo"), 1);
        Integer pageSize = DataUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
        //调用方法获取page对象
        Page<Furn> page = furnService.page(pageNo, pageSize);
        //将page放入request域请求转发到前端
        req.setAttribute("page", page);
        req.getRequestDispatcher("/views/manage/furn_manage.jsp").forward(req, resp);
    }

7.修改manage_menu.jsp

image-20240207111103569

8.修改furn_manage.jsp

image-20240207111156195

9.结果展示
1.点击家居管理

image-20240207111235946

2.只展示当前页的三个数据

image-20240207111313379

2.后台分页导航

1.需求分析

image-20240207134728570

2.完成底部分页
1.修改furn_manage.jsp
        <!--  Pagination Area Start 分页导航条 -->
        <div class="pro-pagination-style text-center mb-md-30px mb-lm-30px mt-6" data-aos="fade-up">
            <ul>
                <li><a href="manage/furnServlet?action=page&pageNo=1">首页</a></li>
                <%--有上一页再显示--%>
                <c:if test="${requestScope.page.pageNo-1 > 0}">
                    <li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上页</a></li>
                </c:if>

                <%--最多显示5--%>
                <c:forEach begin="${requestScope.page.pageNo - 2 > 0 ? requestScope.page.pageNo - 2 : 1}" end="${requestScope.page.pageNo+2}" var="pageNo">
                    <%--页数在范围内才显示--%>
                    <c:if test="${pageNo >= 1 && pageNo <= requestScope.page.pageTotalCount}">
                        <li>
                                <%-- 如果是当前页号则显示被选中--%>
                            <a class="<c:if test="${requestScope.page.pageNo == pageNo}">active</c:if>"
                               href="manage/furnServlet?action=page&pageNo=${pageNo}#">${pageNo}</a>
                        </li>
                    </c:if>
                </c:forEach>

                <%--有下一页再显示--%>
                <c:if test="${requestScope.page.pageNo+1 <= requestScope.page.pageTotalCount}">
                    <li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下页</a></li>
                </c:if>
                <li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageTotalCount}">末页</a></li>
                <li><a>共${requestScope.page.pageTotalCount}</a></li>
                <li><a>共${requestScope.page.totalRow}记录</a></li>
            </ul>
        </div>
        <!--  Pagination Area End -->
2.结果展示
1.限制显示5页

image-20240207152021069

2.末页只显示前面两页

image-20240207152054029

3.首页只显示后面两页

image-20240207152121839

3.完成修改家居后跳转原页面
1.修改furn_manage.jsp

image-20240207152253434

2.修改furn_update.jsp

image-20240207153728660

3.修改FurnServlet
更新updateFurn方法
    /**
     * 读取表单信息,进行修改
     *
     * @param req
     * @param resp
     */
    public void updateFurn(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取pageNo
        String pageNo = req.getParameter("pageNo");
        //使用工具类将表单信息封装到bean中
        Furn furn = DataUtils.copyParamToBean(req.getParameterMap(), new Furn());
        //执行更新操作
        if (furnService.updateFurn(furn)) {
            //更新成功则重定向到展示页面
            resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=page&pageNo=" + pageNo);
        } else {
            System.out.println("更新失败");
        }
    }
4.结果展示
1.修改前是第4页

image-20240207153922790

2.点击修改

image-20240207154006389

3.回到第4页

image-20240207154024060

4.完成删除家居后跳转原页面
1.修改furn_manage.jsp

image-20240207154333820

2.修改FurnServlet
更新del方法
    /**
     * 根据获取的id删除家居,获取家居信息并重定向到furn_manage.jsp
     *
     * @param req
     * @param resp
     */
    public void del(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取id
        String id = req.getParameter("id");
        //获取pageNo
        String pageNo = req.getParameter("pageNo");
        //根据id删除
        if (furnService.deleteFurnById(Integer.parseInt(id))) {
            resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=page&pageNo=" + pageNo);
        } else {
            System.out.println("删除失败");
        }
    }
3.结果展示
1.删除前是第四页

image-20240207155205032

2.删除后还是第四页

image-20240207155222549

5.完成添加家居后跳转原页面
1.修改furn_manage.jsp

image-20240207155501087

2.修改furn_add.jsp

image-20240207155716232

3.修改FurnServlet
更新add方法
    /**
     * 添加家居并重新获取家居信息,重定向到furn_manage.jsp
     *
     * @param req
     * @param resp
     */
    public void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException, InvocationTargetException, IllegalAccessException {
        //使用工具类封装并处理异常
        Furn furn = DataUtils.copyParamToBean(req.getParameterMap(), new Furn());
        //获取pageNo
        String pageNo = req.getParameter("pageNo");
        //插入到数据库
        if (furnService.add(furn)) {
            //插入成功则重定向到家居显示的servlet
            resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=page&pageNo=" + pageNo);
        } else {
            System.out.println("插入失败");
        }
    }
4.结果展示
1.添加家居前是第3页

image-20240207160247023

2.添加家居后还是3页

image-20240207160315181

image-20240207160322398

3.首页分页

1.需求分析

image-20240207160723026

2.分页显示家居
1.编写CustomerFurnServlet
CustomerFurnServlet.java
package com.sxs.furns.web;

import com.sxs.furns.entity.Furn;
import com.sxs.furns.entity.Page;
import com.sxs.furns.service.FurnService;
import com.sxs.furns.service.impl.FurnServiceImpl;
import com.sxs.furns.utils.DataUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/customerFurnServlet")
public class CustomerFurnServlet extends BasicServlet{
    FurnService furnService = new FurnServiceImpl();
    /**
     * 根据pageNo和pageSize,将page对象请求转发到index.jsp
     */
    public void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取pageNo和pageSize
        Integer pageNo = DataUtils.parseInt(req.getParameter("pageNo"), 1);
        Integer pageSize = DataUtils.parseInt(req.getParameter("pageSize"), 8);
        //调用service层,获取page对象
        Page<Furn> page = furnService.page(pageNo, pageSize);
        //请求转发到index.jsp
        req.setAttribute("page", page);
        req.getRequestDispatcher("/views/customer/index.jsp").forward(req, resp);
    }
}

2.修改index.jsp
<%--
  Date: 2024/2/4
  Time: 18:42
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<%-- 网站入口,请求转发到/customerFurnServlet--%>
  <jsp:forward page="/customerFurnServlet?action=page"></jsp:forward>
</body>
</html>

3.index.html修改为index.jsp

image-20240207182359821

1.修改头部

image-20240207182126242

2.遍历显示家居

image-20240207182603758

3.分页导航条设置
修改index.jsp

image-20240207182725483

4.单元测试
图片重复问题

image-20240207181229256

原因
  1. 查询的时候直接查的所有数据,select *
  2. 但是javabean中的字段和imgPath 和 表中的字段img_Path不符,所以无法封装进去,就使用了之前设置的默认值
  3. 在查找的时候设置一个别名即可

image-20240207181255274

image-20240207181527877

5.结果展示
1.首页显示

image-20240207183354539

2.分页导航条设置

image-20240207183413734

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/549644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版AndroidStudio使用switch-case语句时出现Constant expression required错误

原因: 在新版的Android Studio中使用JDK17以上版本&#xff0c;会出现switch语句报错"Constant expression required"的问题&#xff0c;这是因为在JDK17中switch语句的条件表达式支持使用枚举类型&#xff0c;而这个特性还没有被支持。 解决方法: ①在gradle.prope…

pytorch 今日小知识3——nn.MaxPool3d 、nn.AdaptiveAvgPool3d、nn.ModuleList

MaxPool3d — PyTorch 2.2 documentation 假设输入维度&#xff08;1,2,3,4,4&#xff09; maxpool torch.nn.MaxPool3d(kernel_size(2, 2, 2), stride(2, 2, 2), padding(1, 0, 0))F 维的 kernel_size 为 2&#xff0c;说明在 F 维的覆盖的 frame 数为 2&#xff0c;也就是…

ElasticSearch查询时修改打分

原生的ES打分基于BM25算法&#xff0c;相比于TF-IDF已经有了较大的改进&#xff0c;但是在实际场景中往往最终的排序效果还是需要进行调整。由于直接修改索引的权重往往代价较大&#xff0c;比较经济的方式还是在查询时即时修改得分以实现排序控制。 注&#xff1a;案例测试数据…

Winform重难点笔记

FrmMain.cs 中的 partial&#xff08;部分的&#xff09; 和 FrmMain.Designer.cs 中的 partial 一样&#xff0c;不是一个类的修饰符&#xff0c;是限定这个类本身的组成部分&#xff0c;叫做部分类。当程序在编译和运行时&#xff0c;会把 FrmMain.cs 中的 FrmMain 类 和 Frm…

【CAN】采样点介绍及测试方法

文章目录 1 什么是采样点2 为什么需要采样点3 采样点的计算公式4 VH6501测试原理和方法4.1 VH6501测试采样点原理4.2 VH6501测试方法 >>返回总目录<< 1 什么是采样点 采样点是节点判断信号逻辑电平的位置&#xff0c;是CAN控制器读取总线电平&#xff0c;并解释各…

【数据结构与算法】:10道链表经典OJ

目录 1. 移除链表元素2. 反转链表2.1反转指针法2.2 头插法 3. 合并两个有序链表4. 分隔链表5. 环形链表6. 链表的中间节点7. 链表中倒数第K个节点8. 相交链表9. 环形链表的约瑟夫问题10. 链表的回文结构 1. 移除链表元素 思路1&#xff1a;遍历原链表&#xff0c;将 val 所在的…

保姆级教程 | Adobe Illustrator 中插入数学符号

背景 鉴于Adobe Illustrator作为比较专业的绘图/组图软件&#xff0c;我的论文数据作图都会选择先在origin中把原始数据绘制好&#xff0c;后都放入AI中细修。由于在作图过程中需要插入数学符号&#xff0c;但仿佛没有PowerPoint用起来那么熟悉&#xff0c;遂记录下。 步骤 …

【软件设计师】假设系统采用PV操作实现进程同步与互斥。若n个进程共享两台打印机,那么信号量 S的取值范围为 (23) 。2014年下半年第23题。

假设系统采用PV操作实现进程同步与互斥。若n个进程共享两台打印机&#xff0c;那么信号量 S的取值范围为 &#xff08;23&#xff09; 。 答案&#xff1a;D 解析见下图所示&#xff1a;

Maven POM元素解析(二)

一、parent <parent>元素包含定位此项目将从中继承的父项目所需的信息。注意&#xff1a;此元素的子元素不是插值的&#xff0c;必须作为文字值给定。 ElementTypeDescriptiongroupIdString要从中继承的父项目的组id。artifactIdString要从中继承的父项目的项目id。ver…

面向对象的C++题目以及解法2

01串排序 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; class String { public:string str; String(const string& s) : str(s) {} int length() const {return str.length();}i…

【零基础入门TypeScript】模块

目录 内部模块 内部模块语法&#xff08;旧&#xff09; 命名空间语法&#xff08;新&#xff09; 两种情况下生成的 JavaScript 是相同的 外部模块 选择模块加载器 定义外部模块 句法 例子 文件&#xff1a;IShape.js 文件&#xff1a;Circle.js 文件&#xff1a;…

力扣101. 对称二叉树(java)

思路&#xff1a; 一、验证 左右子树是否可翻转对称的&#xff1f; 二、分析左右子树情况&#xff1a; 1&#xff09;左右都也空 对称 2&#xff09;左右有一个为空 不对称 3&#xff09;左右都不为空&#xff0c;但数字不同 不对称 4&#xff09;左右都不为空&#xff0c;且数…

bugku-web-安慰奖

提示备份 开始扫后台 得到备份文件index.php.bak 得到php代码 <?phpheader("Content-Type: text/html;charsetutf-8"); error_reporting(0); echo "<!-- YmFja3Vwcw -->"; class ctf {protected $username hack;protected $cmd NULL;public f…

【java】static关键字

类与对象的关系 类是构建对象的模板&#xff0c;一个类可以构建多个对象。 类在方法区当中&#xff0c;对象在堆中。 static修饰的变量是独属于类的变量&#xff0c;没有给对象。 public class Person {private String name;private int age;private static String like;public…

Leetcode刷题(异或)

一、2980. 检查按位或是否存在尾随零 奇数二进制形式最右一位一定为1 偶数二进制形式最右一位一定为0 要存在尾随0至少要两个偶数进行或运算 代码 class Solution:def hasTrailingZeros(self, nums: List[int]) -> bool:cnt 0for x in nums:if x%20:cnt1return True if c…

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板&#xff1a; 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本&#xff1a;来自 【正点原子】 的 RK3568 开发板 Linux SDK&#xff0c;单独复制出来一份&#xff0c;手动编译 编译环境&#xff1a;VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

大模型面试准备(十七):深入理解 Transformer 技术原理

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

Vision GNN: An Image is Worth Graph of Nodes

感受野&#xff1a;在卷积神经网络中,感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。 感受野并非越大越好&#xff0c;反而可能因为过大而过于发散梯度下降&#xff08;Gradient Descent GD&am…

负载均衡的原理及算法简介

负载均衡&#xff08;Load Balancing&#xff09;是一种用于在多台服务器之间分配网络流量的技术&#xff0c;旨在优化系统资源利用率、提高服务可用性、增强系统的伸缩性和容错能力。其基本原理是将来自客户端的请求分散到一个服务器集群中的各个服务器上&#xff0c;而不是让…

python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习

学习目标&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 学习内容&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 …
最新文章