- 浏览: 639594 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
liuche20083736:
非常好
从问题看本质: 研究TCP close_wait的内幕 -
xiaopohai85707:
优化算法与原来需求不符
过滤字符的性能调优?挤一挤还是有的 -
kmy_白衣:
生成的area图有时候 标签的数值和图标上看上去的数值不一致。 ...
OpenFlashChart2之恶心文档 -
tom&jerry:
大神,请教一个问题,按名称排序为何无效,用的2.4.3 XPA ...
深入浅出jackrabbit之十三 查询之AST和QT -
jd2bs:
改成精确匹配可以了< filter-mapping &g ...
细谈Ehcache页面缓存的使用
/**
*作者:张荣华(ahuaxuan)
*2007-07-09
*转载请注明出处及作者
*/
[size=11]强强连手, 看Freemarker和displaytag的结合
这个周末搬家,从金桥搬到了上南这边,然后又去买洗衣机空调之类,两天下来,把人整得叫一个累,还不如舒舒服服的坐在椅子上写代码呢。一切搞定之后脑海中有想起了现在手头上的做的事,如何尽可能的简化框架,目的只有一个,减少使代码量。
我比较推崇在view层使用模板技术,但是如果使用模板的话分页如果没有较好的封装将会给程序员带来很多bad small的代码,但是现在由于人力和物力的关系又没有时间去开发一个比较完善方便的分页的marco,所以想到把现有的比较完善的分页组件引入到freemarker中去,由于displaytag之前曾经用过,所以就选择了它,google了一下,发现网上没有类似的介绍,大家不写那就我来写吧。
首先简要介绍一下这两个技术吧:
Displaytag是一个很好的分页标签,它支持数据库端分页(在displaytag1.1的版本中也实现了数据库端分页,只要实现PaginatedList接口,然后把这个对象扔到页面上的display:table标签中就能实现数据库端分页。这里所说的数据库端分页就是displaytag文档中提到的partial list),排序,也支持导出各种文件,比如说pdf,excel等等,而且它还支持程序员使用decorator模式来包装和更改要输出的model的属性,等等。
而freemarker是一个很好的模板引擎,它被设计的目的就是被用在view层,通过模板来生成html页面,在动态页面中使用模板技术的目的就是分离页面设计者和程序员的职责,而且模板的速度更快,尤其是无需编译这种特性,模板的优缺点及freemarker和velocity的比较见http://www.iteye.com/topic/71430。(题外话:有人可能不同意我的观点,但我仍然相信术业有专攻,每个人都有自己强的一方面,以前在看robbin的一个就业ppt中,感觉有一句话说得特别好,什么叫成功:成功不是弥补自己的不足,而是把自己的优点发挥到及至,这样就能够成功。)
这两个都是口碑很好的开源项目,让我觉得放弃他们中的任何一个都是非常可惜的,在使用模板语言的时候,如果不用displaytag(或者其他分页的tag),那么必须得自己写marco来实现分页的功能,其实就是用freemarker或者velocity模板语言把分页的功能又写了一遍,可以也是可以的,只是要花一些人力物力,说白了就是实现同样的功能却要花更多的钱和时间,在做外包的时候这样尤其不可取了(当然个人学习研究就另当别论了),那么在企业应用开发中如果把两者结合起来应该是一个不错的选择,这样既拥有了模板语言的优势又能只用几行代码就搞定分页排序等功能,两全其美,一举两得,快哉。
那么让我们来看一下步骤:
1, 在web.xml导入FreemarkerServlet的配置
2,在页面模板中导入jsptag的tld声明(这一步貌似和jsp中tag的声明一样)
3, 接下来就是使用displaytag了,前面那两步freemarker的文档上有详细的说明,大家只要在文档的索引页面上查找”tag”就能找到了,但是在第三步就要注意点问题了,也就是把PaginatedList实现的对象实例扔到模板里时要注意的事项。
(1)在<@display.table的name属性中不要再使用${},直接写PaginatedList的对象引用就可以了,比如说直接写name=”customers”而不要写成name=”${customers}”
(2)不要导入displaytag-el.tld,直接导入displaytag.tld就可以了。
(3)<@display.table>和<@display.column>中的布尔类型不能使用字符串,我们在jsp中直接使用diplaytag的使用应该是使用字符串,但是在模板中就不能这样写了,而应该使用模板语言的写法,布尔值就直接写布尔值,比如说export=true,而不能写export=”true”,这样肯定会抛参数不匹配的异常。
(4)注意在<@display.column中使用html语句的使用记得把escapXml属性设置为false,否则displaytag会对其进行转义,freemarker貌似不会默认给其进行转义,除非使用freemarker的转义命令(velocity的html转义是要通过配置velocity.properties来实现,而且它直接调用了apache common包中的转义操作,这样会默认对2字节以上的字符串都进行转义,于是中文都变成了符号,浏览器能解析而人却不能直接阅读,而spring中的转义方法就没有这个问题)。
下面是一个例子:
依照上面这些步骤,我相信感兴趣的同学很快就能在freemarker中使用displaytag了,虽然我在freemarker中使用了displaytag,但是这并不意味着我支持在freemarker任意使用jsptag的观点,比如一些freemarker本身就带有的功能,判断,循环,日期格式化等等这些根本不需要导入tag,而且我也反对在页面中使用其他input的tag,虽然这样能够带来客户端验证的优点,但是事实上基于js验证的客户端框架现在也不少,没有必要为了这个理由把页面上弄得到处都是@ww,而且使用theme之后,页面布局更不容易控制,而且最重要的是这样使页面设计者更难介入了(这一观点是基于很多外包公司都有专门的页面团队,他们是专业的页面制作人员,当如果公司里没有这样一支团队,那么上面这个结论就不成立了)。
我知道不同的公司肯定都有自己做法,希望大家能多多发言,多多拍砖。
作者:张荣华,未经作者同意不得随意转载![/size]
displaytag从1.1版本也可以了啊(06年2月份),而且很简单就能实现
当然不管是哪个组件,我想表达的其实是在模板中使用这个组件,不管是displaytag,extremeTable,或者是ec,应该都能整合到freemarker中,这样可以避免重新写很多marco等。
*作者:张荣华(ahuaxuan)
*2007-07-09
*转载请注明出处及作者
*/
[size=11]强强连手, 看Freemarker和displaytag的结合
这个周末搬家,从金桥搬到了上南这边,然后又去买洗衣机空调之类,两天下来,把人整得叫一个累,还不如舒舒服服的坐在椅子上写代码呢。一切搞定之后脑海中有想起了现在手头上的做的事,如何尽可能的简化框架,目的只有一个,减少使代码量。
我比较推崇在view层使用模板技术,但是如果使用模板的话分页如果没有较好的封装将会给程序员带来很多bad small的代码,但是现在由于人力和物力的关系又没有时间去开发一个比较完善方便的分页的marco,所以想到把现有的比较完善的分页组件引入到freemarker中去,由于displaytag之前曾经用过,所以就选择了它,google了一下,发现网上没有类似的介绍,大家不写那就我来写吧。
首先简要介绍一下这两个技术吧:
Displaytag是一个很好的分页标签,它支持数据库端分页(在displaytag1.1的版本中也实现了数据库端分页,只要实现PaginatedList接口,然后把这个对象扔到页面上的display:table标签中就能实现数据库端分页。这里所说的数据库端分页就是displaytag文档中提到的partial list),排序,也支持导出各种文件,比如说pdf,excel等等,而且它还支持程序员使用decorator模式来包装和更改要输出的model的属性,等等。
而freemarker是一个很好的模板引擎,它被设计的目的就是被用在view层,通过模板来生成html页面,在动态页面中使用模板技术的目的就是分离页面设计者和程序员的职责,而且模板的速度更快,尤其是无需编译这种特性,模板的优缺点及freemarker和velocity的比较见http://www.iteye.com/topic/71430。(题外话:有人可能不同意我的观点,但我仍然相信术业有专攻,每个人都有自己强的一方面,以前在看robbin的一个就业ppt中,感觉有一句话说得特别好,什么叫成功:成功不是弥补自己的不足,而是把自己的优点发挥到及至,这样就能够成功。)
这两个都是口碑很好的开源项目,让我觉得放弃他们中的任何一个都是非常可惜的,在使用模板语言的时候,如果不用displaytag(或者其他分页的tag),那么必须得自己写marco来实现分页的功能,其实就是用freemarker或者velocity模板语言把分页的功能又写了一遍,可以也是可以的,只是要花一些人力物力,说白了就是实现同样的功能却要花更多的钱和时间,在做外包的时候这样尤其不可取了(当然个人学习研究就另当别论了),那么在企业应用开发中如果把两者结合起来应该是一个不错的选择,这样既拥有了模板语言的优势又能只用几行代码就搞定分页排序等功能,两全其美,一举两得,快哉。
那么让我们来看一下步骤:
1, 在web.xml导入FreemarkerServlet的配置
<servlet> <servlet-name>freemarker</servlet-name> <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class> <!-- FreemarkerServlet settings: --> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>NoCache</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>ContentType</param-name> <param-value>text/html</param-value> </init-param> <!-- FreeMarker settings: --> <init-param> <param-name>template_update_delay</param-name> <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. --> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>number_format</param-name> <param-value>0.##########</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> org.apache.struts2.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping>
2,在页面模板中导入jsptag的tld声明(这一步貌似和jsp中tag的声明一样)
<#assign display=JspTaglibs["/WEB-INF/tld/display.tld"]>
3, 接下来就是使用displaytag了,前面那两步freemarker的文档上有详细的说明,大家只要在文档的索引页面上查找”tag”就能找到了,但是在第三步就要注意点问题了,也就是把PaginatedList实现的对象实例扔到模板里时要注意的事项。
(1)在<@display.table的name属性中不要再使用${},直接写PaginatedList的对象引用就可以了,比如说直接写name=”customers”而不要写成name=”${customers}”
(2)不要导入displaytag-el.tld,直接导入displaytag.tld就可以了。
(3)<@display.table>和<@display.column>中的布尔类型不能使用字符串,我们在jsp中直接使用diplaytag的使用应该是使用字符串,但是在模板中就不能这样写了,而应该使用模板语言的写法,布尔值就直接写布尔值,比如说export=true,而不能写export=”true”,这样肯定会抛参数不匹配的异常。
(4)注意在<@display.column中使用html语句的使用记得把escapXml属性设置为false,否则displaytag会对其进行转义,freemarker貌似不会默认给其进行转义,除非使用freemarker的转义命令(velocity的html转义是要通过配置velocity.properties来实现,而且它直接调用了apache common包中的转义操作,这样会默认对2字节以上的字符串都进行转义,于是中文都变成了符号,浏览器能解析而人却不能直接阅读,而spring中的转义方法就没有这个问题)。
下面是一个例子:
<@display.table name="products" style="width:70%;" id="product" cellspacing="0" class="table" export=false cellpadding="0" requestURI=""> <@display.column title="${xtt}" escapeXml=false class="columnClass" sortable=true headerClass="headerClass"> <input type="checkbox" name="entityIds" id="entityIds" value="${product.id}"/> </@display.column> <@display.column property="id" escapeXml=true sortable=true title="产品序号" paramId="entityIds" paramProperty="id" url="/product/prepareUpdateProduct.action"/> <@display.column property="serialNumber" escapeXml=true sortable=true title="商品编号"/> <@display.column property="name" escapeXml=true sortable=true title="商品名称"/> <@display.setProperty name="paging.banner.item_name" value="商品"/> </@display.table>
依照上面这些步骤,我相信感兴趣的同学很快就能在freemarker中使用displaytag了,虽然我在freemarker中使用了displaytag,但是这并不意味着我支持在freemarker任意使用jsptag的观点,比如一些freemarker本身就带有的功能,判断,循环,日期格式化等等这些根本不需要导入tag,而且我也反对在页面中使用其他input的tag,虽然这样能够带来客户端验证的优点,但是事实上基于js验证的客户端框架现在也不少,没有必要为了这个理由把页面上弄得到处都是@ww,而且使用theme之后,页面布局更不容易控制,而且最重要的是这样使页面设计者更难介入了(这一观点是基于很多外包公司都有专门的页面团队,他们是专业的页面制作人员,当如果公司里没有这样一支团队,那么上面这个结论就不成立了)。
我知道不同的公司肯定都有自己做法,希望大家能多多发言,多多拍砖。
作者:张荣华,未经作者同意不得随意转载![/size]
评论
6 楼
小卡kare
2013-05-07
华哥威武霸气,时隔6年的6楼。。为我准备的
5 楼
ahuaxuan
2007-07-20
Tin 写道
呵呵,displaytag可不是分页的工具,他是个table组件。
有了extremeComponent的extremeTable为什么还要displaytag呢?
2年前似乎还有人讨论displaytag由于使用遍历List的方式分页造成的性能影响,现在不知道怎么样了。反正ec老早就可以自定义查询分页了。
去看看fins的ecside那个项目如何?
有了extremeComponent的extremeTable为什么还要displaytag呢?
2年前似乎还有人讨论displaytag由于使用遍历List的方式分页造成的性能影响,现在不知道怎么样了。反正ec老早就可以自定义查询分页了。
去看看fins的ecside那个项目如何?
神威如狱 写道
displaytag要是能数据库分页就好多了
displaytag从1.1版本也可以了啊(06年2月份),而且很简单就能实现
ahuaxuan 写道
在displaytag1.1的版本中也实现了数据库端分页,只要实现PaginatedList接口,然后把这个对象扔到页面上的display:table标签中就能实现数据库端分页。这里所说的数据库端分页就是displaytag文档中提到的partial list
当然不管是哪个组件,我想表达的其实是在模板中使用这个组件,不管是displaytag,extremeTable,或者是ec,应该都能整合到freemarker中,这样可以避免重新写很多marco等。
4 楼
Tin
2007-07-20
呵呵,displaytag可不是分页的工具,他是个table组件。
有了extremeComponent的extremeTable为什么还要displaytag呢?
2年前似乎还有人讨论displaytag由于使用遍历List的方式分页造成的性能影响,现在不知道怎么样了。反正ec老早就可以自定义查询分页了。
去看看fins的ecside那个项目如何?
有了extremeComponent的extremeTable为什么还要displaytag呢?
2年前似乎还有人讨论displaytag由于使用遍历List的方式分页造成的性能影响,现在不知道怎么样了。反正ec老早就可以自定义查询分页了。
去看看fins的ecside那个项目如何?
3 楼
神威如狱
2007-07-20
displaytag要是能数据库分页就好多了
2 楼
xfli333
2007-07-19
valuelist
1 楼
kajijiyani
2007-07-19
display缺点太多
初看让人欣喜,仔细研究功能太过不完善!
初看让人欣喜,仔细研究功能太过不完善!
发表评论
-
过滤字符的性能调优?挤一挤还是有的
2010-05-29 05:54 3610/* *auth ... -
Master-Slave,Spring,Hibernate,故事曲折离奇,情结跌宕起伏
2009-02-05 13:49 8684/** *作者:张荣华 *日期 ... -
弃成见,反省,并重新认识struts.i18n.encoding
2008-12-24 15:42 3880[size=medium]之前和大家讨论了struts2.0中 ... -
关键字:查询,事务,粒度
2008-08-22 17:05 5138[size=medium]/** *作者: ... -
看看mina和memcached的联姻(适合不同语言客户端,高并发?)
2008-07-21 17:06 7984[size=medium]/** * 作者:张荣华 * 日 ... -
如何解决mysql的master-slave模式中ReplicationDriver的使用问题
2008-06-19 18:23 8220/** * 作者:张荣华 * 日期:2008-6-19 ... -
别装了,难道你们不想把properties直接注入到object中去(spring-plugin)?
2008-04-09 18:01 3651[size=small]/** *作者:张荣华(ahuaxu ... -
用jamon来监控你的sql执行效率
2008-02-25 15:48 3715/** *作者:张荣华 *日期:2008-2-25 ... -
java同msn的通信,大家想想用途吧
2007-11-24 17:14 2513程序员的生活真是单调,除了编程还是编程,工作日 ... -
EAI企业应用集成场景及解决方案
2007-09-21 18:21 3154/** *作者:张荣华(ahuaxuan) *2007-9 ... -
quartz和应用的集群问题
2007-08-21 18:36 12817之前看到很多关于quartz的讨论,尤其是关于quar ... -
优化程序之前,可用Jamon来监测你的Spring应用
2007-08-14 18:14 8125/** *作者:张荣华(ahuaxuan) *2007-8-1 ... -
请问责任链真的是一种设计模式吗
2007-07-26 18:12 9414坛子上讨论设计模式的也挺多的,但是关于这个责任链模式还没有人提 ... -
把ActiveMQ的控制台整合到你的web程序中
2007-07-19 12:06 8830在使用ActiveMQ的时候把ActiveMQ的控制台整 ... -
设计模式之:解剖观察者模式
2007-07-17 16:12 6866[size=9] 论坛上很多人都 ... -
java邮件:在简单和复杂之间的方案
2007-07-11 18:07 7584/** *作者:张荣华(ahuaxu ... -
解惑:在spring+hibernate中,只读事务是如何被优化的。
2007-06-28 18:22 7622/** *作者:张荣华(ahuaxuan) *2007- ... -
让webwork零配置 第二章(实现)(实例已放出,大家可以下载运行)
2007-06-25 09:23 5708/** *作者:张荣华(ahuaxuan) *2007-0 ... -
让webwork2零配置,第一章(主贴再次更新)
2007-06-18 15:41 13379/** *作者:张荣华(ahuaxuan) *2007-0 ... -
Spring声明式事务管理源码解读之事务提交
2007-06-11 09:19 7285/** *作者:张荣华(ahuaxuan) *2007-0 ...
相关推荐
总结来说,Freemarker的分页功能实现了在Web应用中高效展示大量数据的需求,通过合理设计后端逻辑和前端模板,可以提供既美观又实用的用户界面。同时,关注性能和安全性的细节,将有助于构建更加健壮的Web应用程序。
在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. 分页宏(Macro)定义 FreeMarker中的宏允许我们封装可重用的代码块,这在实现通用分页...
4. **Freemarker模板**:在Freemarker模板中,你可以使用Struts2提供的`<s:iterator>`标签遍历当前页的数据,同时使用自定义的Freemarker宏或Struts2的`<s:url>`标签生成分页链接。例如,可以创建一个`pagination....
在Java后端开发中,Freemarker通常用于动态渲染模板,将数据模型与模板结合,生成定制化的输出。在生成PDF时,我们可以借助Flying Saucer库,这是一个能够将HTML转换为PDF的工具。通过将Freemarker模板与Flying ...
模板技术在现代软件开发中扮演着重要角色,而在目前最流行的两种模板技术中, Velocity 和 Freemarker 独占鳌头。在 WebWork2 中,我们可以随意选择使用 Freemarker 或 Velocity 作为 View,模板技术作为 View 的...
在生成PDF的过程中,首先,你需要创建一个Freemarker模板,该模板定义了PDF的布局和样式。模板中包含占位符,这些占位符将在运行时被实际数据替换。例如,你可以创建一个`.ftl`文件,其中包含HTML元素和Freemarker...
总的来说,`httpclient`与`freemarker`在页面静态化分页中的结合使用,既保证了数据的动态获取,又实现了静态文件的高效生成,是Web开发中一种实用的优化手段。通过合理的代码组织和设计,可以构建出高效且易于维护...
使用DisplayTag,我们可以在JSP页面中轻松创建表格,包括排序、分页和过滤等功能。DisplayTag的核心组件是`<display:table>`标签,它接受一个数据集合并将其渲染为表格。通过设置`page="?"`属性,我们可以启用分页...
在IT行业中,可视化布局工具和模板引擎是提升开发效率、简化网页设计的重要手段。本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关...
FreeMarker和Apache POI是两种在Java开发中广泛使用的工具,它们在处理文档生成和操作方面各有专长。本文将详细介绍这两个库如何协同工作来创建带有图片的Word文档。 **FreeMarker** FreeMarker是一个模板引擎,...
在这个主题“freemarker自定义分页标签宏”中,我们将深入探讨如何在FreeMarker中创建自定义的分页标签宏,以便更有效地管理和展示大量数据。 首先,分页是一种常见的网页设计技术,用于将大量数据分割成小块,使...
Java中的Freemarker是一...总结,Java结合Freemarker和XML模板可以实现高效且灵活的Word文档生成,这种技术在多文档生成和自动化流程中具有很高的价值。通过理解并掌握这些知识点,你将能够构建出强大的文档生成系统。
FreeMarker 是一个强大的模板引擎,常用于Java Web开发...记住,学习和理解FreeMarker的宏机制是关键,这有助于你在实际项目中灵活应用和扩展分页功能。通过这种方式,你可以创建一个既高效又易于维护的分页解决方案。
总的来说,FreeMarker和Struts2结合实现分页功能涉及前端页面模板的编写、后端Action类的设计以及数据库查询的优化。通过合理地组织代码和配置,可以实现高效且用户体验良好的分页效果。在实际项目中,还可以考虑...
综上所述,这个测试示例展示了如何结合Java后端工具类和FreeMarker模板实现一个分页功能,包括计算分页信息、在模板中创建可重用的分页宏以及在Action中处理用户请求。通过这种方式,开发者可以更好地组织代码,保持...
Java FreeMarker 模板生成Word动态表格是一种在Java开发中常用的技术,用于生成基于模板的复杂文档,特别是当需要创建包含动态数据的Word表格时。FreeMarker是一个强大的模板引擎,它与Java代码分离,允许开发者使用...
好用的 freemarker 分页宏模板dom结构比较主流的一个分页一排显示10个分页按钮(想定制的话把页码提取出来做为参数即可)pagenav.previousPage 存着上一页pagenav.totalPage 总页数pagenav.pageNo 当前页面页码page...
在FreeMarker和Word结合的过程中,Apache POI用于加载和操作Word模板,以及将FreeMarker生成的HTML内容转换为Word格式。 四、Java代码实现 1. 引入依赖:确保在项目中添加了FreeMarker和Apache POI的依赖。 2. 创建...
在Web开发中,Freemarker常被用作MVC模式中的视图层,与Spring等框架结合,帮助开发者根据数据模型自动生成页面。在这个示例中,我们将深入探讨如何使用Freemarker根据XML模板生成Word文档。 首先,你需要了解...
FreeMarker是一个强大的、开源的模板引擎,主要用于生成动态HTML、...通过阅读手册,开发者可以深入理解FreeMarker的工作原理,并熟练掌握其使用方法,从而在实际项目中有效地利用FreeMarker模板语言API生成动态内容。