构建高效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)!