今天寫了個jsp的分頁程序,以前在做jsp項目的時候,分頁采用的是“首頁,尾頁,上一頁,下一頁”的形式,雖然分頁沒有問題,但總感覺不夠友好,現在很多論壇都采用這種模式,即根據用戶請求的頁面,列出請求頁面和該頁面的前幾頁和后幾頁,看上去比較舒服,今天就模仿“編程中國論壇”的分頁風格練了練,后臺查詢數據庫的分頁代碼與之前做過的基本沒有變化,主要是在jsp頁面上多了些判斷,效果實現了,至于效率我就不好說了,如果哪位看過下面代碼的朋友有什么好方法,還望大家能夠一起交流,共同進步。
該程序采用了MVC設計模式,代碼中的ServletX為總控制器,根據model值將請求轉至相應模塊,后臺數據庫為Oracle,由于emp表中數據只有15條,所以我每頁只顯示一條記錄,效果如圖:

1,用戶登錄,若登錄成功轉到main.jsp頁面,以下為用戶控制器代碼:
package controls;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import entitys.User;
import routines.Translation;
import operater.*;
import java.util.*;


public class UserServlet extends HttpServlet
{


/** *//**
* Constructor of the object.
*/

public UserServlet()
{
super();
}


/** *//**
* Destruction of the servlet. <br>
*/

public void destroy()
{
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}


/** *//**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @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 doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
String event = request.getParameter("event");

if(event.equals("login"))
{
String userName = Translation.transCode(request.getParameter("userName"));
String password = Translation.transCode(request.getParameter("password"));
User user = new User();
user.setUserName(userName);
user.setPassword(password);
OperUser obj = new OperUser();

if(obj.isExist(user))
{
this.mySet(request,"1");
request.getRequestDispatcher("main.jsp").forward(request, response);
return;

}else
{
System.out.println("失敗");
}
}
}

private void mySet(HttpServletRequest request,Object pageNo)
{
OperEmp emp = new OperEmp();
//向請求中存儲關于分頁的信息
ArrayList aryInfo = emp.getEmp(pageNo);
request.setAttribute("data", aryInfo.get(0));
request.setAttribute("pageNo", aryInfo.get(1));
request.setAttribute("pageCount", aryInfo.get(2));
request.setAttribute("rowsCount", aryInfo.get(3));
ArrayList aryNumber = new ArrayList();

for(int i=1;i<=10;i++)
{
aryNumber.add(new Integer(i));
}
request.setAttribute("number", aryNumber);
ArrayList aryNumberR = new ArrayList();

for(int i=9;i>=0;i--)
{
aryNumberR.add(new Integer(i));
}
request.setAttribute("numberR", aryNumberR);
//向請求中存儲關于職位的信息
ArrayList aryJob = emp.getJob();
request.setAttribute("job", aryJob);
//向請求中存儲關于部門編號的信息
OperDept dept = new OperDept();
ArrayList aryDeptno = dept.getDeptno();
request.setAttribute("deptno", aryDeptno);
}


/** *//**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @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 doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
this.doGet(request, response);
}


/** *//**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/

public void init() throws ServletException
{
// Put your code here
}

}

2,main.jsp頁面,即顯示分頁的頁面的代碼:

<%
@page contentType="text/html" pageEncoding="GBK"%>

<%
@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>職員信息</title>

<script type="text/javascript">

function go()
{
var page = document.frmMain.pageNo.value;
window.location.href = 'ServletX?model=emp&event=partitionPage&pageNo=' + page;
return;
}
</script>
</head>
<body>
<form name="frmMain" action="ServletX" method="get">
<table border="1" align="center">
<caption>
職員信息表
</caption>
<tr>
<th onclick="selectAll(this)" style="cursor:hand">全選</th>
<th>職員編號</th>
<th>職員姓名</th>
<th>職位</th>
<th>直接上司</th>
<th>入職時間</th>
<th>薪金</th>
<th>獎金</th>
<th>部門編號</th>
<th>操作</th>
</tr>
<c:forEach var="obj" items="${requestScope.data}">
<tr>
<td align="center"><input type="checkbox" name="${obj.empNo}"/></td>
<td>${obj.empNo}</td>
<td>${obj.ename}</td>
<td>${obj.job}</td>
<td>${obj.mgr}</td>
<td>${obj.hireDate}</td>
<td>${obj.sal}</td>
<td>${obj.comm}</td>
<td>${obj.deptno}</td>
<td><input type="button" value="編輯"/></td>
</tr>
</c:forEach>
<tr>
<td colspan="10" align="left">
總記錄數:${requestScope.rowsCount}
<c:choose>
<c:when test="${requestScope.pageCount <= 10}">
<c:if test="${requestScope.pageNo != 1}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}"><<</a>
</c:if>
<c:forEach var="num" begin="0" end="${requestScope.pageCount - 1}" items="${requestScope.number}">
<c:choose>
<c:when test="${requestScope.pageNo != num}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${num}">${num}</a>
</c:when>
<c:otherwise>
<font color="red">${requestScope.pageNo}</font>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${requestScope.pageNo != requestScope.pageCount}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + 1}">>></a>
</c:if>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${requestScope.pageNo > 3 && requestScope.pageNo < requestScope.pageCount - 7}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=1">1
</a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}"><<</a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 2}">${requestScope.pageNo - 2}</a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}">${requestScope.pageNo - 1}</a>
<font color="red">${requestScope.pageNo}</font>
<c:forEach var="num" items="${requestScope.number}" begin="0" end="6">
<c:if test="${requestScope.pageNo + num <= pageCount}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + num}">${requestScope.pageNo + num}</a>
</c:if>
</c:forEach>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + 1}">>></a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageCount}">..${requestScope.pageCount}</a>
</c:when>
<c:when test="${requestScope.pageNo > 3 && requestScope.pageNo >= requestScope.pageCount -7 && requestScope.pageNo != requestScope.pageCount}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=1">1
</a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}"><<</a>
<c:forEach var="numR" items="${requestScope.numberR}" begin="0">
<c:choose>
<c:when test="${requestScope.pageCount - numR != requestScope.pageNo}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageCount - numR}">${requestScope.pageCount - numR}</a>
</c:when>
<c:otherwise>
<font color="red">${requestScope.pageNo}</font>
</c:otherwise>
</c:choose>
</c:forEach>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + 1}">>></a>
</c:when>
<c:when test="${requestScope.pageNo <= 3 && requestScope.pageNo > 1}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}"><<</a>
<c:forEach var="num" items="${requestScope.number}">
<c:choose>
<c:when test="${requestScope.pageNo != num}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${num}">${num}</a>
</c:when>
<c:otherwise>
<font color="red">${requestScope.pageNo}</font>
</c:otherwise>
</c:choose>
</c:forEach>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + 1}">>></a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageCount}">..${requestScope.pageCount}</a>
</c:when>
<c:when test="${requestScope.pageNo == 1}">
<c:forEach var="num" items="${requestScope.number}">
<c:choose>
<c:when test="${requestScope.pageNo != num}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${num}">${num}</a>
</c:when>
<c:otherwise>
<font color="red">${requestScope.pageNo}</font>
</c:otherwise>
</c:choose>
</c:forEach>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo + 1}">>></a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageCount}">..${requestScope.pageCount}</a>
</c:when>
<c:when test="${requestScope.pageNo == requestScope.pageCount}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=1">1
</a>
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageNo - 1}"><<</a>
<c:forEach var="numR" items="${requestScope.numberR}" begin="0">
<c:choose>
<c:when test="${requestScope.pageCount - numR != requestScope.pageNo}">
<a href="ServletX?model=emp&event=partitionPage&pageNo=${requestScope.pageCount - numR}">${requestScope.pageCount - numR}</a>
</c:when>
<c:otherwise>
<font color="red">${requestScope.pageNo}</font>
</c:otherwise>
</c:choose>
</c:forEach>
</c:when>
</c:choose>
</c:otherwise>
</c:choose>
<input name="pageNo" type="text" size="3"/>
<input type="button" onclick="go()" value="GO"/>
</td>
</tr>
<tr>
<td colspan="10" align="center">
<input type="button" value="增加" onclick="addRow()"/>
<input type="submit" value="保存" onclick="saveRow()"/>
<input type="submit" value="刪除" onclick="deleteRow()"/>
</td>
</tr>
</table>
</form>
</body>
</html>
3,用戶點擊相應頁面鏈接或通過文本框請求頁面時,即emp表的控制器,方法類似于用戶登錄成功后的處理,代碼如下:

/**//*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package controls;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import entitys.Emp;
import routines.Translation;
import operater.*;
import java.util.*;


/** *//**
*
* @author Administrator
*/

public class EmpServlet extends HttpServlet
{

/** *//**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

try
{

/**//* TODO output your page here
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet EmpServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet EmpServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
*/

} finally
{
out.close();
}
}


