JavaWeb手写一个Servlet+JSP+JavaBean分页

Posted 請你喝杯Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb手写一个Servlet+JSP+JavaBean分页相关的知识,希望对你有一定的参考价值。

✅✅作者主页:🔗孙不坚1208的博客
🔥🔥精选专栏:🔗JavaWeb从入门到精通(持续更新中)
📋📋 本文摘要:本篇文章主要分享如何使用Servlet+JSP+JavaBean写一个分页。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞
👉 👉你的一键三连是我更新的最大动力❤️❤️

手写分页总结

运行环境:tomcat8.0+idea

技术:servlet+jsp+javabean+mysql

一、分页技术

1、前端分页

前端分页:一次性从数据库读出表的所有数据一次性的返回给客户端,由前端js来控制每一页的显示,由于一次性读出所有数据并返回给客户端,如果数据量庞大,这一次的动作可能是非常消耗服务器资源和带宽的,但是返回给客户端以后就非常轻松了,客户端在一段时间内不会再像服务器端请求资源。

2、后端分页

本文分页是后端分页实现的一种。

后端分页:由后端程序控制,每一次只返回一页大小的数据,返回并显示到客户端,优点的话就是减少单次查询数据库的时间,后端分页的方法需要频繁和服务器端进行交互,因为频繁交互,所以会给服务器带来负担。

二、实现分页

1、准备工作

在制作分页之前,首先需要了解,分页的属性有哪些?

  • 当前页数 currentPage
  • 总页数 totalPage
  • 总记录数 totalSize
  • 每页记录数 pageSize
  • 当前页数据 pageList
  • 等等…

我们可以将这些属性变成一个JavaBean中的属性来调用,并且实现一些分页相关的业务逻辑。

封装关于页数的数据:

请求数据: 当前页数 currentPage

响应数据: PageBean 类封装(包含上面我们说过的属性)

总页数 = (总记录数 % 每页记录数 == 0) ? (总记录数 / 每页记录数) : (总记录数 / 每页记录数 + 1);

当前页数据 list = query( select * from limit 每页记录数*(当前页数-1), 每页记录数 );

2、效果图

3、核心代码

bean PageBean.java

package com.sun.bean;

import com.sun.util.DBConnection;
import com.sun.util.Date_String;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author JumperSun
 * @date 2022-11-15-8:31
 */
public class PageBean<T> 
    private Integer currentPage; // 当前页数
    private Integer totalPage; // 总页数
    private Integer totalSize; // 总记录数
    private Integer pageSize; // 每页记录数
    private List<T> list; // 当前页数据 <T>

    public Integer getCurrentPage() 
        return currentPage;
    

    public void setCurrentPage(Integer currentPage) 
        this.currentPage = currentPage;
    

    public Integer getTotalPage() 
        return totalPage;
    

    public void setTotalPage(Integer totalPage) 
        this.totalPage = totalPage;
    

    public Integer getTotalSize() 
        return totalSize;
    

    public void setTotalSize(Integer totalSize) 
        this.totalSize = totalSize;
    

    public Integer getPageSize() 
        return pageSize;
    

    public void setPageSize(Integer pageSize) 
        this.pageSize = pageSize;
    

    public List<T> getList() 
        return list;
    

    public void setList(List<T> list) 
        this.list = list;
    

    // 分页总数
    public int size()throws SQLException 
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try 
            conn = DBConnection.getConnection();
            String sql = "select count(*) from user";
            st = conn.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()) 
                return rs.getInt(1);
            
         finally 
            DBConnection.close(rs, st, conn);
        
        return 0;
    

    // 分页查询数据
    public List<UserBean> queryAllByLimit(int offset, int limit) throws SQLException 
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<UserBean> users=new ArrayList<UserBean>();
        try 
            conn = DBConnection.getConnection();
            String sql = "select * from user limit " + offset + "," + limit;
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()==true)
                UserBean tmp=new UserBean();
                tmp.setUserid(rs.getInt("id"));
                tmp.setUsername(rs.getString("name"));
                tmp.setPassword(rs.getString("password"));
                tmp.setSex(rs.getString("sex"));
                tmp.setAge(rs.getInt("age"));
                String birthday= Date_String.getStringDate1(rs.getDate("birthday"));
                tmp.setBirthday(birthday);
                users.add(tmp);
            
         finally 
            DBConnection.close(rs, ps, conn);
        
        return users;
    

    // 分页查询处理
    public void selectUserListByPage(Integer currentPage, PageBean<UserBean> pageBean) throws SQLException 
        // 当前页数
        pageBean.setCurrentPage(currentPage);
        // 总记录数
        Integer totalSize = pageBean.size();
        pageBean.setTotalSize(totalSize);
        // 每页记录数
        Integer pageSize = 3;
        pageBean.setPageSize(pageSize);
        // 总页数(没余数为整页,有余数页数+1)
        Integer totalPages = null;
        if (totalSize != null) 
            totalPages = (totalSize%pageSize==0) ? (totalSize/pageSize) : (totalSize/pageSize+1);
        
        if(totalPages != null) 
            pageBean.setTotalPage(totalPages);
        
        // 当前页数据
        List<UserBean> list = queryAllByLimit(pageSize*(currentPage-1), pageSize);
        pageBean.setList(list);
    

