系统提升一:开发分页栏通用模块
为列表页开发分页框 该部分的代码将会在以后其他的列表页面中复用
1 新建并配置分页栏表单类PageForm.java
2 新建分页器类Pager.java
3 在AddressDAO.java中新建分页函数
4 修改AddressAction.java调用分页函数
5 修改address.jsp页面添加分页栏
6 分页栏参数的维持
1 新建并配置分页栏表单类PageForm.java
在列表页面中添加分页栏 就是需要使用表单来进行响应的跳转 这就会需要一个表单来保存分页栏各个字段的数据 因此我们需要新建一个表单类PageForm.java 该类中定义了分页的蚕食 pageSize保存了每页显示的数据条数 pageNo保存了当前显示的是第几页 这两个参数是最基本的分页栏参数 然后为每一个变量添加getter/setter的函数
- package com.demo.struts.forms;
- import org.apache.struts.action.ActionForm;
- import com.demo.struts.util.Constants;
- public class PageForm extends ActionForm {
- protected int pageSize = Constants.pageSize;
-
- protected int pageNo = Constants.pageNo;
- 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;
- }
- }
默认的数值常量 保存在Constants.java类中
在struts-config.xml中添加一个 命名为pageForm 指向上面新建的表单类com.demo.struts.forms.PageForm.java
- <form-bean name="pageForm"
- type="com.demo.struts.forms.PageForm">
- </form-bean>
为了取得列表页的分页栏数据 需要在列表页的
配置中指定表单参数pageForm 添加了name属性指向pageForm
- <action path="/address" parameter="method" name="pageForm" scope="request"
- type="org.springframework.web.struts.DelegatingActionProxy">
- <forward name="list" path="/address.jsp" />
- </action>
2 新建分页器类Pager.java
pageForm.java的租用是保存页面中分页栏的参数 为了实现分页 我们还需要新建一个分页的专用类Pager.java 它的作用是保存列表页面分也是所需要的所有数据
三个函数:
构造函数Pager() 根据每页显示的记录数pageSize 当前页面pageNo 总记录数rowCount 结果集列表resultList初始化所有的变量
getPageSizeIndexs() 用于输出每页显示记录数的数值列表
getPageNoIindexs() 用于输出页码的数值列表
3 在AddressDAO.java中新建分页函数
首先需要在AddressDAO.java 中增加分页查询的函数
首先需要在接口类IAddressADO.java中增加两个接口
//默认的分页函数 显示第一页 页面显示的记录数为25
- public Pager findPagerByUsername(final String username);
//通用的分页函数 可以设置显示第几页和每页显示的记录数
- public Pager findPagerByUsername(final String username, final int pageNo,
- final int pageSize);
然后再AddressDAO.java中编写这两个接口的实现代码 第一个函数只需要传入Constants.java中的默认常量 调用第二个函数即可
我们需要根据pageSize来进行分页 并取出第pageNo页的数据即可。
首先使用getHibernateTemplate()取得当前Session对象session 然后创建条件查询对象criteria 并为该对象增加一个参数username 表示要查询的是当前用户的结果集 然后取出总的记录数rowCount 根据pageSize pageNo 和rowCount计算出当前页面要查询数据的起始行号 使用getFirstResult()函数来设置起始行号 使用setMaxResults()函数设置从该起始行要查询的最大结果集数为pageSize 调用list()函数即可查询当前页的结果集 关闭session对象 最后根据取得的参数创建一个Pager对象并返回
- /**
- * if not pageSize and pageNo parameters, use default parameters
- */
- public Pager findPagerByUsername(final String username) {
- return findPagerByUsername(username, Constants.pageSize, Constants.pageNo);
- }
-
- /**
- * when have pageSize and pageNo parameters
- */
- public Pager findPagerByUsername(final String username, final int pageSize,
- final int pageNo) {
- Session session = getHibernateTemplate().getSessionFactory().openSession();
-
- // set query condition
- Criteria criteria = session.createCriteria(Address.class);
- criteria.add(Restrictions.eq("username", username));
-
- // get total count
- int rowCount = ((Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult()).intValue();
- criteria.setProjection(null);
-
- // get current page list
- int startIndex = pageSize * (pageNo - 1);
- criteria.addOrder(Order.asc("username"));
- criteria.setFirstResult(startIndex);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
-
- session.close();
- return new Pager(pageSize, pageNo, rowCount, result);
- }
4 修改AddressAction.java调用分页函数
在AddressDAO.java中创建了分页的查询函数后 下面就可以在AddressAction.java的列表页请求处理函数list() 中来调用该分页函数 进行分页数据查询了
由于在
的配置中已经添加了属性name=“pageForm” 因此在list()函数中就可以取得pageForm对象了 通过强制类型转换取得pageForm对象 然后从Session中取得当前登录的用户名 根据username pageForm中用户选择的pageSize pageNo属性值 即可调用AddressDAO.java的findPagerByUsername()的分页函数来返回当前页的数据列表 其中pageSize pageNo是页面中传递过来的参数 属于用户当前选择的分页栏的参数值 然后将pager中的结果集保存在request中 保存的对象名为addressList 这样在address.jsp中就可以取得该列表进行显示了 将pager页保存在request中 可以通过该对象显示分页栏的信息 最后返回到列表页面
- public ActionForward list(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- String username = (String)request.getSession().getAttribute(Constants.USERNAME_KEY);
-
- PageForm pageForm = (PageForm) form;
-
- // get pager
- Pager pager = addressDAO.findPagerByUsername(username, pageForm
- .getPageSize(), pageForm.getPageNo());
-
- // set addressList
- request.setAttribute("addressList", pager.getResultList());
-
- // set pager
- request.setAttribute("pager", pager);
-
- // save session
- setSession(request, Constants.PAGER_ADDRESS, pageForm);
-
- ActionForward forward = mapping.findForward(Constants.LIST_KEY);
- return (forward);
- }
由于在新增 修改 及删除一个联系人时也会返回到列表页面 因此在insert() update() delete
()这三个函数中 在要返回到列表页面时也需要产寻当前页的数据 此时就可以调用AddressDAO.java的第一个分页函数来查询第一页的数据了
- Pager pager = addressDAO.findPagerByUsername(username);
- request.setAttribute("addressList", pager.getResultList());
- request.setAttribute("pager", pager);
5 修改address.jsp页面添加分页栏
- <body>
- <TABLE width="100%" class="position">
- <TR>
- <TD><bean:message key="address.page.position" /></TD>
- <TD align="right"><a href="address_add.do?method=add"><bean:message key="address.page.add" /></a></TD>
- <TD width="20"></TD>
- </TR>
- </TABLE>
- <b><html:errors property="org.apache.struts.action.GLOBAL_MESSAGE" /></b>
- <TABLE border="0" width="100%">
- <TR class="tableheader">
- <TD><bean:message key="address.page.name" /></TD>
- <TD><bean:message key="address.page.***" /></TD>
- <TD><bean:message key="address.page.mobile" /></TD>
- <TD><bean:message key="address.page.email" /></TD>
- <TD><bean:message key="address.page.qq" /></TD>
- <TD><bean:message key="address.page.company" /></TD>
- <TD><bean:message key="address.page.address" /></TD>
- <TD><bean:message key="address.page.postcode" /></TD>
- <TD><bean:message key="button.operation" /></TD>
- </TR>
- <logic:present name="addressList">
- <logic:iterate id="address" name="addressList" scope="request">
- <TR>
- <TD><bean:write name="address" property="name" scope="page"/></TD>
- <TD><bean:write name="address" property="***" scope="page"/></TD>
- <TD><bean:write name="address" property="mobile" scope="page"/></TD>
- <TD><bean:write name="address" property="email" scope="page"/></TD>
- <TD><bean:write name="address" property="qq" scope="page"/></TD>
- <TD><bean:write name="address" property="company" scope="page"/></TD>
- <TD><bean:write name="address" property="address" scope="page"/></TD>
- <TD><bean:write name="address" property="postcode" scope="page"/></TD>
- <TD><a href='address_edit.do?method=edit&id='><bean:message key="button.edit" /></a>
- <a href="address.do?method=delete&id=address" property="id" scope="page"/>"><bean:message key="button.delete" /></a></TD>
- </TR>
- </logic:iterate>
- </logic:present>
- </TABLE>
- <logic:present name="pager">
- <form name="form1" action="address.do?method=list" method="post">
- <TABLE border="0" width="100%" class="pager">
- <TR>
- <TD align="left"><bean:message key="pager.pageSize" />
- <html:select name="pager" property="pageSize" onchange="document.all.pageNo.value='1';document.all.form1.submit();">
- <logic:notEmpty name="pager" scope="request">
- <html:options name="pager" property="pageSizeIndexs" />
- </logic:notEmpty>
- </html:select>
- </TD>
- <TD align="center">
- <bean:message key="pager.rowCount" /><bean:write name="pager" property="rowCount" />
- </TD>
- <TD align="right">
- <a href="javascript:document.all.pageNo.value='" property="firstPageNo" />';document.all.form1.submit();"><bean:message key="pager.firstPageNo" /></a>
- <a href="javascript:document.all.pageNo.value='" property="prePageNo" />';document.all.form1.submit();"><bean:message key="pager.prePageNo" /></a>
- <a href="javascript:document.all.pageNo.value='" property="nextPageNo" />';document.all.form1.submit();"><bean:message key="pager.nextPageNo" /></a>
- <a href="javascript:document.all.pageNo.value='" property="lastPageNo" />';document.all.form1.submit();"><bean:message key="pager.lastPageNo" /></a>
- <html:select name="pager" property="pageNo" onchange="document.all.form1.submit();">
- <logic:notEmpty name="pager" scope="request">
- <html:options name="pager" property="pageNoIndexs" />
- </logic:notEmpty>
- </html:select>
- </TD>
- <TD width="20"></TD>
- </TR>
- </TABLE>
- </form>
- </logic:present>
- </body>
6 分页栏参数的维持
两个问题
[1]insert update delete都是调用了默认的分页函数进行查询 如果用户不是从第一页的数据列表中单击修改按钮 那么用户在修改完成后返回的页面就会显示第一页的数据 而不是之前显示的那一页 问题的原因是在执行增加 修改 删除操作时没有保存用户在列表页中选择的分页栏的参数
为了解决这个问题 我们在需要为增加 修改 删除的代码维持分页的参数
首先在Constants中定义一个Session常量 用作在Session中保存用户分页的信息
- public final static String PAGER_ADDRESS = "pager_address";
然后 在AddressAction.java的list()函数中保存用户的分页信息pageForm到Session中
- request.getSession().setAttribute(Constants.PAGER_ADDRESS,pageForm);
这样 就可以从Session中取得分页信息 在insert update delete中取出用户在列表页中设置的pageSize pageNo的数值 改用调用AddressDAO.java中的第二个分页函数进行查询
- // get pageForm from session
- PageForm pageForm = (PageForm)getSession(request, Constants.PAGER_ADDRESS);
-
- // get pager form list page
- Pager pager = addressDAO.findPagerByUsername(username, pageForm
- .getPageSize(), pageForm.getPageNo());
- request.setAttribute("addressList", pager.getResultList());
- request.setAttribute("pager", pager);
[2]在增加 修改界面中单击 返回 时的分页参数丢失
在执行增加 修改操作后 若直接返回择业没有保持分页设置信息 此时我们需要新定义一个函数back() 以与list()函数区分 首先在address_add.jsp和address_edit.jsp页面中返回地址
- <a href="address.do?method=list">
- 改为
- <a href="address.do?method=back">
在AddressAction.java增加一个函数back() 用于执行返回时的页面请求 首先从Session中取得当前登录的用户名及分页信息pageForm 根据这两个对象的参数值 调用ActionDAO.java的第二个分页查询函数执行数据查询 然会返回列表页即可
- public ActionForward back(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- if (isTimeout(request)) {
- return mapping.findForward(Constants.INDEX_KEY);
- }
- String username = getUsername(request);
-
- PageForm pageForm = (PageForm)getSession(request, Constants.PAGER_ADDRESS);
-
- // get pager
- Pager pager = addressDAO.findPagerByUsername(username, pageForm
- .getPageSize(), pageForm.getPageNo());
-
- // set addressList
- request.setAttribute("addressList", pager.getResultList());
-
- // set pager
- request.setAttribute("pager", pager);
-
- // save session
- setSession(request, Constants.PAGER_ADDRESS, pageForm);
-
- ActionForward forward = mapping.findForward(Constants.LIST_KEY);
- return (forward);
- }
与list()不同的是 back()函数的pageForm是从Session中取得对象 list()是从用户的输入表单中取得的 这就是添加back()函数的原因
阅读(2955) | 评论(0) | 转发(0) |