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

news2024/11/25 21:33:53

文章目录

    • 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.coloradmin.cn/o/1600269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高录用-快速见刊】2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者&#xff0c;共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿研究成果&#xff0c;讨论数字技术在金融领域的应用与创新&#xff0c;并推动数…

HDLbits 刷题 --Mux2to1

Create a one-bit wide, 2-to-1 multiplexer. When sel0, choose a. When sel1, choose b. 译&#xff1a; 创建一个1位宽的2对1多路复用器。当sel0时&#xff0c;选择a。当sel1时&#xff0c;选择b。 个人解法&#xff1a; module top_module( input a, b, sel,output out …

尚鼎环境科技诚邀您参观2024第13届生物发酵展

参展企业介绍 尚鼎环境科技(江苏)有限公司设立于2010年&#xff0c;公司坐落于江南平原南端素有『苏北门户』之称的古城扬州&#xff0c;办公室位在江苏省扬州市邗江区高新技术创业服务中心。 尚鼎环境科技长年致力于食品精炼/环境工程领域全程技术服务&#xff0c;工程实绩遍…

车载摄像头畸变校正解决方案,打造无畸变高清视界

在车载摄像头日益普及的今天&#xff0c;摄像头图像的畸变问题成为了制约图像质量提升的一大瓶颈。畸变不仅影响画面的美观度&#xff0c;更关键的是它可能导致智能驾驶系统对环境的误判&#xff0c;进而威胁到行车安全。美摄科技凭借其在图像处理领域的深厚实力&#xff0c;推…

imgcat 工具

如果经常在远程服务器或嵌入式设备中操作图片&#xff0c;要查看图片效果&#xff0c;就要先把图片dump到本地&#xff0c;比较麻烦。可以使用这个工具&#xff0c;直接在终端上显示。类似于这种效果。 imgcat 是一个终端工具&#xff0c;使用 iTerm2 内置的特性&#xff0c;允…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 &#xff0c; System ILA 核已被废 弃。现在 &#xff0c; 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

Day42:动态规划 LeedCode 01背包 416. 分割等和子集

01背包 1.确定dp数组以及下标的含义 dp[i][j]的含义&#xff1a;从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少。 那么可以有两个方向推出来dp[i][j] 2.确定递推公式 不放物品i&#xff1a;由dp[i - 1][j]推出&#xff0c;即背…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司&#xff08;以下简称为“众乐邦”&#xff09;是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台&#xff08;以下简称为灵活用工管理平台&#xff09;&#xff0c;以财税服务视角切入灵活用工场景&#xff0c;连接企业、灵活就业者和监管…

Windows下使用PanguVip实现浮动IP

在某些高可用场景下&#xff0c;我们往往需要使用浮动IP来进行实际访问的切换&#xff0c;比如为了保证Web应用的高可用&#xff0c;当主节点宕机后&#xff0c;我们将浮动IP切换到备节点&#xff0c;那么备节点就继续可以提供服务&#xff0c;在linux下我们可以使用keepalived…

4.15号驱动

设备树 1. 设备树介绍 1.1 引入 在linux内核3.10版本之前&#xff0c;arm公司将驱动相关的硬件信息(地址、中断号、i2c从机地址)都存放在arch/arm目录 由于每一个设备都会对应一个文件&#xff0c;进行描述硬件的信息&#xff0c;这个目录下会存放大量的垃圾代码&#xff0…

aosp13/14命令行进入分屏相关实战

背景&#xff1a; 分屏一般在手机上都是都是从桌面的最近任务卡片进入的&#xff0c;一般来说手机用户都是这样操作的&#xff0c;但是有一些场景或者情况就不一定可以顺利用上这个桌面的多任务卡片进入。 比如以下场景&#xff1a; 1、可能不是桌面的多任务的场景&#xff0c…

c++入门 命名空间

文章目录 C入门命名空间域作用限定符域作用限定符操作C的域编译器的搜索原则命名空间域的展开命名空间的嵌套 C入门 命名空间 命名空间的存在&#xff1a;为了解决同域中起名字冲突的问题 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、…

使用Python实现文字识别,教你如何从图片中识别提取文字

今天分享的是如何使用Python从图片中提取文字。虽然从我的实际操作结果来看第三方库的图片文字识别效果并不是十分理想&#xff0c;但也能满足我的需求了。 首先&#xff0c;我们需要知道Python中两个非常重要的库&#xff1a;Pillow和Tesseract-OCR。Pillow是一个免费开源的图…

类与对象(中

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.3 总结 三、析构函数 3.1 概念 3.2 特性 3.3 总结 四. 拷贝构造函数 4.1 概念 4.2 特征 4.3 总结 五.赋值运算符重载 5.1 运算符重载 5.2 赋…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具&#xff1a;socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息&#xff0c;它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息&#xff0c;而且比 netsta…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

【HCIP】OSPF的高级特性

OSPF的高级特性1 --- 不规则区域 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由…

自学Java的第二十四次笔记

一,方法重载 1.基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a; System.out.println(); out 是 PrintStream 类型 2.重载的好处 1) 减轻了起名的麻烦 2) 减轻了记名的麻烦 3.快速入门案…