/** *//**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
String event = request.getParameter("event");

if(event.equals("partitionPage"))
{
String pageNo = request.getParameter("pageNo");
this.mySet(request, pageNo);
request.getRequestDispatcher("main.jsp").forward(request, response);
return;
}
}

private void mySet(HttpServletRequest request, Object pageNo)
{
OperEmp emp = new OperEmp();
//向請求中存儲關于分頁的信息
ArrayList aryInfo = emp.getEmp(pageNo);
request.setAttribute("data", aryInfo.get(0));
request.setAttribute("pageNo", aryInfo.get(1));
request.setAttribute("pageCount", aryInfo.get(2));
request.setAttribute("rowsCount", aryInfo.get(3));
ArrayList aryNumber = new ArrayList();

for (int i = 1; i <= 10; i++)
{
aryNumber.add(new Integer(i));
}
request.setAttribute("number", aryNumber);
ArrayList aryNumberR = new ArrayList();

for (int i = 9; i >=0; i--)
{
aryNumberR.add(new Integer(i));
}
request.setAttribute("numberR", aryNumberR);
//向請求中存儲關于職位的信息
ArrayList aryJob = emp.getJob();
request.setAttribute("job", aryJob);
//向請求中存儲關于部門編號的信息
OperDept dept = new OperDept();
ArrayList aryDeptno = dept.getDeptno();
request.setAttribute("deptno", aryDeptno);
}


/** *//**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
this.doGet(request, response);
}


/** *//**
* Returns a short description of the servlet.
*/