Servlet GetUserListByPage.java

package com.sun.servlet;

import java.io.IOException;
import java.sql.SQLException;

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 com.sun.bean.PageBean;
import com.sun.bean.UserBean;

@WebServlet("/getUserListByPage")
public class GetUserListByPage extends HttpServlet 
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
		String currentPageStr = request.getParameter("currentPage");
		Integer currentPageNum = getCurrentPage(currentPageStr);

		PageBean<UserBean> pageBean = new PageBean<>();
		try 
			pageBean.selectUserListByPage(currentPageNum,pageBean);
		 catch (SQLException e) 
			e.printStackTrace();
		
		request.setAttribute("pageBean", pageBean);
		request.getRequestDispatcher("/Main.jsp").forward(request,response);
	

	private Integer getCurrentPage(String currentPagestr) 
		if (null == currentPagestr) 
			currentPagestr = "1";
		
		return Integer.valueOf(currentPagestr);
	

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
		doGet(request, response);
	


jsp Main.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage="../error.jsp" %>
<%@ page import="java.util.List" %>
<%@ page import="com.sun.bean.UserBean" %>
<%@ page import="com.sun.bean.PageBean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/style.css"/>
    <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/common.css"/>
</head>
<body>
<div class="content">
    <jsp:useBean id="pageBean" class="com.sun.bean.PageBean" scope="request"/>
    <table class="mtable2">
        <h3 style="margin-bottom: 0">学生列表</h3>
        <form action="$pageContext.request.contextPath/getUserListByPageLike" method="post">
            学生名:<input type="text" name="username" value="$param.username"/>&nbsp;&nbsp;
            性别:<input type="text" name="sex" value="$param.sex"/>
            <input type="submit" value="查询"/>
            <input type="reset" value="重置">
        </form>
        <tr>
            <th>学生id</th>
            <th>学生名</th>
            <th>密码</th>
            <th>性别</th>
            <th>年龄</th>
            <th>出生日期</th>
            <th>操作</th>
        </tr>
        <c:forEach items="$pageBean.list" var="user">
            <tr>
                <td>$user.getUserid()</td>
                <td>$user.getUsername()</td>
                <td>$user.getPassword()
                </td>
                <td>$user.getSex()
                </td>
                <td>$user.getAge()
                </td>
                <td>$user.getBirthday()
                </td>
                <td>
                    <a href="user/UpdateUser.jsp?userid=$user.getUserid()">修改</a>&nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="user/DelUser_do.jsp?userid=$user.getUserid()">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    <div class="fenye">
        第$pageBean.currentPage/$pageBean.totalPage页
        总记录数:$pageBean.totalSize条
        每页$pageBean.pageSize条
        <c:if test="$pageBean.currentPage != 1">
            <a href="$pageContext.request.contextPath/getUserListByPageLike?currentPage=1">
                [首页]
            </a>
            <a href="$pageContext.request.contextPath/getUserListByPageLike?currentPage=$pageBean.currentPage-1">
                [上一页]
            </a>
        </c:if>
        <c:if test="$pageBean.currentPage != pageBean.totalPage">
            <a href="$pageContext.request.contextPath/getUserListByPageLike?currentPage=$pageBean.currentPage+1">
                [下一页]
            </a>
            <a href="$pageContext.request.contextPath/getUserListByPageLike?currentPage=$pageBean.totalPage">
                [尾页]
            </a>
        </c:if>
    </div>
</div>
</body>
</html>

此致,一个分页就写完了。

手写Servlet 到 Spring MVC 的简化之路

背景

Servlet和JSP是开发Java Web应用程序的两种基本技术,Spring MVC是Spring框架中用于开发Web应用的一个模块。相信大家也和我一样,是从编写Servelt和JSP开始,然后一步步向Spring MVC靠拢。那么Spring MVC到底简化了Servlet什么地方,使Spring MVC成为Web应用开发的首选框架呢,本文将会就这个方面进行探讨。

Servlet简介

什么是Servlet

