前段時間忙於做項目,在使用DWZ過程中,發現有些代碼的重複度挺大,所以工作空閒之餘,寫一下分頁排序的Demo,並且使用自定義標籤簡化重複的代碼。(發現越來越多的人關注該框架了,因爲是國產,可以更快的上手)
源碼下載
http://download.csdn.net/detail/tcl_6666/6680323
分頁思路
服務器返回當前頁的數據,總條數,再由js來生成分頁標籤。分頁是配合服務器端來處理的, 不是純js做的分頁。
因爲如果數據量很大,比如有好幾百頁,存js分頁就是悲劇了,純js分頁是必須一次載入所有數據,性能很慢。
通過自定義標籤,封裝原有的pagerForm
對於DWZ的使用者,衆所周知下面是分頁的主要參數,這些參數都在放在pagerForm中的
targetType:navTab或dialog,用來標記是navTab上的分頁還是dialog上的分頁
totalCount: 總條數
numPerPage: 每頁顯示多少條
pageNumShown: 頁標數字多少個
currentPage: 當前是第幾頁
通過自定義標籤,封裝原有的pagerForm
paginationForm.tag
<%@tag language="java" pageEncoding="UTF-8"body-content="scriptless" trimDirectiveWhitespaces="true"%>
<!--自定義標籤 屬性 -->
<%@attribute name="action" type="java.lang.String"required="true"%>
<%@attribute name="onsubmit" type="java.lang.String"%>
<%@taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<formid="pagerForm" method="post" action="${action }"
<c:iftest="${onsubmit!=null}"> οnsubmit="${onsubmit}"</c:if>>
<inputtype="hidden" name="pageNum"value="${pageNum}"/>
<inputtype="hidden" name="numPerPage"value="${numPerPage}"/>
<inputtype="hidden" name="orderField"value="${orderField}"/>
<inputtype="hidden" name="orderDirection"value="${orderDirection}"/>
<jsp:doBody/>
</form>
自定義標籤,封裝原有的<divclass="pages">和<div class="pagination"
pagination.tag
<%@tag language="java" pageEncoding="UTF-8"trimDirectiveWhitespaces="true"%>
<%@attribute name="page" type="com.dwz.util.Page"required="true"%>
<%@attribute name="pageNumShown" type="java.lang.Integer"%>
<%@attribute name="begin" type="java.lang.Integer"%>
<%@attribute name="end" type="java.lang.Integer"%>
<%@attribute name="step" type="java.lang.Integer"%>
<%@attribute name="target" type="java.lang.String"%>
<%@attribute name="rel" type="java.lang.String"%>
<%@attribute name="onchange" type="java.lang.String"%>
<%@taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<c:iftest="${pageNumShown == null}" >
<c:setvar="pageNumShown" value="10"/>
</c:if>
<c:iftest="${begin == null}" >
<c:setvar="begin" value="10"/>
</c:if>
<c:iftest="${end == null}" >
<c:setvar="end" value="50"/>
</c:if>
<c:iftest="${step == null}" >
<c:setvar="step" value="5"/>
</c:if>
<c:iftest="${target == null}" >
<c:setvar="target" value="navTab"/>
</c:if>
<c:iftest="${onchange == null}" >
<c:setvar="onchange"value="navTabPageBreak({numPerPage:this.value})"/>
</c:if>
<divclass="panelBar">
<divclass="pages">
<span>每頁顯示</span>
<selectname="numPerPage" οnchange="${onchange}">
<c:forEachbegin="${begin }" end="${end }" step="${step }"varStatus="s">
<c:choose>
<c:whentest="${numPerPage==s.index }">
<optionvalue="${s.index}"selected="selected">${s.index}</option>
</c:when>
<c:whentest="${numPerPage!=s.index }">
<optionvalue="${s.index}">${s.index}</option>
</c:when>
</c:choose>
</c:forEach>
</select>
<span>總條數:${totalCount}</span>
</div>
<div<c:if test="${rel!=null }">rel="${rel}" </c:if>class="pagination" targetType="${target}"totalCount="${totalCount}" numPerPage="${numPerPage}"pageNumShown="${pageNumShown}"currentPage="${pageNum}"></div>
</div>
注意:
在自定義jsp標籤時,tag文件默認需要放到WEB-INF目錄下
引入自定義標籤和jstl
include.inc.jsp
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions"prefix="fn"%>
<%@taglib prefix="custom" tagdir="/WEB-INF/tags" %>
<c:setvar="contextPath"value="${pageContext.request.contextPath}"/>
在userList中可以看到簡化後的效果
<%@pagecontentType="text/html; charset=utf-8"%>
<%@include file="/page/common/include.inc.jsp"%>
<!-- 自定義標籤封裝pagerForm,簡化分頁 -->
<custom:paginationForm action="${contextPath}/user!userList.action">
<input type="hidden" name="keywords"value="${keywords }"/>
</custom:paginationForm>
<formmethod="post" action="${contextPath }/user!userList.action"οnsubmit="return navTabSearch(this)">
<divclass="pageHeader">
<divclass="searchBar">
<label>登錄名稱:</label><inputtype="text" name="keywords" value="${keywords}"><buttontype="submit">檢索</button>
</div>
</div>
</form>
<divclass="pageContent">
<divclass="panelBar">
<ulclass="toolBar">
<li><aclass="add" href="user!dosave.action"target="dialog"mask="true"><span>添加</span></a></li>
<!-- 用於數組傳送數據 -->
<li><atitle="確實要刪除這些記錄嗎?" target="selectedTodo"rel="ids" href="user!del.action"class="delete"><span>刪除用戶</span></a></li>
<li><aclass="edit" href="user!dosave.action?userId={sid_user}"target="dialog" mask="true"warn="請選擇一個用戶"><span>修改</span></a></li>
</ul>
</div>
<divlayoutH="116" id="w_list_print">
<tableclass="table" width="98%" targetType="navTab"asc="asc" desc="desc">
<thead>
<tr>
<th><inputtype="checkbox" group="ids"class="checkboxCtrl"></th>
<th orderField="id" <c:if test="${orderField=='id'}">class="${orderDirection}"</c:if> title="排序">編號</th>
<th>用戶姓名</th>
<th>用戶密碼</th>
<th>是否是管理員</th>
<thorderField="staff_id" <s:iftest="orderField=='staff_id'">class="${orderDirection}"</s:if>>staff-id</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEachvar="user" items="${userList}">
<trtarget="sid_user" rel="${user.id}">
<td><inputname="ids" value="${user.id}"type="checkbox"></td>
<td>${user.id}</td>
<td>${user.loginName}</td>
<td>${user.passWord}</td>
<td>${user.adminInd}</td>
<td>${user.staffId}</td>
<td>
<a title="刪除"target="ajaxTodo" href="user!del.action?ids=${user.id}"class="btnDel">刪除</a>
<atitle="編輯" target="dialog" mask="true"href="user!dosave.action?userId=${user.id}"class="btnEdit">編輯</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<!-- 自定義標籤封裝pagerForm,簡化分頁 -->
<custom:pagination page="${page }"/>
重點是
自定義custom:paginationForm和custom:pagination 標籤中的參數名稱
<inputtype="hidden" name="pageNum"value="${pageNum}"/>
<inputtype="hidden" name="numPerPage"value="${numPerPage}"/>
要和BaseAction的屬性對上
<c:if test='${param.orderField == "name" }'> class="${param.orderDirection}" </c:if>
用來切換 排序圖標和排序類型
BaseAction封裝分頁參數
public class BaseAction extends ActionSupport{
protectedInteger pageNum=1; // 當前是第幾頁
protectedInteger totalCount=0; // 總條數
protectedInteger numPerPage=20; // 每頁顯示多少條
protectedString orderField; // 排序字段
protectedString orderDirection; // 排序方向
。。。。。getter方法和setter方法省略
UserAction通過繼承BaseAction,得到客戶端傳來的數據
publicclass UserAction extends BaseAction{
SysuserDaouserDao = new SysuserDaoImpl();
privateString keywords = "";
protected Integer userId;
protectedSysusers sysusers;
privateString[] ids;
privateList<Sysusers> userList = null;
publicString userList() {
totalCount= userDao.getCout(keywords);
userList= userDao.userList(keywords,pageNum,numPerPage,orderField,orderDirection);
return"list";
}
效果圖
加入自定義分頁實體類
如果要加入自定義的分頁實體,通過注入(對象.屬性,比如
<input type="hidden" name="page.pageNum" value="${page.pageNum}"/>)方式應該可以完成,但在試驗過程中,發現分頁js還會用到分頁屬性,如果把name改爲page.pageNum,js會根據這個name進行分頁,也就是說這個input有兩處會用到。
而更改之後,分頁就不起作用了。導致不能加入自己的分頁實體,這是在struts2中。不過應該通過修改dwz的js代碼可以解決這個問題。
如果是springmvc,不用對象.屬性方式,直接使用原生的屬性名稱,也可以注入到controller類中的方法中的實體參數中。這也是struts2和springmvc的一大區別。
在開發過程中,DWZ是我負責的一部分,我需要搭起一個模型來,別人用時只需要按照我定義的規範做就是了。這是DWZ的分頁規範,下面我會介紹DWZ的異常處理信息規範。