记录一个咸鱼大学生三个月的奋进生活034

  • JavaWeb的增删改查分页功能实现
    • 前期准备工作(数据库连接类和实体类)
      • 数据库建立
      • 数据库连接类(DBManager)
      • 书籍信息的实体类(Book)
      • 操作数据库的DAO接口(IDao.java)
    • 显示所有书籍信息功能的实现
      • DAO实现类中的list方法返回数据库中所有书籍信息对象的集合
      • 执行显示操作的Servlet(ListServlet)
      • 显示所有书籍信息的页面(list.jsp)
    • 增加书籍信息功能的实现
      • 增加书籍信息的页面(save.jsp)
      • DAO实现类中的save方法保存书籍信息到数据库部分
      • 执行保存操作的Servlet(SaveServlet)
    • 删除书籍信息功能的实现
      • DAO实现类中的del方法在数据库中删除书籍信息
      • 执行删除操作的Servlet(DelServlet)
    • 更新书籍信息功能的实现
      • DAO实现类中的findById方法在数据库中根据点击的书籍id查找该书籍对象
      • 执行查询操作的Servlet(FindByIdServlet)
      • DAO实现类中的update方法在数据库中更新书籍信息
      • 执行更新操作的Servlet(UpdateServlet)
      • 更新书籍信息的页面(update.jsp)
    • 分页功能的实现
      • 分页要用到数据实体类(Pager)
      • DAO中的获取全部书籍数量以及每页需要显示的书籍对象集合方法
      • 执行分页操作的Servlet(PagerServlet)
      • 分页显示书籍信息的页面(pager.jsp)
    • 代码分享
  • 学习Java面试题(Session 和 Cookie 的基础概念)
  • 照片分享

JavaWeb的增删改查分页功能实现

  前几篇文章中已经讲了很多JavaWeb中 Servlet 以及 Jsp 的相关用法,现在也是该实践的时候了,那我们先来写一个简单的书籍信息管理系统
  具体实现过程如下图,大家先大体了解一下然后配合着下面的代码一起看更容易理解:

前期准备工作(数据库连接类和实体类)

数据库建立

数据库连接类(DBManager)

