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

文章目录

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.分页导航条设置
相关推荐
weixin_419349791 小时前
windows上安装python环境
windows
天上掉下来个程小白2 小时前
Stream流的中间方法
java·开发语言·windows
暮雪倾风2 小时前
【WPF开发】控件介绍-Grid(网格布局)
windows·wpf
sukalot4 小时前
windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)
c++·windows
大道归简4 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
没有余地 EliasJie5 小时前
Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT
pytorch·windows·深度学习·ubuntu·pycharm·conda·tensorflow
程序猿小D6 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
satan–06 小时前
R语言的下载、安装及环境配置(Rstudio&VSCode)
开发语言·windows·vscode·r语言
学习溢出7 小时前
深入了解 net user 命令:上一次是谁登录的?
windows·网络安全·系统安全
程序猿小D7 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa