自学内容网 自学内容网

构建高效Web应用:通过MVC(Servlet+JSP+JavaBean)实现基本分页功能

什么是mvc设计模式?

MVC设计模式,即Model-View-Controller(模型-视图-控制器)模式,是一种经典的软件设计模式,旨在将应用程序的输入、处理和输出分开,以实现数据、视图和控制逻辑之间的相互独立。MVC模式通过分离应用程序的这三个核心部分,并定义它们之间的交互方式,来提高代码的可扩展性、可复用性、可维护性和灵活性。

这里指的是(Servlet+JSP+JavaBean)的一种开发模式

  • Servlet:控制程序流程
  • JavaBean:实现业务逻辑层
  • JSP:负责数据显示

 前言

将原来的使用JSP+JavaBean的设计模式实现分页功能,转换成基于mvc设计模式实现分页功能,并且额外添加模糊搜索的功能实现

 JSP+JavaBean设计模式实现分页

请参考我的另外一篇博客JSP分页功能实现案例:从基础到应用的全面解析,这里不在重复赘述

 基于MVC设计模式实现分页功能

项目结构

因为是在原有的JSP分页功能的基础上改造的,因此不重复相同的逻辑实现

DAO层实现模糊查询和分页查询

UserDao

package dao;

import entity.User;

import java.util.List;

public interface UserDao {

    /**
     * 查看用户总条数
     * @return
     */
    int selectUsersCount();

    /**
     * 分页查询用户列表
     * @param pageIndex 当前页
     * @param pageSize 每页显示的条数
     * @param keyword 模糊搜索关键字
     * @return
     */
    List<User> selectUserListByPage(int pageIndex, int pageSize,String keyword);
}

UserDaoImpl

package dao.impl;

import dao.UserDao;
import entity.User;
import util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl extends DBUtil implements UserDao {
   private Connection conn=null;
   private PreparedStatement pstmt=null;
   private ResultSet rs=null;
    /**
     * 查看用户总条数
     *
     * @return
     */
    @Override
    public int selectUsersCount() {
        int count=0;
        try{
            //继承工具类中的方法,获取数据库连接
            conn=getConn();
            String sql="select count(user_id) from t_user";
            pstmt=conn.prepareStatement(sql);
            rs=pstmt.executeQuery();
            if (rs.next()){
                //返回单行单列数据
                count=rs.getInt(1);
            }

        }catch (SQLException e){
            e.printStackTrace();
        }
        //返回count
        return count;
    }

    /**
     * 分页查询用户列表
     * @param pageIndex 当前页
     * @param pageSize 每页显示的条数
     * @param keyword 模糊搜索关键字
     * @return
     */
    @Override
    public List<User> selectUserListByPage(int pageIndex, int pageSize,String keyword) {
        List<User> list =new ArrayList<>();
        try{
            conn=getConn();
            //带有模糊搜索的分页sql语句
            String sql= "select * from t_user where user_name like concat('%',?,'%') order by user_id desc limit ?,?";
            pstmt=conn.prepareStatement(sql);
            //分页查询
            //传入模糊搜索的关键字
            pstmt.setString(1,keyword);
            pstmt.setInt(2,pageSize*(pageIndex-1));
            pstmt.setInt(3,pageSize);
            rs=pstmt.executeQuery();
            while (rs.next()){
                User user =new User(rs.getInt(1),rs.getString(2),rs.getString(3));
                list.add(user);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return list;
    }
}

Servlet(控制层)接收页面请求,响应数据

UserPageServlet

进行模糊搜索和访问越界的逻辑处理,并将从处理之后的数据放在request中转发请求到前端页面。

package servlet;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import util.PageUtil;

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

@WebServlet("/userPage")
public class UserPageServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String keyword= request.getParameter("keyword");
        if (keyword==null){//当关键字为null时,设置为空,防止没有进行模糊查询时,sql失效
            keyword="";
        }
        String currentPage =request.getParameter("pageIndex");
        if (currentPage==null){//防止第一次访问servlet时,当前页为空,设置为第一页
            currentPage="1";
        }
        int pageIndex = Integer.parseInt(currentPage);
        UserDao userDao =new UserDaoImpl();
        int count = userDao.selectUsersCount();
        //总页数
       int totalPages= PageUtil.getTotalPages(count,PageUtil.PAGE_SIZE);
        //防止查询越界
        if (pageIndex<1){
            pageIndex=1;
        }
        if (pageIndex>totalPages){
            pageIndex=totalPages;
        }
      List<User> list= userDao.selectUserListByPage(pageIndex,PageUtil.PAGE_SIZE,keyword);
        //在request作用域设置值,仅在同一个请求中有效
        request.setAttribute("list",list);
        request.setAttribute("keyword",keyword);
        request.setAttribute("pageIndex",pageIndex);
        request.setAttribute("totalPages",totalPages);
        //转发当前请求到userList.jsp
        request.getRequestDispatcher("userList.jsp").forward(request,response);

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}

JSP(视图层),展示分页查询结果的页面

userList.jsp

<%@ page import="dao.UserDao" %>
<%@ page import="dao.impl.UserDaoImpl" %>
<%@ taglib prefix="jspCsx" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="util.PageUtil" %>
<%@ page import="java.util.List" %>
<%@ page import="entity.User" %><%--
  Created by IntelliJ IDEA.
  User: 21038
  Date: 2024/9/18
  Time: 10:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>分页查询</title>
</head>
<body>
<form action="userPage" method="post">
    <input type="text" size="30" name="keyword" placeholder="请输入搜索关键字">
    <input type="submit" value="搜索"/>
</form>
<table border="1px">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>操作</th>
    </tr>
    <!--利用jstl标签库中的标签,结合el表达式,简化操作-->
    <jspCsx:forEach items="${list}" var="user">
        <tr><!--el表达式-->
            <td>${user.userId}</td>
            <td>${user.userName}</td>
            <td>
                <a href="">修改</a>
                <a href="">删除</a>
            </td>
        </tr>
    </jspCsx:forEach>
    <tr>
        <td colspan="3">
            <!--动态传入url参数-->
            <a href="userPage?pageIndex=1">首页</a>
            <a href="userPage?keyword=${keyword}&pageIndex=${pageIndex-1}">上一页</a>
            <a href="userPage?keyword=${keyword}&pageIndex=${pageIndex+1}">下一页</a>
            <a href="userPage?pageIndex=${totalPages}">最后一页</a>
        </td>
    </tr>
</table>

</body>
</html>

注意

这里的jsp是基于JSTL标签库和el表达式来简化jsp的书写,因此需要完成以下几步操作,保证可以正常使用el表达和jstl标签

  • 在pom.xml中导入jstl依赖
  • 在jsp页面导入jstl
    • 这里的jspCsx是自定义的标签前缀名,可以自定义
  • 接下来就可以在jsp页面中使用el表达式了

 总结

主要实现了基于MVC设计模式实现分页功能的案例,以及在此基础上的模糊查询功能的实现,解决了在JSP+JavaBean设计模式中存在的一些问题。


原文地址:https://blog.csdn.net/weixin_52937170/article/details/142335289

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!