订单系统实现分页功能的思想是,
1、在后台,拼接html代码。
2、写数据到磁盘(即浏览器)。
3、前台,html代码里的js函数实现跳转功能。
<tr bgcolor="b0a697" align="center"> <td class="prettypetMnu prettypetMnuLink" url="/member/design/index.jsp?custCate=W">NEW DESIGN</td> <td class="prettypetMnu prettypetMnuHover curr" url="/member/prod/index.jsp?cate=&subCate=&custCate=W">ALL DESIGN</td> <td class="prettypetMnu prettypetMnuLink" url="/member/promote/index.jsp?custCate=W">PROMOTION</td> <td class="prettypetMnu prettypetMnuLink" url="/member/catalog/index.jsp">CATALOG</td> <td class="prettypetMnu prettypetMnuLink" url="/member/index.jsp">MY ACCOUNT</td> </tr>
<!-- 定义包 member,处理会员信息 --> <package name='bizProd' extends='member' extended-ns='prod' default='/json.jsp' package='com.ppet.prod'> <actions class='.CustProductAction'> <action name='index' handler='shell' method='list'> <result>index.jsp</result> <param name='viewMode' value='IMG'/> </action> <!-- <action name='listClothes' method='list'><result>listClothes.jsp</result></action> <action name='listBed' method='list'><result>listBed.jsp</result></action> <action name='listCarrier' method='list'><result>listCarrier.jsp</result></action> <action name='listHarness' method='list'><result>listHarness.jsp</result></action> <action name='viewProduct' method='edit'><result>viewProduct.jsp</result></action> --> <action name='list' method='list'><result>list.jsp</result></action> <action name='image' method='list'><result>image.jsp</result></action> <action name='view' method='edit' handler='prod'><result>view.jsp</result></action> <action name='quick-view' method='edit'><result>quick-view.jsp</result></action> <action name='retrieve' method='retrieve'/> <action name='listView' handler='prod' method='list'><result>index.jsp</result><param name='viewMode' value='LIST'/></action> </actions> <action name='size-chart' handler='prod'><result>size-chart.html</result></action> <actions class='com.ppet.inv.CustStockAction'> <action name='stock-index' handler='prod' ><result>../stock/index.jsp</result></action> <action name='stock-list' ><result>../stock/list.jsp</result></action> </actions> </package>
//XXXAction.java
/** * 获取产品列表 * @return 结果页面字符串 * @throws Exception */ public String list() throws Exception { CustProdCondBuilder cb = new CustProdCondBuilder(); list(handler, cb, ProductOrderFactory.INST, lstAction); request.setAttribute("frmCustProdSearch", getModel()); HttpSession session = request.getSession(); System.out.println(session.getAttributeNames()); return SUCCESS; }
//XXXAction的父类.java
/** * 1.获取记录集<br> * 2.把表单Bean列表设置为请求作用域的属性<p> * @param handler * 持久化层 * @param cb * 条件构建器 * @param factory * 排序类 * @param ac 获取列表 * @return 成功或失败 * @throws Exception */ protected <T extends Storable, V extends PagedSearchForm> String list( DataHandler<T> handler, JsonCondBuilder<V> cb, AbstractOrderFactory factory, ListAction ac) throws Exception { V form = (V) getForm(); // doBeforeList(form); cb.build(form); OrderBy ob; if (form.sort != null && form.sort.length() > 0) { ob = form.convertByCol(factory); } else { ob = form.convertBy(factory); } BeanSet<T> bs = doRetrieve(handler, cb, ob, form); synchronized (ac) { ac.listed(this, this, bs, ob); } return SUCCESS; }
/** * 将结果保存到 request 当中 * * @author fantasy * */ protected static class RequestListAction implements ListAction { String bsVar; String lstVar; public RequestListAction(String name) { bsVar = "bs" + name; lstVar = name + "s"; } public <T extends Storable> void listed(JsonActionSupport act, JsonMngActionSupport action, BeanSet<T> bs, OrderBy ob) { HttpServletRequest request = act.getRequest(); request.setAttribute(bsVar, bs); request.setAttribute(lstVar, bs.elements()); request.setAttribute("orderBy", ob); } }
<% List<Product> lst = (List<Product>) request .getAttribute("Products"); // 判断产品列表是否为空 if (lst.isEmpty()) { request.getRequestDispatcher("empty.jsp").include(request, response); return; } List<List<Product>> rows = ListUtil.listToListOfList(lst, 5); PageWriter pw = PageWriter.getInstance(pageContext, "bsProduct"); pw.setTitleVisible(false); pw.setPageCount(10); pw.setJumpButton(false); pw.setNav("prod"); pw.setFixedNumber(false); pw.setTotalMsgKey("prod.pages"); pw.setTotalVisible(false); pw.setEmbraced(false); %>
<div id='div_page1' style='float: right'> <% pw.write(); %> </div>
在这里,1)拼接分页功能的html代码。2)写数据到浏览器客户端(即发送响应数据html代码到浏览器客户端)。
剩下的就是,在前台实现html代码里的js函数来实现跳转功能。
private void writeImpl() throws JspException, IOException { JspWriter out = pageContext.getOut(); out.println(build()); }
private String buildImpl(BeanSet<?> bs,HttpServletRequest request)throws JspException, IOException{ StringBuffer sb=new StringBuffer(); int iCurPage=bs.getCurrentPage(); int iMaxPage=bs.getPageCount(); int rowCount=bs.getRowCount(); String sStyleClass=(styleClass==null?"":" class='"+styleClass+"'"); if(form!=null ){ sb.append("<form name=\""+form+"\" method='GET' onsubmit=\"return "+doJump+"(this.page.value)\">"); } sb.append("<table cellpadding=0 cellspacing=0 border=0>"); sb.append("<tr>"); if(rowCount>0){ Locale loc=getLocale(request); String total=null; NavButtonProvider navProvider=null; if(nav!=null){ navProvider=navs.get(nav); } if(navProvider==null){ navProvider=navBtnProvider; } if((navProvider==null || navProvider.isTitleVisible())){ total=mergeTotal(rowCount,iMaxPage,loc); } if(total!=null){ if(crlf ){ sb.append("<td"+sStyleClass+" align='"+align+"' colspan=").append(fixedNumber?3:2).append(">").append(total).append("</td></tr><tr><td"+sStyleClass+" >"); }else{ sb.append("<td"+sStyleClass+" noWrap>").append(total).append("</td><td"+sStyleClass+" noWrap>"); } }else{ sb.append("<td"+sStyleClass+" noWrap>"); } NavBarNumber nav=getNav(loc); synchronized(nav){ nav.setPageContext(pageContext); nav.setPageCount(iMaxPage); //页面总数 nav.setCurPage(iCurPage); nav.setMaxPage(iMaxPage); //同上 nav.setFixedNumber(fixedNumber); nav.setDoJump(doJump); nav.setHrefClass(hrefClass); nav.setColorOfCurrPageNo(currPageColor); if(navProvider!=null){ nav.setNavButton(navProvider); } nav.setShowTotal(totalVisible); boolean e=nav.isEmbraced(); nav.setEmbraced(embraced); sb.append(nav.build()); nav.setEmbraced(e); nav.setNavButton(navBtnProvider); nav.setShowTotal(true); } sb.append("</td><td noWrap>"); if(jumpButton){ JumpButtonProvider jumpProvider=null; if(jump!=null){ jumpProvider=jumps.get(jump); } if(jumpProvider==null){ jumpProvider=jumpBtnProvider; } sb.append(" <input type='text' name='page' value='"+iCurPage+"' "+jumpProvider.getBoxStyle()+"> </td><td noWrap> "); sb.append(jumpProvider.getButton()); } } sb.append("</td>"); sb.append("</tr>"); sb.append("</table>"); if(form!=null){ sb.append("</form>"); } return sb.toString(); }
---------
拼接的html代码,如下:
<html> <head></head> <body> <form name="frmJump" method="GET" onsubmit="return doJump(this.page.value)"> <table cellpadding="0" cellspacing="0" border="0"> <tbody> <tr> <td nowrap="">51 Items Found in 2 Pages:</td> <td nowrap=""> <table cellpadding="0" cellspacing="0" width="100%" align="center"> <tbody> <tr> <td> <img src="/img/btn_pageprev02.gif" border="0" name="navBtnFirst" /> </td> <td> <img src="/img/btn_pageprev01.gif" border="0" name="navBtnPrev" /> </td> <td> <font color="red">1</font> <a href="#" onclick="javascript:doJump(2);return false;" title="跳转到第 2 页">2</a> </td> <td> <a href="#" onclick="javascript:doJump(2);return false;" title="跳转到第 2 页"><img src="/img/btn_pagenext01.gif" border="0" name="navBtnNext" /></a> </td> <td> <a href="#" onclick="javascript:doJump(2);return false;" title="跳转到第 2 页"><img src="/img/btn_pagenext02.gif" border="0" name="navBtnNext" /></a> </td> </tr> </tbody> </table></td> <td nowrap=""></td> </tr> </tbody> </table> </form> </body> </html>