就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pageNum)、当前第几页(pageNo)等等信息,所以我们封装一个查询结果PageModel类,代码如下:
{
private List list;
private int pageNo;
private int pageSize;
private int totalNum;
private int totalPage;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
setTotalPage((getTotalNum() % pageSize) == 0 ? (getTotalNum() / pageSize)
: (getTotalNum() / pageSize + 1));
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
// 获取第一页
public int getFirstPage() {
return 1;
}
// 获取最后页
public int getLastPage() {
return totalPage;
}
// 获取前页
public int getPrePage() {
if (pageNo > 1)
return pageNo – 1;
return 1;
}
// 获取后页
public int getBackPage() {
if (pageNo < totalPage)
return pageNo + 1;
return totalPage;
}
// 判断'首页'及‘前页'是否可用
public String isPreable() {
if (pageNo == 1)
return "disabled";
return "";
}
// 判断'尾页'及‘下页'是否可用
public String isBackable() {
if (pageNo == totalPage)
return "disabled";
return "";
}
}
其中使用泛型是为了能使的该分页类能进行重用,比如在查询用户时可以封装User对象、在查询财务中的流向单时可以封装流向单FlowCard类。
我们以查询用户为例,用户选择查询条件,首先调用Servlet获取查询参数,然后请求业务逻辑层取得分页封装结果类。业务逻辑调用Dao层取得结果集、取得中记录数封装成分页类。最后Servlet将结果设置到jsp页面显示。
首先来讲解Servlet,代码如下:
pagination = userInfoManage.userBasicSearch(u,pageNo,pageSize);
List userList = pagination.getList();
// 3.封装返回结果
StringBuffer resultXML = new StringBuffer();
try {
resultXML.append(“<?xml version='1.0' encoding='gb18030'?>/n”);
resultXML.append(“/n”);
for (Iterator iterator = userList.iterator(); iterator
.hasNext();) {
UserInfo userInfo = iterator.next();
resultXML.append(“/n”);
resultXML.append(“/t” + userInfo.getId() + “ /n”);
resultXML.append(“/t” + userInfo.getTruename()
+ “ truename >/n”);
resultXML.append(“/t” + userInfo.getSex() + “ /n”);
resultXML.append(“/t” + userInfo.getHome() + “ /n”);
resultXML.append(“ /n”);
}
resultXML.append(“/n”);
resultXML.append(“/t” + pagination.getTotalPage()
+ “ /n”);
resultXML.append(“/t” + pagination.getFirstPage()
+ “ /n”);
resultXML.append(“/t” + pagination.getLastPage() + “ /n”);
resultXML.append(“/t” + pagination.getPageNo()
+ “ /n”);
resultXML.append(“ /n”);
resultXML.append(“ /n”);
} catch (Exception e) {
e.printStackTrace();
}
writeResponse(req,resp,resultXML.toString());
}
public void writeResponse(HttpServletRequest request,HttpServletResponse response,String result) throws IOException {
response.setContentType(“text/xml”);
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“Content-Type”,”text/xml; charset=gb18030″);
PrintWriter pw = response.getWriter();
pw.write(result);
pw.close();
}
}
其中User对象代码如下:
接着是业务逻辑层代码,代码如下:
userBasicSearch(UserInfo u,int pageNo,int pageSize) throws Exception {
Connection connection = null;
PageModel pagination = new PageModel();
try {
connection = DBUtility.getConnection();
DBUtility.setAutoCommit(connection,false);
pagination.setList(userInfoDao.getUserList(u,pageSize));
pagination.setPageNo(pageNo);
pagination.setPageSize(pageSize);
pagination.setTotalNum(userInfoDao.getTotalNum(u));
DBUtility.commit(connection);
} catch (Exception e) {
DBUtility.rollBack(connection);
e.printStackTrace();
throw new Exception();
} finally {
DBUtility.closeConnection();
}
return pagination;
}
}
其中DBUtility为数据库的连接封装类。
最后是Dao层代码实现,代码如下:
getUserList(UserInfo userInfo,int pageSize) throws Exception {
PreparedStatement pstmt = null;
ResultSet rs = null;
List userList = null;
try {
String sql = “select * from(select rownum num,u.* from(select * from user_info where sex = ? and home like ‘”
+ userInfo.getHome()
+ “%”
+ “‘ and colleage like ‘”
+ userInfo.getColleage()
+ “%”
+ “‘ and comingyear like ‘”
+ userInfo.getCy()
+ “%”
+ “‘ order by id) u where rownum<=?) where num>=?”;
userList = new ArrayList();
Connection conn = DBUtility.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,userInfo.getSex());
pstmt.setInt(2,pageNo * pageSize);
pstmt.setInt(3,(pageNo – 1) * pageSize + 1);
rs = pstmt.executeQuery();
while (rs.next()) {
UserInfo user = new UserInfo();
user.setId(rs.getInt(“id”));
user.setTruename(rs.getString(“truename”));
user.setSex(rs.getString(“sex”));
user.setHome(rs.getString(“home”));
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
throw new Exception(e);
} finally {
DBUtility.closeResultSet(rs);
DBUtility.closePreparedStatement(pstmt);
}
return userList;
}
public int getTotalNum(UserInfo userInfo) throws Exception {
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0;
try {
String sql = “select count(*) from user_info where sex=? and home like ‘”
+ userInfo.getHome()
+ “%”
+ “‘ and colleage like ‘”
+ userInfo.getColleage()
+ “%”
+ “‘ and comingyear like ‘”
+ userInfo.getCy()+ “%” + “‘”;
Connection conn = DBUtility.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,userInfo.getSex());
rs = pstmt.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
throw new Exception(e);
} finally {
DBUtility.closeResultSet(rs);
DBUtility.closePreparedStatement(pstmt);
}
return count;
}
}
最后就是servlet将得到的结果返回给jsp页面显示出来。
注:其中DBUtility代码是封装数据库连接操作的代码,如下: