JSP实战精讲:分页查询
分页查询的作用,我就不做解释了,本来这篇文章是应该早发表的,但是因为51的发博文不大好使(或许使用的不习惯),转用css+html写的,但是没保存,电脑就没有电了。这回重新写一下。
下面我将代码结构先让大家熟悉一下,希望对有需要帮助的朋友带来一点收获。
总体代码结构:
下面分块讲解:
一:JDBC连接数据库。
初期的话,一般都是直接用的JDBC连接数据库,当时的我也不例外。但是,“同样功能的代码最好只写一遍”这是我的一个外国朋友常说的一句话,我感觉不错,所以我喜欢把类似功能的小模块写进工具类中,即:util包下的JdbcUtil.java类。
我在此连接的为Oracle10g(这个练习时方便用那个就用哪个即可)中的scott账户中的depart部门表,用以在JSP页面中显示,达到分页的效果。不在此详细解释了
代码:
二package com.text.queryPage.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * JDBC工具类:用于辅助连接数据库的类 * 此处用的是oracle数据库。 * * @author 小驴找队 * */ public class JdbcUtil { //数据库资源路径 private static String url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; //加载驱动类路径 private static String driver="oracle.jdbc.driver.OracleDriver"; //数据库帐户名 private static String userName="scott"; //数据库账户密码 private static String password="tiger"; //the constructor of the class public JdbcUtil() { } //静态方法:获取与数据库的连接 public static Connection getConnection(){ Connection conn = null; try { Class.forName(driver); conn= DriverManager.getConnection(url, userName, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //设置数据库连接的信息 public static void setConnectionInfo(String url1,String driver1,String userName1,String password1){ url=url1; driver=driver1; userName=userName1; password=password1; } //关闭数据库连接 public static void closeAll(Connection conn,Statement st,ResultSet rs){ try { if(conn!= null){ conn.close(); } if(st!=null){ st.close(); } if(rs!=null){ rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
二:VO:包下的JavaBean对象:
(1)首先,你打算实现“分页功能”,但你需要事先有“页”这个抽象对象,来方便你的代码编写。试想,page应该有什么样的属性和行为呢?
想好了么?我先来说一下:
1.page最基本属性: 总页数,当前页数,每一页的记录条数,以及承载记录的容器。
2.page对应的行为: set,get方法(我习惯重写toString方法,用以debug)
代码:
package com.text.queryPage.vo; import java.util.List; /** * javaBean:页对象的抽象类 * * @author 小驴找队 * */ public class PageInfo { //总页数 private int totalPage; //每一页的记录条数 private int rowSize = 5; //当前页 private int currentPage =1; //承载数据记录的容器 private List<DepartBean> list; //set,get methods public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getRowSize() { return rowSize; } public void setRowSize(int rowSize) { this.rowSize = rowSize; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public List<DepartBean> getList() { return list; } public void setList(List<DepartBean> list) { this.list = list; } @Override public String toString() { return "总页数:"+getTotalPage()+";每页条数:"+getRowSize()+"当前页数:"+getCurrentPage(); } }
(2)有了页面抽象类后,也应该有记录的抽象类,此处为departBean.java
代码:
package com.text.queryPage.vo; public class DepartBean { //部门id private String id; //部门名称 private String departName; //部门代号 private String departCode; //部门类型 private String departType; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDepartName() { return departName; } public void setDepartName(String departName) { this.departName = departName; } public String getDepartCode() { return departCode; } public void setDepartCode(String departCode) { this.departCode = departCode; } public String getDepartType() { return departType; } public void setDepartType(String departLevel) { this.departType = departLevel; } @Override public String toString() { return "id:"+getId()+";departname"+getDepartName()+";departcode:"+getDepartCode()+";departlevel:"+getDepartType()+";"; } }
三:Dao:jdbc操纵数据库层
注意,一般servlet文件是不会直接调用dao层的,中间会有一个桥梁,即:Service。规范注释还是很重要的。
代码:
package com.text.queryPage.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.text.queryPage.util.JdbcUtil; import com.text.queryPage.vo.DepartBean; /** * Dao包下处理数据库问题的类 * * @author 小驴找队 * */ public class QueryDao { //与数据库的连接的基本所需变量 private Connection conn =null; private PreparedStatement ps = null; private ResultSet rs = null; /** * the methods for querying the table depart int the oracle * * @return List<DepartBean> */ public List<DepartBean> queryDepart(){ String sql = "select * from depart"; List<DepartBean> list = new ArrayList<DepartBean>(); try { conn = JdbcUtil.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ DepartBean db = new DepartBean(); //从数据库取出数据,并初始化javaBean db.setId(rs.getString("did")); db.setDepartName(rs.getString("departname")); db.setDepartCode(rs.getString("departcode")); db.setDepartType(rs.getString("departtype")); //添加到结果容器里 list.add(db); } } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtil.closeAll(conn, ps, rs); } return list; } }
四:service:
代码:
package com.text.queryPage.service; import java.util.List; import com.text.queryPage.dao.QueryDao; import com.text.queryPage.vo.DepartBean; /** * Service包下处理事务,调用dao的类 * * @author 小驴找队 * */ public class QueryService { //dao变量 private QueryDao dao = new QueryDao(); /** * the method for calling the dao to get the message of you want * * @return List<DepartBean> */ public List<DepartBean> queryDepart(){ List<DepartBean> list = null; list = dao.queryDepart(); return list; } }
五:servlet:
代码:
package com.text.queryPage.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; 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.text.queryPage.dao.QueryDao; import com.text.queryPage.service.QueryService; import com.text.queryPage.vo.DepartBean; import com.text.queryPage.vo.PageInfo; public class QueryServlet extends HttpServlet { /** * Constructor of the object. */ public QueryServlet() { super(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } /** * the method for dealing with all thing * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //生成service对象 QueryService qs = new QueryService(); //获取传递过来的隐藏属性pageFlag String pageFlagValue = request.getParameter("pageFlag"); //获取数据 List<DepartBean> list = qs.queryDepart(); System.out.println("..............."+list.size()); //声明pageInfo变量 PageInfo pi = null; //处理:如果是第一次请求,应新建PageInfo对象;如果不是我们应从session中获取 if(request.getSession().getAttribute("pageMessage") == null){ pi = new PageInfo(); System.out.println("重建 pageInfo"); }else{ pi =(PageInfo) request.getSession().getAttribute("pageMessage"); System.out.println("获取原来的pageInfo"); } //处理:总页数问题,如果总记录条数不能被每页记录条数整除,则页码数+1 if((list.size() % pi.getRowSize())!=0){ pi.setTotalPage((list.size() / pi.getRowSize())+1); }else{ pi.setTotalPage((list.size() / pi.getRowSize())); } //处理:当前页:通过隐藏属性,判断当前页码变化 if(pageFlagValue == null ||"first".equals(pageFlagValue)){ pi.setCurrentPage(1); } else if("next".equals(pageFlagValue)){ int temp = pi.getCurrentPage()+1; //处理:如果下一页超出总页数范围 if(temp > pi.getTotalPage()){ temp = pi.getTotalPage(); } pi.setCurrentPage(temp); } else if("prevate".equals(pageFlagValue)){ int temp = pi.getCurrentPage()-1; //处理:如果下一页超出总页数范围 if(temp < 1){ temp = 1; } pi.setCurrentPage(temp); }else{ pi.setCurrentPage(pi.getTotalPage()); } /*获取当前页第一条记录index,以及最后一条index * * 注意:在程序中是从0开始的,而现实生活中,是从1开始的 */ int start = (pi.getCurrentPage() -1)*pi.getRowSize()+1; //处理:是否是到了最后一页 int end = 0; if( pi.getCurrentPage() == pi.getTotalPage()){ end = list.size(); }else{ end = start +(pi.getRowSize() - 1); } List<DepartBean> tempList = new ArrayList<DepartBean>(); //因为程序list下标是从0开始的,所以:int i = start -1; 结束于 i <= end-1,即: i <end for(int i =(start-1);i < end;i++){ tempList.add(list.get(i)); } pi.setList(tempList); System.out.println(pi.toString()); //将属性写入session request.getSession().setAttribute("pageMessage", pi); //重定向到显示页:show.jsp response.sendRedirect("../Show.jsp"); } }
六:前台jsp:
此处是用Java代码片段写的,当时没有用EL,JSTL写,现在,大家将就看一下吧,谢谢。
代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="com.text.queryPage.vo.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> Show Page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <!-- 下面进行演示的div层 --> <div id="firstDiv" align="center" style="background-color: orange"> <table bordercolor="black" border="1"> <tr><th>部门名称</th><th>部门代码</th><th>部门类型</th></tr> <% if(session.getAttribute("pageMessage") != null){ PageInfo pi = (PageInfo)session.getAttribute("pageMessage"); List<DepartBean> list = pi.getList(); if(list != null){ //System.out.print("==================="+list.size()); for(int i =0;i < list.size();i++ ){ %> <tr> <td><%=list.get(i).getDepartName() %></td> <td><%=list.get(i).getDepartCode() %></td> <td><%=list.get(i).getDepartType() %></td> </tr> <% } }else{ System.out.println("======数据为null=="); } }else{ System.out.println("==========Session中的属性为null========"); } %> <tr> <td><a href="./servlet/QueryServlet?pageFlag=first">首页</a></td> <td><a href="./servlet/QueryServlet?pageFlag=next">下一页</a></td> <td><a href="./servlet/QueryServlet?pageFlag=prevate">上一页</a></td> <td><a href="./servlet/QueryServlet?pageFlag=last">末页</a></td> </tr> </table> </div> </body> </html>
仅在此谢谢各位朋友的支持,下一讲再见。
于2014年03年02日23点
小驴找队
本文出自 “8456901” 博客,转载请与作者联系!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。