package com.jinzhi.db;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** * @ClassName: DBManager* @Description: TODO(数据访问类DBManager)* @author: 22345* @date: 2021年6月4日 下午7:53:59* @version: V1.0*/
public class DBManager {protected Connection conn;       // 数据库连接private Statement st;private PreparedStatement ps;    // 执行protected ResultSet rs;          // 结果/*** * @Title: getConn* @Description: TODO(用getConn方法获取数据库连接的conn对象)* @author: 22345* @param: @return 参数* @return: Connection 返回类型* @throws:*/public Connection getConn(){        try {//1.加载驱动Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//2.获取连接,设置请求地址,账号,密码conn = DriverManager.getConnection("jdbc:sqlserver://localhost:端口号;dataBaseName=数据库名","账号","密码");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("数据库连接成功!");return conn;}/*** * @Title: closeAll* @Description: TODO(关闭数据库连接方法)* @author: 22345* @param:  参数* @return: void 返回类型* @throws:*/public void closeAll(){try {if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(conn!=null){conn.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 预编译sql* select * from table where name='"+name+"' and age="+age;    注意!这样拼接sql容易被sql注入* select * from table where name=? and age=?                  这样就不会被sql注入* @Title: query* @Description: TODO(这里用一句话描述这个方法的作用)* @author: 22345* @param: @param sql* @param: @return 参数* @return: ResultSet 返回类型* @throws:* 对象数组 {@link Object [] obj* 可变参数:可以变化的参数,可变参数就是一个对象数组,必须写在方法的最后一位,一个方法中只能有一个可变参数* 可变参数也可以没有,可有可无,但是必须最后一位,且只能有一位* select * from table */public ResultSet query(String sql,Object...objects){     // 这个objects就是可变参数conn = getConn();// 预编译sqltry {ps = conn.prepareStatement(sql);// 记住这段代码!!!会常用!!!if(objects!=null&&objects.length>0){// 如果objects可变参数是有内容的for (int i = 0; i < objects.length; i++) {ps.setObject(i+1, objects[i]);}}rs = ps.executeQuery();      // 不管有没有参数都要查询} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return rs;}/*** * @Title: update* @Description: TODO(增删改操作数据库)* @author: 22345* @param: @param sql* @param: @param objects* @param: @return 参数* @return: int 返回类型* @throws:*/public int update(String sql,Object...objects){     // Object...objects是可变参数,到时候调用方法时传进来的参数个数不确定int count = 0;conn = getConn();try {ps = conn.prepareStatement(sql);// 记住这段代码!!!会常用!!!if(objects!=null&&objects.length>0){for (int i = 0; i < objects.length; i++) {ps.setObject(i+1, objects[i]);}}count = ps.executeUpdate();      // 执行更新sql} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{closeAll();}return count;}// 主函数实例化dbManager建立连接public static void main(String[] args) {DBManager db = new DBManager();System.out.println(db.getConn());}}

书籍信息的实体类(Book)

package com.jinzhi.bean;// 数据库中的book表的实体类public class Book {private int id;private String name;private float price;private String author;private String context;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getContext() {return context;}public void setContext(String context) {this.context = context;}public Book(int id, String name, float price, String author, String context) {super();this.id = id;this.name = name;this.price = price;this.author = author;this.context = context;}public Book() {super();}public Book(String name, float price, String author, String context) {super();this.name = name;this.price = price;this.author = author;this.context = context;}public Book(String name, float price, String author) {super();this.name = name;this.price = price;this.author = author;}}

操作数据库的DAO接口(IDao.java)

package com.jinzhi.dao;// 增删改查方法的接口import java.io.Serializable;
import java.util.List;public interface IDao<T> {public void save(T t);public void update(T t);public void del(Serializable id);           // Serializable作为数据类型就可以接收到各种类型的参数,例如:String、Long、int、Floatpublic T findById(Serializable id);public List<T> list();}

显示所有书籍信息功能的实现

DAO实现类中的list方法返回数据库中所有书籍信息对象的集合

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {// 返回t_book信息表里的所有对象的集合@Overridepublic List<Book> list() {String sql = "select * from t_book";rs = query(sql);List<Book> lstBook = new ArrayList<>();try {// 将查到的所有书的信息赋给Book对象的实例,然后再添加进lstBook集合中while(rs.next()){Book book  = new Book(rs.getInt("id"), rs.getString("name"), rs.getFloat("price"), rs.getString("author"), rs.getString("context"));lstBook.add(book);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{closeAll();}return lstBook;}}

执行显示操作的Servlet(ListServlet)

package com.jinzhi.web;// 调用查询数据库中所有书籍数据的方法然后把查到的所有书籍数据的对象传给list.jsp显示界面import java.io.IOException;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.bean.Book;
import com.jinzhi.dao.BookDao;/*** Servlet implementation class ListServlet*/
public class ListServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public ListServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置中文编码request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 调用BookDao中的list方法获取书籍数据库里所有数据的对象BookDao bookDao = new BookDao();List<Book> lstBook = bookDao.list();// 存放所有的书籍数据对象,然后请求转发发送到list.jsp显示页面request.setAttribute("lstBook", lstBook);request.getRequestDispatcher("list.jsp").forward(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

显示所有书籍信息的页面(list.jsp)

<%@page import="com.jinzhi.bean.Book"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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">
<title>显示信息页面</title>
</head>
<body><div align="center"><table border="1" cellpadding="0" cellspacing="0" width="70%"><caption>图书列表</caption><tr><th>图书名称</th><th>图书价格</th><th>图书作者</th><th>操作</th></tr><%// 获取刚才ListServlet穿过来的lstBook所有书籍数据对象的集合List<Book> lstBook = (List<Book>)request.getAttribute("lstBook");for(Book b:lstBook){        // 注意这里的写法,遍历集合时用两个Java代码块把jsp代码包住%><tr align="center"><td><%=b.getName() %></td><td><%=b.getPrice() %></td><td><%=b.getAuthor() %></td><!-- 下面是进行删除和更新操作的按钮,点击跳转时还要将点击的书籍数据对象中的ID传过去 --><td><a href="DelServlet?id=<%=b.getId()%>" onclick="return confirm('确认要删除吗?')">删除</a><a href="FindByIdServlet?id=<%=b.getId()%>">更新</a></td></tr>     <%} %></table>
</div>
<a href="save.jsp">跳转到保存页面</a>
</body>
</html>

显示书籍信息页面效果:


增加书籍信息功能的实现

增加书籍信息的页面(save.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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">
<title>保存信息页面</title>
</head>
<body><div align="center"><!-- 将表单填写的数据通过post请求发送给SaveServlet --><form action="SaveServlet" method="post">图书名称<input name="name"><br/>图书价格<input name="price"><br/>图书作者<input name="author"><br/><input type="submit" value="保存"></form>
</div>
</body>
</html>

保存书籍信息页面效果:

DAO实现类中的save方法保存书籍信息到数据库部分

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {// 增加数据的save方法@Overridepublic void save(Book t) {// 这个sql增加语句的写法请注意:insert into 表名(name,price,author,context) values(?,?,?,?)String sql = "insert into t_book(name,price,author,context) values(?,?,?,?)";// 获取传入对象的四个属性,然后调用DBManager中的update方法,将sql语句和需要进行操作的四个数据传入int count = update(sql, t.getName(),t.getPrice(),t.getAuthor(),t.getContext());if(count>0){System.out.println("保存成功");}else{System.out.println("保存失败");}}}

执行保存操作的Servlet(SaveServlet)

package com.jinzhi.web;// 执行save.jsp传入数据的保存功能,完成之后跳转至ListServlet查询所有数据信息再跳转至list.jsp进行显示import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.bean.Book;
import com.jinzhi.dao.BookDao;/*** Servlet implementation class SaveServlet*/
public class SaveServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public SaveServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub// 设置中文编码request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 获取save.jsp的表单传过来的数据String name = request.getParameter("name");float price = Float.parseFloat(request.getParameter("price"));            // 这里还要把从表单获取到的数据从字符型强转为float类型String author = request.getParameter("author");// 封装到一个Book对象的实例中Book book = new Book(name, price, author);BookDao bookDao =  new BookDao();bookDao.save(book);// 跳转到列表显示页面,jsp的里面还没有数据,servlet要先去查询数据,然后查询完成后才转发到显示数据的jsp,这里不能直接跳转至list.jsp页面,不然会显示不出东西response.sendRedirect("ListServlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

删除书籍信息功能的实现

DAO实现类中的del方法在数据库中删除书籍信息

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {// 删除数据的del方法@Overridepublic void del(Serializable id) {// 这个sql删除语句的写法请注意:delete from 表名 where id = ?String sql = "delete from  t_book where id = ?";int count = update(sql, id);if(count>0){System.out.println("删除成功");}else{System.out.println("删除失败");}}}

执行删除操作的Servlet(DelServlet)

package com.jinzhi.web;// 执行的是list.jsp页面点击删除链接后进行的删除操作import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.dao.BookDao;/*** Servlet implementation class DelServlet*/
public class DelServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public DelServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 获取的是list.jsp文件中a href="DelServlet?id=<%=b.getId()%>" 这里设置的id属性值String id = request.getParameter("id");// 调用BookDao中的del方法将刚获取的id值传入进行数据删除new BookDao().del(Integer.parseInt(id));// 然后删除了再重定向回ListServlet进行list.jsp的显示以及跳转功能response.sendRedirect("ListServlet");// 然后删除了再重定向回PagerServlet进行pager.jsp的显示以及跳转功能
//      response.sendRedirect("PagerServlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

删除书籍最终效果:


更新书籍信息功能的实现

  大家在最开始的功能实现流程图中也看到了,其实更新功能是 先进行FindById查询 根据点击的书籍 查询到该书籍的对象 然后显示到更新页面后 修改信息后再执行update保存到数据库

DAO实现类中的findById方法在数据库中根据点击的书籍id查找该书籍对象

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {// 根据id查找数据返回对象的findById方法@Overridepublic Book findById(Serializable id) {String sql = "select * from t_book where id=?";rs = query(sql, id);Book book = null;try {// 将查到的所有信息赋给Book对象的实例while(rs.next()){book = new Book(rs.getInt("id"), rs.getString("name"), rs.getFloat("price"), rs.getString("author"), rs.getString("context"));}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{closeAll();}return book;}}

执行查询操作的Servlet(FindByIdServlet)

package com.jinzhi.web;// 根据Id查找书籍信息对象的Servlet,根据在list.jsp页面点击书籍时传入的id来查找该书籍的所有信息,查到之后把这个对象带到update.jsp
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.bean.Book;
import com.jinzhi.dao.BookDao;/*** Servlet implementation class FindByIdServlet*/
public class FindByIdServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public FindByIdServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");BookDao bookDao = new BookDao();// 获取在list.jsp页面传入的点击书籍的idint id = Integer.parseInt(request.getParameter("id"));// 通过调用dao里的findById方法将查到的book对象得到Book book = bookDao.findById(id);// 用请求转发将查到的book对象传到update.jsp更新页面request.setAttribute("book", book);request.getRequestDispatcher("update.jsp").forward(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

DAO实现类中的update方法在数据库中更新书籍信息

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {// 更新数据的update方法@Overridepublic void update(Book t) {// 这个sql修改语句的写法请注意:update 表名 set name=?,price=?,author=?,context=? where id=?String sql = "update t_book set name=?,price=?,author=?,context=? where id=?";int count = update(sql, t.getName(),t.getPrice(),t.getAuthor(),t.getContext(),t.getId());if(count>0){System.out.println("更新成功");}else{System.out.println("更新失败");}}}

执行更新操作的Servlet(UpdateServlet)

package com.jinzhi.web;// 该类是进行书籍信息修改的Servlet,获取的是来自update.jsp的修改信息import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.bean.Book;
import com.jinzhi.dao.BookDao;/*** Servlet implementation class UpdateServlet*/
public class UpdateServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public UpdateServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 获取需要修改的书籍信息String name = request.getParameter("name");float price = Float.parseFloat(request.getParameter("price"));String author = request.getParameter("author");int id = Integer.parseInt(request.getParameter("id"));// 将该书籍信息存到一个book对象中,然后调用DAO中的update方法进行修改Book book = new Book(name, price, author);book.setId(id);BookDao bookDao =  new BookDao();bookDao.update(book);// 跳转至列表显示的Servlet,不能直接跳转到list.jsp因为里面没有数据,要先跳转至servlet去查询数据,然后查询完成后转发到list.jspresponse.sendRedirect("ListServlet");// 更新完成了再重定向回PagerServlet进行pager.jsp的显示以及跳转功能
//      response.sendRedirect("PagerServlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

更新书籍信息的页面(update.jsp)

<%@page import="com.jinzhi.bean.Book"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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">
<title>更新信息页面</title>
</head>
<body><div align="center"><!-- 将表单填写的数据通过post请求发送给UpdateServlet --><form action="UpdateServlet" method="post"><%Book book = (Book)request.getAttribute("book");%><input type="hidden" name="id" value="<%=book.getId() %>">          <!-- 注意这里是要获取该书籍的id值的,因为之后进行修改操作时要通过id知道修改的是哪个书籍的,但是可以隐藏起来 -->图书名称<input name="name" value="<%=book.getName() %>"><br/>图书价格<input name="price" value="<%=book.getPrice() %>"><br/>图书作者<input name="author" value="<%=book.getAuthor() %>"><br/><input type="submit" value="修改"></form>
</div>
</body>
</html>

更新书籍最终效果:


分页功能的实现

分页要用到数据实体类(Pager)

这个实体类中有着实现分页要用到的各种属性:
nowPage —— 当前页
sumRow —— 总记录数
pageSize —— 每页显示多少条
sumPage —— 总页数
pageData —— 当前页应该存的书籍对象集合

package com.jinzhi.bean;// 这是分页要用到的所有数据,在BookDao中的设置分页功能时会用到import java.util.List;public class Pager<T> {private int nowPage;                 // 当前页private int sumRow;                  // 总记录数private int pageSize = 5;            // 每页显示多少条private int sumPage;                 // 总页数private List<T> pageData;            // 当前页应该存的书籍数据public int getNowPage() {return nowPage;}public void setNowPage(int nowPage) {this.nowPage = nowPage;}public int getSumRow() {return sumRow;}public void setSumRow(int sumRow) {this.sumRow = sumRow;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getSumPage() {return sumPage;}public void setSumPage(int sumPage) {this.sumPage = sumPage;}public List<T> getPageData() {return pageData;}public void setPageData(List<T> pageData) {this.pageData = pageData;}}

DAO中的获取全部书籍数量以及每页需要显示的书籍对象集合方法

package com.jinzhi.dao;import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.db.DBManager;public class BookDao extends DBManager implements IDao<Book> {/*** * @Title: sumRow* @Description: TODO(获取全部书籍数)* @author: 22345* @param: @return 参数* @return: int 返回类型* @throws:*/public int sumRow(){int sumrow = 0;// 该sql语句的意思是获取book表中的数据行数,然后把值赋给数据库中sumRow属性rs = query("select count(*) as sumRow from t_book");try {if(rs.next()){// 在这里获取数据库中存的sumRow属性sumrow = rs.getInt("sumRow");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{closeAll();}return sumrow;}/*** @Title: pager* @Description: TODO(返回每一页应该显示的书籍数据对象,第一页的就是返回0-5的书籍,第二页的就是返回6-10的书籍)* @author: 22345* @param: @param nowPage* @param: @param pageSize* @param: @return 参数* @return: Pager<Book> 返回类型* @throws:*/public Pager<Book> pager(int nowPage,int pageSize){Pager<Book> pager = new Pager<>();// 得到总记录数sumRowint sumRow = sumRow();// 得到总页数sumPageint sumPage = sumRow%pageSize==0?sumRow/pageSize:sumRow/pageSize+1;// 如果当前页面等于总页数,那就不能再跳转至下一页if(nowPage>sumPage){nowPage=sumPage;}// 如果当前页面是第一页,那就不能再跳转至上一页if(nowPage<1){nowPage=1;}// 这里的start代表的是数据从第几个后开始int start = (nowPage-1)*pageSize;// 这个sql语言是 从start值后的开始然后显示book表中的pageSize数的书籍数据,例如:显示从第0个后的5个String sql = "select top "+pageSize+" * from t_book where id not in(select top "+start+" id from t_book)";rs = query(sql);// 把查到的书籍数据对象赋值给lstBook集合List<Book> lstBook = new ArrayList<>();try {while(rs.next()){Book book  = new Book(rs.getInt("id"), rs.getString("name"), rs.getFloat("price"), rs.getString("author"), rs.getString("context"));lstBook.add(book);}pager.setNowPage(nowPage);pager.setSumRow(sumRow);pager.setPageSize(pageSize);pager.setSumPage(sumPage);pager.setPageData(lstBook);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{closeAll();}return pager;}
}

执行分页操作的Servlet(PagerServlet)

package com.jinzhi.web;// 用于将书籍信息分页显示import java.io.IOException;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.jinzhi.bean.Book;
import com.jinzhi.bean.Pager;
import com.jinzhi.dao.BookDao;/*** Servlet implementation class PagerServlet*/
public class PagerServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public PagerServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");// 获取给的当前应该在的页数值给npageString nowPage = request.getParameter("nowPage");int npage=1;try {npage = Integer.parseInt(nowPage);} catch (NumberFormatException e) {// 当获取不到nowPage时,也就是第一次访问分页页面pager.jsp时,要给npage设置默认值1,不然会报错显示不出来npage=1;}// 调用BookDao中的pager方法,将第一个参数nowPage和第二个参数pageSizeBookDao bookDao = new BookDao();// 获取应该显示的书籍信息数据集合Pager<Book> pagerBook = bookDao.pager(npage, 5);// 存放pagerBook数据,然后转发到显示页面pager.jsprequest.setAttribute("pagerBook", pagerBook);request.getRequestDispatcher("pager.jsp").forward(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

分页显示书籍信息的页面(pager.jsp)

<%@page import="com.jinzhi.bean.Pager"%>
<%@page import="com.jinzhi.bean.Book"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!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">
<title>分页显示信息页面</title>
</head>
<body><div align="center"><table border="1" cellpadding="0" cellspacing="0" width="70%"><caption>图书列表</caption><tr><th>图书名称</th><th>图书价格</th><th>图书作者</th><th>操作</th></tr><%// 获取设置的书籍信息分页要用的信息对象pagerBookPager<Book> pagerBook = (Pager<Book>)request.getAttribute("pagerBook");// 获取需要显示的pagesize(5个)书籍信息对象的lstBook集合List<Book> lstBook =pagerBook.getPageData() ;// 遍历lstBook集合for(Book b:lstBook){%><!-- 显示区域 --><tr align="center"><td><%=b.getName() %></td><td><%=b.getPrice() %></td><td><%=b.getAuthor() %></td><td><a href="DelServlet?id=<%=b.getId()%>" onclick="return confirm('确认要删除吗?')">删除</a><a href="FindByIdServlet?id=<%=b.getId()%>">更新</a></td></tr> <%} %></table><!-- 显示设置的书籍信息分页要用的信息对象pagerBook中的各种信息,nowPage:当前页,sumRow:总记录数,pageSize:每页显示多少条,sumPage:总页数-->共<%=pagerBook.getSumRow() %>条记录,每页显示<%=pagerBook.getPageSize() %>条,当前第<%=pagerBook.getNowPage() %>页,共<%=pagerBook.getSumPage() %>页<br/><!-- 跳转页面实现只需要将nowPage值更改后传给PagerServlet就可以 --><a href="PagerServlet?nowPage=1">首页</a><a href="PagerServlet?nowPage=<%=pagerBook.getNowPage()-1%>">上一页</a><a href="PagerServlet?nowPage=<%=pagerBook.getNowPage()+1%>">下一页</a><a href="PagerServlet?nowPage=<%=pagerBook.getSumPage()%>">尾页</a>
</div>
<a href="save.jsp">跳转到保存页面</a>
</body>
</html>

分页显示书籍最终效果:


所有的代码都已经结束,大家可以再回顾一下这个功能流程实现图,再加深理解一下Javaweb是如何实现这整个过程的:

代码分享

这个项目虽然很小,但是作为初学Javaweb的练手项目可以说是再合适不过了,有需要的同学可以到我的github去下载:简单书籍信息管理项目代码

学习Java面试题(Session 和 Cookie 的基础概念)

指路陈哈哈大佬的网络编程相关面试题原帖

照片分享

作者:Hossein Zare   作品名:Rise Of Darkness  出自500px社区
2021.09.26  by wyh

复习JavaWeb的小项目书籍信息的增删改查分页功能实现Java面试题Session和Cookie的基础概念生活【记录一个咸鱼大学生三个月的奋进生活】034相关推荐

  1. 复习Java第一个项目学生信息管理系统 04(权限管理和动态挂菜单功能) python简单爬数据实例Java面试题三次握手和四次挥手生活【记录一个咸鱼大学生三个月的奋进生活】016

    记录一个咸鱼大学生三个月的奋进生活016 复习Java(学生信息管理系统04权限管理和动态挂菜单功能) 改写MainFrame的构造方法 新增LoginFrame的验证登录是否成功的代码 新增Logi ...

  2. 复习Java第一个项目学生信息管理系统 01(界面部分) Java面试题抽象类和接口生活【记录一个咸鱼大学生三个月的奋进生活】013

    记录一个咸鱼大学生三个月的奋进生活013 复习Java(学生信息管理系统01界面部分) 设置背景(WelcomePanel)类 登录界面(LoginFrame)类 主界面(MainFrame)类 学习 ...

  3. 复习Java第二个项目仿QQ聊天系统 01(界面部分) Java面试题Redis的过期策略和内存淘汰策略生活【记录一个咸鱼大学生三个月的奋进生活】023

    记录一个咸鱼大学生三个月的奋进生活023 复习Java(仿QQ聊天系统01界面部分) 设置背景(ImgPanel)类 登录界面(LoginFrame)类 注册界面(RegisterFrame)类 好友 ...

  4. 复习Java第二个项目仿QQ聊天系统 03(两种通信类、登录以及注册功能完善) Java面试题并发编程相关知识生活【记录一个咸鱼大学生三个月的奋进生活】025

    记录一个咸鱼大学生三个月的奋进生活025 复习Java(仿QQ聊天系统03两种通信类.登录以及注册功能完善) TcpSocket类(与服务器进行通信) Server类(服务器类) TcpMessage ...

  5. 复习Java.Lang包Java面试题Vector、ArrayList、LinkedList区别生活【记录一个咸鱼大学生三个月的奋进生活】007

    记录一个咸鱼大学生三个月的奋进生活007 复习Java(Lang包) 数据包装类 字符类Character的常用方法 字符串类(String) StringBuffer类的常用方法 Math类的常用方 ...

  6. 复习Java类与对象Java字符串面试题生活【记录一个咸鱼大学生三个月的奋进生活】003

    记录一个咸鱼大学生三个月的奋进生活003 复习Java(类与对象) 学习Java面试题 初步规划软件测试课设 健身 照片分享 复习Java(类与对象) 既然要说类与对象那就要明确 面向对象 这个概念: ...

  7. 复习Java小球游戏代码分享Java面试题MySQL中常用的锁生活【记录一个咸鱼大学生三个月的奋进生活】021

    记录一个咸鱼大学生三个月的奋进生活021 复习Java小球游戏 游戏界面的代码 小球运动线程的代码 运行游戏的代码 运行结果 代码分享 学习Java面试题(MySQL中常用的锁) 照片分享 复习Jav ...

  8. 复习Java入门与基础语法生活【记录一个咸鱼大学生三个月的奋进生活】002

    复习Java(入门) 既然是入门那就必须讲个故事了:   其实Java是James Gosling为了跨平台而创造的,当时(1991年)SUN公司想在智能家电中大展宏图,结果发现想完成智能家电用C是不 ...

  9. 使用eclipse创建基于SSM+Maven的小项目(简单的增删改查)

    使用eclipse创建基于SSM+Maven的增删改查 开发环境 效果图 数据库 项目如下: 项目结构及pom.xml 资源文件夹 db.properties mybatis-config.xml a ...

最新文章

  1. Ruby Profiler详解之stackprof
  2. 开关电源异址替换实战割接
  3. Activiti工作流之业务标识和流程的挂起激活
  4. JMeter:报错(Content type 'text/plain;charset=UTF-8' not supported)
  5. VirtualBox 扩展win7虚拟硬盘容量
  6. 设计模式入门,工厂模式,c++代码实现
  7. IE7,iE6,超链接禁用失效解决方法
  8. 抢红包插件实现原理浅析
  9. 缠中说缠,最好用的缠论画笔和中枢的指标公式 通达信用
  10. sundancest201驱动_驱动支持列表
  11. Win7操作中心提示Windows安全中心服务无法启动怎么办
  12. 微信小程序图片预览禁止保存
  13. python应用程序无法正常启动0xc000007b_应用程序无法正常启动0xc000007b解决方法
  14. 产品经理全套入门学习资料,及各行业解析分享
  15. 软件附带有广告如何消除
  16. 初学oracle--join的整体实例说明
  17. 树莓派触摸屏显示旋转+触摸旋转
  18. h5py OSError: Unable to open file (unable to lock file, errno = 11, error message = ‘Resource tempor
  19. MSP430应用技巧4:创建MSP430Ware工程项目的方法
  20. 【04-25】力扣每日一题

热门文章

  1. 基于Unity3D的声音管理系统的实现
  2. CSS入门(网页皮肉)——知识汇总①
  3. 非饱和神经元(non-saturating neurons)
  4. Some Simple Models of Neurons
  5. .Net Mirco Framework 2007技术大会
  6. Java 正则表达式 Pattern和Matcher类 Math类 Random类 System类 BigDecimal类
  7. 直击2023云南移动生态合作伙伴大会,聚焦云南移动的“价值裂变”
  8. 单商户商城系统功能拆解28—营销中心—砍价活动
  9. 《清醒思考的艺术》——罗尔夫·多贝里
  10. 互联网首发 | 闲鱼程序员公开多年 Flutter 实践经验