public String getServletInfo()
{
return "Short description";
}
}

4,該類為分頁查詢代碼,用戶可隨需要改變頁面顯示的記錄行數,代碼如下:
package operater;

import java.sql.*;
import entitys.Emp;
import db.DataBase;
import java.util.*;


/** *//**
*該類用于完成對用戶信息表操作的業務邏輯
* @author 非凡DZ
*/

public class OperEmp
{
private Connection con = null;
private PreparedStatement pstn = null;
private ResultSet rs = null;
private int pageCount = 0;//記錄總頁數
private int pageNo = 0;//記錄要前往的頁數
private int pageRows = 6;//記錄每頁的行數
private int rowsCount = 0;//記錄總行數
private int i = 0;//用于控制循環次數

/** *//**
* 根據請求的頁數得到相應的數據
* @param page 請求的頁碼
* @return 請求頁碼中的信息,請求頁碼及總頁數
*/

public ArrayList getEmp(Object page)
{

if(page == null)
{
pageNo = 1;

}else
{
pageNo = Integer.parseInt(page.toString());
}

if(pageNo < 1)
{
pageNo = 1;
}
DataBase db = new DataBase();
con = db.getConnection();
String sql = "select * from emp";
ArrayList aryInfo = new ArrayList();
ArrayList aryEmp = new ArrayList();//記錄所有

try
{
pstn = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = pstn.executeQuery();
rs.last();
rowsCount = rs.getRow();
pageCount = (rowsCount + pageRows - 1) / pageRows;

if(pageNo > pageCount)
{
pageNo = pageCount;
}

if(pageCount > 0)
{
rs.absolute((pageNo - 1) * pageRows + 1);
}

while(i < pageRows && !rs.isAfterLast())
{
Emp emp = new Emp();
emp.setEmpNo(rs.getInt(1));
emp.setEname(rs.getString(2));
emp.setJob(rs.getString(3));
emp.setMgr(rs.getInt(4));
emp.setHireDate(rs.getString(5));
emp.setSal(rs.getFloat(6));
emp.setDeptno(rs.getInt(7));
aryEmp.add(emp);
rs.next();
i++;
}

} catch (Exception e)
{
System.out.println("分頁異常"+e.getMessage());
}
aryInfo.add(aryEmp);
aryInfo.add(new Integer(pageNo));//當前頁數
aryInfo.add(new Integer(pageCount));//總頁數
aryInfo.add(new Integer(rowsCount));//總行數
return aryInfo;
}

/** *//**
* 得到所有職位
* @return
*/

public ArrayList getJob()
{
DataBase db = new DataBase();
con = db.getConnection();
boolean flag = false;
String sql = "select job from emp";
ArrayList aryJob = new ArrayList();

try
{
pstn = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = pstn.executeQuery();

while (rs.next())
{
flag = false;

for (int i = 0; i < aryJob.size(); i++)
{
String job = (String) aryJob.get(i);

if (job.equals(rs.getString(1)))
{
flag = true;
break;
}
}

if (!flag)
{
aryJob.add(rs.getString(1));
}
}

}catch(Exception e)
{
System.out.println("職位查詢異常"+e.getMessage());
}
return aryJob;
}
}

以上程序中有一些代碼是用于編輯數據用的,如用于存儲職位,部門編號的集合等