DWZ (JUI) 应用实例(一):通过自定义标签和BaseAction 简化 table 分页排序

本文主要是介绍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的异常处理信息规范。

 

这篇关于DWZ (JUI) 应用实例(一):通过自定义标签和BaseAction 简化 table 分页排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828336

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、