JSP自定义标签查询多条数据
JSP自定义标签admin 发布于:2015-11-18 17:10:18
阅读:loading
在说这个查询列表标签之前,我认为有必要先看看另一篇文章,查询一条明细数据的标签 ,同之前的一样,先给出参数定义,然后再根据参数与查询需求给出逻辑实现图,围绕图再介绍一下每个参数的意义,图片参考如下:
sql:查询列表的sql语句;
sqlKey:sql语句的映射,可配置sql,然后自己提供映射实现,与sql参数两者选其一中,如果两种参数都有,则优先取本参数;
javaBeanClassName:将查询列表的结果集中的每条数据转换为实体类型对象,可选参数,如为空,则将每条数据转换为map类型;
notDataTip:如果查询无记录时,判定此参数是否存在数据,如果存在数据则使用数据替换标签内容体数据;
maxLens:如果查询有记录时,判定此参数是否存在数值,如果存在则判断记录数是否大于此值,如果大于截取最大显示数据数量;
var:将查询出的List<Bean | Map<String , Object>>类型对象存储至pageContext范围内,配合jstl标签进行处理。
1、导入标签库自不必说
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="my" uri="/tags"%>
2、查询一个下拉框
<select>
<option>—请选择:—</option>
<my:queryList var="menuList"
sql="SELECT menuid 'menuId' , menuname 'menuName' FROM sysmenu">
<c:forEach items="${menuList }" var="item">
<option value="${item.menuId }">${item.menuName }</option>
</c:forEach>
</my:queryList>
</select>
3、查询一个列表
<table width="300" border="1" style="border-collapse: collapse;">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>出生日期</th>
</tr>
</thead>
<my:queryList var="menuList"
sql="SELECT
menuid 'menuId' ,
menuname 'menuName' ,
createdate 'createDate'
FROM
sysmenu
ORDER BY
menuid limit 1,10" >
<c:forEach items="${menuList }" var="sysMenu">
<tr>
<th>${sysMenu.menuId }</th>
<td>${sysMenu.menuName }</td>
<td>${fn:substring(sysMenu.createDate,0 , 11) }</td>
</tr>
</c:forEach>
</my:queryList>
</table>
4、查询一个列表,当没有数据时显示默认的提示信息
<table width="300" border="1" style="border-collapse: collapse;">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>出生日期</th>
</tr>
</thead>
<my:queryList var="menuList"
sql="SELECT * FROM sysmenu where 1=2"
noDataTip="<tr><td colspan='3' align='center'>没有查询到数据!</td></tr>"
>
<c:forEach items="${menuList }" var="sysMenu">
<tr>
<th>${sysMenu.menuId }</th>
<td>${sysMenu.menuName }</td>
<td>${fn:substring(sysMenu.createDate,0 , 11) }</td>
</tr>
</c:forEach>
</my:queryList>
</table>
5、查询一个列表,从逻辑上控制只显示前5条数据
<b>数据库共有数据
<my:queryOne var="item" sql="select count(*) 'totalCount' from sysmenu">
<label style="color:red;">${item.totalCount }</label></my:queryOne>
条,查询时不设置返回最多的记录数,截取显示前5条
</b>
<table width="300" border="1" style="border-collapse: collapse;">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>出生日期</th>
</tr>
</thead>
<my:queryList var="menuList"
sql="SELECT * FROM sysmenu"
maxLens="5"
>
<c:forEach items="${menuList }" var="sysMenu">
<tr>
<th>${sysMenu.menuId }</th>
<td>${sysMenu.menuName }</td>
<td>${fn:substring(sysMenu.createDate,0 , 11) }</td>
</tr>
</c:forEach>
</my:queryList>
</table>
6、查询列表标签,以上各个参赛均可以相配合使用,至于javaBeanClassName参数的使用与此一致,不多说
此种实现方案存在的问题与解决办法:参考查询明细标签的介绍。
此种实现方案是从实践中总结得出的,发现一般的业务需求完全没有问题,也支持标签之间的嵌套,比如查询一个列表标签,<c:forEach>循环时再循环嵌套查询条件,都是没有问题的。代码实现比较简单,实现的处理逻辑都已经说清楚了,至于自己实现起来应该是完全可以,由于标签处的代码继承体系稍微有点多,我就不具体整理代码,需要的留言,我单独发吧。如果非要有个运行效果,参考下图:
说明:
(1)当前示例原始为JSP页面的动态示例,可从博客V1版本中开放的源码中获取,dmeo页面路径为“/demo/myTag/queryList.jsp”;
(2)实际上queryOne与queryList标签实现逻辑一样,可以通用;
点赞