分页优化的一种方式
1.问题的出现:
有分页的JSP页面中,在 最后一页 添加一个bean时,添加成功后的页面跳转应当分为两种情况:
第一种:该页的记录数未满,则跳转回本页;
第二种:该页的记录数已满,则跳到最后一页。
我暂且将这种功能称为:溢出自动翻页功能。
2.解决方法的步骤:
(1).在添加按钮的连接上添加参数:
href="pages/manager/book_edit.jsp?pageNo=${ requestScope.page.pageNo}&pageNum=${ requestScope.page.pageTotal }"
两个参数分别是:
pageNo: 添加前的当前分页
pageNum: 添加前的分页总数
form 提交 book 的信息,action=add,再使用反射调用Servlet中的 add() 方法
(2).在Servlet程序的 add() 方法中进行判断:
①.获取book对象,并调用Service进行添加;
②.调用 pageOfAdd() 方法,获取 添加后的当前页和总页数;
③.获取 request 参数中的 添加前的当前页和总页数;
④.判断添加前后的总页数是否一致,且添加前的当前页是否是添加前的最后一页(即添加前的总页数);
⑤.根据判断结果来设置不同的路径,重定向至 page() 方法中。
⑥.测试后,JSP页面可以实现溢出自动翻页功能,流程合理可行,所以也没有报异常。
(3).附上代码:add() 方法和 page() 方法
add():
protected void addBook(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Book book = Utils.copyParamToBean(new Book(), request.getParameterMap());
bookService.addBook(book);
Page<Book> page = pageOfAdd(request, response);
int pageNo = Utils.paseInt(request.getParameter("pageNo"), page.getPageNo());
int pageTotal = Utils.paseInt(request.getParameter("pageTotal"), page.getPageTotal());
String path = request.getContextPath() + "/manager/bookServlet?action=page&pageNo=";
if (page.getPageTotal() != pageTotal && pageNo == pageTotal) {
path = path + (pageNo + 1);
} else {
path = path + pageNo;
}
response.sendRedirect(path);
}
其中的page() 方法:
protected Page<Book> pageOfAdd(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int pageNo = Utils.paseInt(request.getParameter("pageNo"), 1);
int pageSize = Utils.paseInt(request.getParameter("pageSize"), Page.PAGE_SIZE);
return bookService.page(pageNo, pageSize);
}
3.总结:
刚开始时,我采用的解决方法是在 page() 方法中进行判断:
(1).在add() 方法中,转发到page() 的路径中添加一个特有参数 用以标记这是 add() 方法,在page() 中,就可以通过判断这个参数是否存在而分辨出这是add() 方法重定向过来的。
(2).在判断后,如果符合条件,那么再次重定向给 page() 方法,即重定向给自己。
(3).虽然在JSP页面中确实也可以实现溢出自动翻页功能,但是,控制台却报了反射的异常,异常出在 BaseServlet类中的doPost() 方法中:
try {
method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
}
究竟是什么原因导致的异常,我并没有找到。
从业务流程来看,只有add() 方法会用到溢出自动翻页功能,那么按照各做己事的原则,也应当交由 add() 方法来解决这个功能,page() 只管接收就行了。
进一步优化:可以将判断交由另一个方法来实现,返回一个字符串作为重定向地址就行了。