本例采用 基于缓存的分页技术。
PS:
CallableStatement prepareCall(String sql) throws SQLException
使用返回的 CallableStatement
对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY
,并带有 CONCUR_READ_ONLY
并发级别。
默认的 ResultSet
对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
生成可滚动和/或可更新的 ResultSet
对象。
cs = conn.prepareCall(UP_tbl_User_GetList, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
否则:
rs.absolute(start); 会报错
SQLUserDAOImp.java 部分代码:
//获得一页
public Iterator<User> GetOnePageUser(int start,int pagesize){
Connection conn = null;
CallableStatement cs = null;
ResultSet rs = null;
ArrayList<User> users = new ArrayList<User>();
try {
conn = SQLServerDAOFactory.getConnection();
rs = cs.executeQuery();
rs.absolute(start);
for(int i =0;i<pagesize;i++){
User user = new User();
user.setU_Id(rs.getInt("U_Id"));
user.setU_UserName(rs.getString("U_UserName"));
user.setU_Password(rs.getString("U_Password"));
users.add(user);
if(!rs.next()){
break;
}
}
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
Iterator<User> it = users.iterator();
return it;
}
//获得总数
public int GetCount() {
Connection conn = null;
CallableStatement cs = null;
int result = 0;
try {
conn = SQLServerDAOFactory.getConnection();
cs =conn.prepareCall(UP_tbl_User_GetCount);
cs.registerOutParameter(1, Types.INTEGER);
cs.execute();
result = cs.getInt(1);
} catch (SQLException e) {
e.printStackTrace();
}finally{
SQLServerDAOFactory.closeStatment(cs);
SQLServerDAOFactory.closeConnection(conn);
}
return result;
}
UserAction.java 部分代码:
public ActionForward userlist(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
DAOFactory daof = DAOFactory.getDAOFactory(DAOFactory.SQL);
UserDAO udao = daof.getUserDAO();
ArrayList<User> userlist = new ArrayList<User>();
Iterator<User> ulist = udao.GetAllUser();
while(ulist.hasNext()){
User user = ulist.next();
userlist.add(user);
}
HttpSession session = request.getSession();
session.setAttribute("userlist", userlist);
int rowsNum = udao.GetCount();
int totalPage=0;
int pageSize=5;
int pages=1;
int temp=rowsNum%pageSize;
if(temp==0){
totalPage=rowsNum/pageSize;
}else{
totalPage=rowsNum/pageSize+1;
}
try{
if(request.getParameter("page")==null||request.getParameter("page").equals("")){
pages=1;
}else
{
pages=Integer.parseInt(request.getParameter("page"));
}
}catch(Exception e){
pages=1;
}
if(totalPage<1){
totalPage=1;
}
if(pages<1) pages=1;
if(pages>totalPage) pages=totalPage;
int start=(pages-1)*pageSize+1;
Iterator<User> pageuserlist =udao.GetOnePageUser(start, pageSize);
session.setAttribute("pageuserlist", pageuserlist);
session.setAttribute("pages", pages);
session.setAttribute("totalPage", totalPage);
session.setAttribute("rowsNum", rowsNum);
request.setAttribute("url", "../SuperManager/UserList.jsp");
return new ActionForward("/index.jsp");
}
UserList.jsp 中部分代码:
<tr>
<td><div align="right">
<%
int pages = (Integer)session.getAttribute("pages");
int totalPage =(Integer)session.getAttribute("totalPage");
int rowsNum =(Integer)session.getAttribute("rowsNum");
if(pages!=1){
%>
<%
out.println("<a href=?page=1>首页</a> ");
out.println("<a href=?page="+(pages-1)+">上一页</a> ");
}else{
out.println("首页 ");
out.println("上一页 ");
}
if(pages!=totalPage){
out.println("<a href=?page="+(pages+1)+">下一页</a> ");
out.println("<a href=?page="+totalPage+">尾页</a> ");
}else{
out.println("下一页 ");
out.println("尾页 ");
}
out.println("共有"+rowsNum+"条记录 当前第"+pages+"/"+totalPage+"页");
%>
</div></td>
</tr>