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

文章目录

1.后台管理---分页显示

1.程序框架图
2.编写数据模型
Page.java
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
增加方法
java 复制代码
    //获取记录总数
    public int getTotalRow();
    //获取当前页要显示的数据
    public List<Furn> getPageItems(int begin, int pageSize);
2.修改FurnDaoImpl
增加方法
java 复制代码
    /**
     * 获取总的记录条数
     *
     * @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
java 复制代码
    @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);
            }
        }
    }
4.编写service层
1.修改FurnService
增加方法
java 复制代码
    //6.根据传入的begin和pageSize返回对应的page对象
    public Page<Furn> page(int pageNo, int pageSize);
2.修改FurnServiceImpl
增加方法
java 复制代码
    /**
     * 根据传入的页号和每页的大小,返回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
5.编写DataUtils
增加方法
java 复制代码
    /**
     * 字符串转换为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
增加方法
java 复制代码
    /**
     * 处理分页请求
     * @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
8.修改furn_manage.jsp
9.结果展示
1.点击家居管理
2.只展示当前页的三个数据

2.后台分页导航

1.需求分析
2.完成底部分页
1.修改furn_manage.jsp
js 复制代码
        <!--  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页
2.末页只显示前面两页
3.首页只显示后面两页
3.完成修改家居后跳转原页面
1.修改furn_manage.jsp
2.修改furn_update.jsp
3.修改FurnServlet
更新updateFurn方法
java 复制代码
    /**
     * 读取表单信息,进行修改
     *
     * @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页
2.点击修改
3.回到第4页
4.完成删除家居后跳转原页面
1.修改furn_manage.jsp
2.修改FurnServlet
更新del方法
java 复制代码
    /**
     * 根据获取的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.删除前是第四页
2.删除后还是第四页
5.完成添加家居后跳转原页面
1.修改furn_manage.jsp
2.修改furn_add.jsp
3.修改FurnServlet
更新add方法
java 复制代码
    /**
     * 添加家居并重新获取家居信息,重定向到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页
2.添加家居后还是3页

3.首页分页

1.需求分析
2.分页显示家居
1.编写CustomerFurnServlet
CustomerFurnServlet.java
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
html 复制代码
<%--
  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
1.修改头部
2.遍历显示家居
3.分页导航条设置
修改index.jsp
4.单元测试
图片重复问题
原因
  1. 查询的时候直接查的所有数据,select *
  2. 但是javabean中的字段和imgPath 和 表中的字段img_Path不符,所以无法封装进去,就使用了之前设置的默认值
  3. 在查找的时候设置一个别名即可
5.结果展示
1.首页显示
2.分页导航条设置
相关推荐
jingshaoqi_ccc2 小时前
windows 10系统下QT的安装及在Visual studio中的扩展安装
windows·qt·visual studio
東雪木7 小时前
泛型、反射、注解(Spring 框架核心底层)专属复习笔记
java·windows·笔记·学习·spring
sun0077008 小时前
Windows下UniGetUI,Linux下敲命令
windows
流星白龙8 小时前
【MySQL高阶】18.缓冲池页管理
数据库·windows·mysql
AI行业学习10 小时前
PuTTY 工具下载部署、基础配置及 SSH 远程服务器连接完整操作指南Windows 平台 【2026.6.1】
运维·windows·ssh
tealcwu10 小时前
【Unity实战】Unity IAP 4.x 在 Windows Store (UWP) 平台上的实现指南
windows·unity·游戏引擎
爱讲故事的11 小时前
操作系统第四讲:OS Interfaces and Syscalls(操作系统接口与系统调用)
linux·windows·ubuntu
糖果店的幽灵12 小时前
LangChain 1.3 完全教程:从入门到精通-Part 10: Memory(记忆系统)
windows·microsoft·langchain
tealcwu13 小时前
【Unity实战】Unity IAP 5.3 中实现 Windows Custom Store 实战教程
windows·unity·游戏引擎
ZenosDoron14 小时前
vsnprintf可变参数格式化输出函数
windows