DWZ (JUI) 應用實例(一):通過自定義標籤和BaseAction 簡化 table 分頁排序

 

前段時間忙於做項目,在使用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中。不過應該通過修改dwzjs代碼可以解決這個問題。

 

如果是springmvc,不用對象.屬性方式,直接使用原生的屬性名稱,也可以注入到controller類中的方法中的實體參數中。這也是struts2springmvc的一大區別。

 

在開發過程中,DWZ是我負責的一部分,我需要搭起一個模型來,別人用時只需要按照我定義的規範做就是了。這是DWZ的分頁規範,下面我會介紹DWZ的異常處理信息規範。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章