分页查询的作用,我就不做解释了,本来这篇文章是应该早发表的,但是因为51的发博文不大好使(或许使用的不习惯),转用css+html写的,但是没保存,电脑就没有电了。这回重新写一下。

   下面我将代码结构先让大家熟悉一下,希望对有需要帮助的朋友带来一点收获。

   总体代码结构:                            

wKiom1MTSI6ypth4AAAnpgyiY_o072.png

  下面分块讲解:

  一: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点

                                                                        小驴找队