- 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中 Servlet 以及 Jsp 的相关用法,现在也是该实践的时候了,那我们先来写一个简单的书籍信息管理系统
具体实现过程如下图,大家先大体了解一下然后配合着下面的代码一起看更容易理解:
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;
public class DBManager {
protected Connection conn; // 数据库连接
private Statement st;
private PreparedStatement ps; // 执行
protected ResultSet rs; // 结果
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 block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("数据库连接成功!");
return conn;
}
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 block
e.printStackTrace();
}
}
public ResultSet query(String sql,Object...objects){ // 这个objects就是可变参数
conn = getConn();
// 预编译sql
try {
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 block
e.printStackTrace();
}
return rs;
}
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 block
e.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{ public void save(T t); public void update(T t); public void del(Serializable id); // Serializable作为数据类型就可以接收到各种类型的参数,例如:String、Long、int、Float public T findById(Serializable id); public List 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执行显示操作的Servlet(ListServlet){ // 返回t_book信息表里的所有对象的集合 @Override public List list() { String sql = "select * from t_book"; rs = query(sql); List 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 block e.printStackTrace(); }finally{ closeAll(); } return lstBook; } }
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;
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ListServlet() {
super();
// TODO Auto-generated constructor stub
}
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 lstBook = bookDao.list();
// 存放所有的书籍数据对象,然后请求转发发送到list.jsp显示页面
request.setAttribute("lstBook", lstBook);
request.getRequestDispatcher("list.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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"%>显示信息页面 跳转到保存页面
图书列表 <% // 获取刚才ListServlet穿过来的lstBook所有书籍数据对象的集合 List 图书名称 图书价格 图书作者 操作 lstBook = (List )request.getAttribute("lstBook"); for(Book b:lstBook){ // 注意这里的写法,遍历集合时用两个Java代码块把jsp代码包住 %> <% } %> <%=b.getName() %> <%=b.getPrice() %> <%=b.getAuthor() %> 删除 更新
显示书籍信息页面效果:
增加书籍信息功能的实现 增加书籍信息的页面(save.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>保存信息页面
保存书籍信息页面效果:
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执行保存操作的Servlet(SaveServlet){ // 增加数据的save方法 @Override public 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("保存失败"); } } }
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;
public class SaveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SaveServlet() {
super();
// TODO Auto-generated constructor stub
}
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");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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执行删除操作的Servlet(DelServlet){ // 删除数据的del方法 @Override public 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("删除失败"); } } }
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;
public class DelServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DelServlet() {
super();
// TODO Auto-generated constructor stub
}
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");
// 获取的是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");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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执行查询操作的Servlet(FindByIdServlet){ // 根据id查找数据返回对象的findById方法 @Override public 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 block e.printStackTrace(); }finally{ closeAll(); } return book; } }
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;
public class FindByIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FindByIdServlet() {
super();
// TODO Auto-generated constructor stub
}
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页面传入的点击书籍的id
int 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);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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执行更新操作的Servlet(UpdateServlet){ // 更新数据的update方法 @Override public 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("更新失败"); } } }
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;
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UpdateServlet() {
super();
// TODO Auto-generated constructor stub
}
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.jsp
response.sendRedirect("ListServlet");
// 更新完成了再重定向回PagerServlet进行pager.jsp的显示以及跳转功能
// response.sendRedirect("PagerServlet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
更新书籍信息的页面(update.jsp)
<%@page import="com.jinzhi.bean.Book"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>更新信息页面
更新书籍最终效果:
分页功能的实现 分页要用到数据实体类(Pager)
这个实体类中有着实现分页要用到的各种属性:
nowPage —— 当前页
sumRow —— 总记录数
pageSize —— 每页显示多少条
sumPage —— 总页数
pageData —— 当前页应该存的书籍对象集合
package com.jinzhi.bean; // 这是分页要用到的所有数据,在BookDao中的设置分页功能时会用到 import java.util.List; public class PagerDAO中的获取全部书籍数量以及每页需要显示的书籍对象集合方法{ private int nowPage; // 当前页 private int sumRow; // 总记录数 private int pageSize = 5; // 每页显示多少条 private int sumPage; // 总页数 private List 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 getPageData() { return pageData; } public void setPageData(List pageData) { this.pageData = pageData; } }
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执行分页操作的Servlet(PagerServlet){ 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 block e.printStackTrace(); }finally{ closeAll(); } return sumrow; } public Pager pager(int nowPage,int pageSize){ Pager pager = new Pager<>(); // 得到总记录数sumRow int sumRow = sumRow(); // 得到总页数sumPage int 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 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 block e.printStackTrace(); }finally{ closeAll(); } return pager; } }
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;
public class PagerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public PagerServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获取给的当前应该在的页数值给npage
String 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和第二个参数pageSize
BookDao bookDao = new BookDao();
// 获取应该显示的书籍信息数据集合
Pager pagerBook = bookDao.pager(npage, 5);
// 存放pagerBook数据,然后转发到显示页面pager.jsp
request.setAttribute("pagerBook", pagerBook);
request.getRequestDispatcher("pager.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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"%>
分页显示信息页面
图书列表
图书名称
图书价格
图书作者
操作
<%
// 获取设置的书籍信息分页要用的信息对象pagerBook
Pager pagerBook = (Pager)request.getAttribute("pagerBook");
// 获取需要显示的pagesize(5个)书籍信息对象的lstBook集合
List lstBook =pagerBook.getPageData() ;
// 遍历lstBook集合
for(Book b:lstBook){
%>
<%=b.getName() %>
<%=b.getPrice() %>
<%=b.getAuthor() %>
删除
更新
<%} %>
共<%=pagerBook.getSumRow() %>条记录,每页显示<%=pagerBook.getPageSize() %>条,当前第<%=pagerBook.getNowPage() %>页,共<%=pagerBook.getSumPage() %>页
首页
上一页
下一页
尾页
跳转到保存页面
分页显示书籍最终效果:
所有的代码都已经结束,大家可以再回顾一下这个功能流程实现图,再加深理解一下Javaweb是如何实现这整个过程的:
这个项目虽然很小,但是作为初学Javaweb的练手项目可以说是再合适不过了,有需要的同学可以到我的github去下载:简单书籍信息管理项目代码
学习Java面试题(Session 和 cookie 的基础概念)指路陈哈哈大佬的网络编程相关面试题原帖