Servlet是一种基于Java语言,用于创建Web应用程序。在Servlet之前,CGI(通用网关接口)脚本语言作为服务端编程语言很受欢迎,但是这门技术有很多的缺点:

  • CGI(通用网关接口)CGI即使可以让服务器能够调用外部程序,并将HTTP请求信息传递给外部程序处理,对于每一个请求,会启动一个新的进程。

  • CGI技术的缺点


  1. 客户端数量增加时,响应时间更多

  2. 每一个其请求,需要启动一个新的进程,消耗大量的系统资源

  3. 使用平台依赖语言,如:C、C++、Perl

  • Servlet

  • Servlet的优点

  • 手写Servlet 到 Spring MVC 的简化之路

  1. 更好的性能:每个请求创建的是线程,而不是进程

  2. 可移植性:使用Java跨平台语言

  3. 更强大:Servlet有JVM管理,不需要担心内存泄露、溢出等


Servlet的演化

  • Servlet的基本目录

  • Servlet接口在最基本的Servlet类中,需要实现Servlet接口定义的init()、servic()、destroy()、getServletConfig()和geServletInfo()方法,其中业务逻辑在service中编写,在service方法中最常用的是通过PrintWriter对象进行内容的输出。

手写Servlet 到 Spring MVC 的简化之路

  • 演进1:GenericServlet抽象类实现Servlet接口的时候必须将所有的方法实现,即使方法中没有任何代码。在GenericServlet抽象类的帮助下,只需要重写service方法即可。

  • 在tomcat/webapps目录下创建上述目录结构,所有HTML,静态文件直接保存在应用程序目录下,所有的Servlet类保存在web-inf/classe目录或子目录下,web.xml(部署描述符)文件保存在web-inf目录下。

  • 演进2:HttpServlet抽象类HttpServlet覆盖了GenericServlet类,将ServletRequest和ServletResponse对象分别封装为HttpServletRequest和HttpServletResponse对象。HttpServlet同时实现了service方法,在请求进来时,Web容器首先调用HttpServlet的service方法,并根据请求的类型调用doGet或doPost方法,搜易我们只需要覆盖doGet()和goPost()方法即可。

演进3:JSP的加入

写过Servlet的朋友应该知道,Servlet的最大缺点就是在Servlet类中编写大量繁杂的HTML代码,使得Java代码与HTML代码糅杂在一起,所以JSP应运而生。

JSP本质也是Servelt,然而其不需要编译,JSP页面是一个以.jsp扩展名的文本文件。简单的JSP页面在第一次请求后被翻译为(JSP名)_jsp的servlet,翻译之后的Servelt可以看到:_jspInit(),_jspDestory(),_jspService()这样的方法其实都是和Servlet相对应的。

演进4:Spring横空出世

Spring提供了强大的控制反转(IOC)和依赖注入(DI)功能,达到项目组件的解耦。

演进5:Spring Web模块 - Spring MVC

学过Servlet的朋友应该知道,当要使用Servlet完成的复杂的功能时,需要编写多个Servlet类,并且在web.xml进行注册,这对于完成复杂的Web应用,代码编写会变得很复杂,开发成本也会很高。所以Spring提供了强大的Web开发框架Spring MVC。Spring MVC是Spring产品的一部分,享有Spring松耦合等所有优点。

Spring MVC是一个模型-视图-控制器的Web框架,建立在前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来返回响应结果。

Spring MVC的架构:

Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合

  • 模型(Model):封装了应用程序的数据,通常由POJO类组成

  • 视图(View):负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出

  • 控制器(Controller):负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染

DispatcherServlet组件类Spring MVC框架是围绕DispatcherServlet设计的,它处理所有的请求和响应。Spring MVC DispatcherServlet的工作流程:

DispatcherServlet处理HTTP请求的工作流程

  1. 接受HTTP请求后,DispatcherServlet

  2. 会查询HandlerMapping以调用相应的Controller(根据请求的url)

  3. Controller接受请求并根据请求的类型Get/Post调用相应的服务方法,服务方法进行相应的业务处理,并设置模型数据,最后将视图名称返回给DispatcherServlet

  4. DispatcherServlet根据返回的视图名称从ViewResolver获取对应的视图

  5. DispatcherServlet将模型数据传递到最终的视图,并将视图返回给浏览器。

总结

至此Servlet到Spring MVC的演化之路落下帷幕,只能感慨,技术的变更和迭代速度远远超乎我们的意料,我们只有不断地学习,才能跟上时代的潮流。


以上是关于JavaWeb手写一个Servlet+JSP+JavaBean分页的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb 技术文章 [他山之石]

JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Buil

JavaWeb之JSP

javaweb之JSP+Servlet

❀ 开发带数据的javaWeb项目的步骤:jdbc+servlet+jsp

JavaWeb--深入Servlet与JSP(运行原理)