displaytag 动态列实现
这种动态列的实现方法来自displaytag-examples-1.2.war提供的示例中,实际上下载下来的zip文件中不仅有各种jar包,还有这个包含各种例子的war包,是学习displaytag的非常好的资料。
献上完整代码:
<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net/el"
xmlns:c="urn:jsptld:http://java.sun.com/jstl/core">
<jsp:directive.page contentType="text/html; charset=UTF-8" />
<jsp:directive.page import="org.displaytag.sample.*" />
<jsp:include page="inc/header.jsp" flush="true" /> <jsp:scriptlet> // available column sets should be managed in the backend, not in the jsp page.
// you just need to build a list with Maps containing standard column attributes java.util.Map email = new java.util.HashMap();
email.put("property", "email");
email.put("title", "email title"); java.util.Map date = new java.util.HashMap();
date.put("property", "date");
date.put("title", "date");
date.put("sortable", Boolean.TRUE); java.util.Map money = new java.util.HashMap();
money.put("property", "money");
money.put("title", "money");
money.put("format", "{0,number,000.00 €}"); java.util.List set1 = new java.util.ArrayList();
java.util.List set2 = new java.util.ArrayList();
java.util.List set3 = new java.util.ArrayList(); set1.add(email);
set1.add(date);
set1.add(money); set2.add(money);
set2.add(email); set3.add(date);
set3.add(date); // this is the logic for choosing a column set
// should be done in a controller/viewer helper, not in the jsp String choose = request.getParameter("set");
if ("3".equals(choose))
{
request.setAttribute("collist", set3);
}
else if ("2".equals(choose))
{
request.setAttribute("collist", set2);
}
else
{
request.setAttribute("collist", set1);
} // just prepare the usual list
request.setAttribute( "test", new TestList(10, false) ); </jsp:scriptlet> <h2>Using predefined column lists</h2> <p>This example shows how a predefined set of columns can be applied to a table.</p>
<p>All you have to do is feeding the table with a list of beans/Maps which contains the needed column attributes and
create the needed <code><![CDATA[<display:column>]]></code> tags and use a simple iteration directly in the jsp</p>
<p>In this page we create three different set of colums, implemented as Lists of Maps, directly in the jsp. Obviously,
you will probably want to configure them in a db, xml file, or any other source for a real use (Spring xml files could
be an easy and flexible solution). No dipendence on displaytag-specific classes is required in your application, since
you can simply use a plain Map or implement a custom bean.</p>
<p>Click on a column set below to see it applied to the table.</p> <br />
<br /> <ul id="stylelist">
<li><a href="example-columnlist.jsp?set=1">column set 1</a></li>
<li><a href="example-columnlist.jsp?set=2">column set 2</a></li>
<li><a href="example-columnlist.jsp?set=3">column set 3</a></li>
</ul> <br />
<br /> <display:table name="test">
<c:forEach var="cl" items="${collist}">
<display:column property="${cl.property}" title="${cl.title}" sortable="${cl.sortable}" format="${cl.format}" />
</c:forEach>
</display:table> <jsp:include page="inc/footer.jsp" flush="true" /> </jsp:root>
整个逻辑非常简单,下面是我的分析:
(1)首先是整个例子由于非常简单,所以将数据层,控制层,显示层都放在了一个jsp文件中了,文件中也提到了实际上是不应该这么做的。
(2)再想一想到底什么是动态列?首先是同一个jsp页面(如果是不同的jsp页面,直接就是静态的就可以得到不同的显示效果),不同的时候(一般是根据不同的人具有不同的权限,额这是我猜的)得到的显示结果不一样(是指得到的结果具有不一样的列,但是其bean数据还是一样的,只是显示bean的不同属性)
(3)而我们正常情况下的操作就是<display:table></display:table>中包含若干个我们要显示的bean属性,也就是列名。我们发现<display:column>的结构是非常相似的,于是我们可以使用<c:forEach>循环输出我们想要的<c:column>即可
(4)如果要达到动态列的效果,关键在于控制<c:forEach>所遍历的集合,分析上述代码,知道该集合是一个Set,其元素是一个个Map元素。每一个Map元素对应一个bean属性,也就是一列。这个Map元素由若干个名值对组成,每个名值对就是<c:column>中的一个属性。
(5)剩下的就是点击页面上的按钮,传递不同的参数,由后台控制Set集合到底包含哪些列。还有一点需要注意,就是显示的时候,在遍历Set集合时,<c:column>中的属性必须写全,它应该包含所有的Map元素可能包含的所有属性,并不是所有的Map元素都包含同样的属性。
(6)了解了整个原理之后,在应用这个动态列的时候,最主要的反而是控制层的实现,就是说到底什么时候显示哪些列,其他时候又是显示另一些列,这必须做成容易扩展的,因为这是一个非常容易变化的需求点,甚至于突然增加一种情况。可以考虑XML文件,或者数据库保存。
displaytag 动态列实现的更多相关文章
- Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色
上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数 ...
- extjs动态树 动态grid 动态列
由于项目需要做一个动态的extjs树.列等等,简而言之,就是一个都是动态的加载功能, 自己琢磨了半天,查各种资料,弄了将近两个星期,终于做出来了 首先,想看表结构,我的这个功能需要主从两张表来支持 代 ...
- Easy DataGrid 实现动态列、行
Easy DataGrid 实现动态列.行 前端代码: <title>展示销售的实时数据</title> <script type="text/javascri ...
- 记React+.NetCore API实现动态列导出
1.效果演示 2.用到的第三方类库 前端:React,Dva,Antd 后端:ASP.NET CORE,System.Linq.Dynamic.Core,EPPlus.Core 3.基本思路 第一:E ...
- datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)
datatable动态列处理,重绘表格 前言:至于动态列的绘画,我前面博客已经写过了,就是动态列的配置问题,不懂的去我博客看下,今天要写的呢,就是你已经写了一个动态列在datatable,现在你想重新 ...
- [转]bootstrap table 动态列数
原文地址:https://my.oschina.net/u/2356355/blog/1595563 据说bootstrap table非常好用,从入门教程中了解到它的以下主要功能: 由于固定表头意味 ...
- jquery.dataTables动态列--转
转自 https://www.cnblogs.com/lyeo/p/4765514.html jquery.dataTables 版本1.10.7 直接上代码: 0.table <table ...
- jquery.dataTables动态列
jquery.dataTables 版本1.10.7 直接上代码: 0.table <table id="popReportTable"> <thead> ...
- SQL Server中动态列转行
http://www.cnblogs.com/gaizai/p/3753296.html 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现 ...
随机推荐
- 搭建Memcached + php 缓存系统
服务器环境,Centos6.5 1.安装Memcached服务端 Yum -y install memcached 2.配置Memcached服务端用户以及自动启动服务等 将服务配置成自启动 chkc ...
- JSP网页防止sql注入攻击
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使 ...
- Python中else语句块(和if、while、for、try搭配使用)
学过C/C++的都知道,else语句是和if语句搭配使用的, 但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用.下面逐个进行介绍: ...
- 开源一套DirectUI界面库
http://www.cppblog.com/weiym/archive/2012/07/03/181307.html
- dos命令弹出对话框---Msg命令详解
标签: dos批处理对话框 2015-11-12 17:20 497人阅读 评论(0) 收藏 举报 脚本(30) 版权声明:本文为博主原创文章,未经博主允许不得转载. dos命令弹出对话框---Ms ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- Set的并集
public static void main(String[] args) { Set<Long> old = new HashSet<>(); for (int i = 0 ...
- 最全的TV视频应用合集,包含50多款客户端,有丰富直播点播
这是我目前找到的 最好的视频应用合集,与坛友分享下.有50多款视频客户端,基本覆盖目前市面上口碑比较好的视频应用了. 里面有丰富的直播客户端,像 龙龙直播.泰捷直播.果子 Tv.More Tv等,还有 ...
- cursor: pin S
declare v_sql varchar2(200); begin loop v_sql :='select seq1.nextval from dual'; execute immediate v ...
- Linux系统编程(27)——线程控制
进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,那么如何在一个进程的地址空间中执行多个线程呢.有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比 ...