Struts+Freemarker一对超强组合

一:

Struts让你不再关心servlet如何摆放,Freemarker让你轻松进行页面上的安排,并且两者间参数传递毫无问题。简直是天生的搭配。
两者的关联
struts自带的tld标签包括html、logic、nested、bean、tiles、template,功能可以满足大多数情况下的使用。但是,这些标签使用起来很不方便灵活,并会给简单的htm代码增加很多不必要的内容。最重要的是,html.tld标签提供的语法与常用的超文本语法习惯有很大出入,让开发者浪费时间。
Freemarker可以提供struts的标签库所能提供的功能,并且相比其他模板,还有强大的“程序”功能。如果不用struts,freemarker也可以跟其他框架很好的结合,因为它的目的就是要做到前台页面与后台程序的解耦。
在对于struts项目的结合上,也可以做到几乎完全无需修改原有的action或actionform代码,直接将freemarker模板ftl文件套用进入。你完全无需在原有的action里import新的包。这一点也是我摸索走过一段曲折道路后发现的。
只需要在web.xml配置好freemarker,把相应的freemarker.jar文件拷贝到项目lib下。修改struts-config.xml里,把原来的<forward path=xx.jsp>改成<forward path=xx.ftl>,那么当action进行对应的forward时,就会跳转到对应的ftl模板。
那么数据是如何在action和ftl之间传递的呢?
很简单,action里还是用request.setAttribute("member",obj),但是在ftl里无需用getAttribute,而是直接用freemarker的变量${member}就可以读取出来,比用<bean:write name="member">方便。如果这个obj是list属性,那么在ftl里就可以用<#list member as user>${user.name}</#list>循环读取。比用logic:iterate还方便的很。
如果你原来的jsp页面里扔不开所需的html、bean等标签,或者你自定义的其他标签,freemarker也可以完全套用进来。尽管我不建议继续使用struts标签。方法如下:
<#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]>
<#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]>
<#assign logic=JspTaglibs["/WEB-INF/struts-logic.tld"]>

另外数据如何从ftl传递到action呢?
我是使用request.getParameter读取,好像很麻烦。似乎也可以用actionform传递,我还没有仔细的看。
其他功能
在ftl模板里,不必再用logic:equals、logic:present等拗口的判断方法,直接就是<#if value1=9>、<#if str1="ok">、<#if password?exits>等,非常符合常见的编程语言习惯。
ftl里可以include或import别的模板,传递参数,好像struts的tiles和templates,但是功能更强大。还可以定义宏macro,完成一些常用而又复杂的方法。

 

 

 

二:

由于灵活使用了freemarker以后,我都不用在项目中引入struts的tlds了,可以节约一点服务器资源。
另外以前如果修改了jsp文件后第一次运行时,由于需要重新编译为class,所以会出现很明显的延迟。但是修改fm的ftl模板文件,刷新页面几乎感觉不到延迟,因为ftl模板无需编译。
也许各位会想了,这样组合的效率会高么?但是你从另外一个角度看,asp本身的效率也不高,但是还能活跃在广大的服务器端,何况java呢。
在我前面一章中说过的,如果你原来用struts编写的action,那么可以直接用ftl模板替换jsp文件。完全体现mvc的控制层与展示层分离。而且如果做的好的ftl模板,将来也可以在很多地方通用。
到底可以用在哪些地方?在fm的网站,提供一个网友开发的模板,可以让用户轻松将文档转换为RTF格式。比如在一个通用模板rtf.ftl里有下面这些macro:
<#macro big>
 {/fs#{RTF_BigFontSize*2} <#nested>}<#t>
</#macro>

<#macro H1>
 {/fs#{RTF_H1FontSize*2}  <#nested>}<@newline/><#t>
</#macro>

当然还有定义整个rtf文件结构的地方.xiaozhen.

<#assign RTF_DefaultFontSize=10>
<#assign RTF_BigFontSize=12>
<#assign RTF_SmallFontSize=8>
<#assign RTF_H1FontSize=18>
<#assign RTF_H2FontSize=14>

<#assign RTF_InTable=false>
<#assign RTF_TableColumns=1>
<#macro document>
 {/rtf1/ansi/ansicpg1252/deff0/deflang1033<#t>
  {/fonttbl<#t>
   <#-- feel free to change these fonts (except for f100)... just make sure you keep the same charset if you want RtfStringModel to keep working! -->
   {/f0/fswiss/fcharset0 Arial;}<#t>
   {/f1/fswiss/fcharset238/fprq2 Arial CE;}<#t>
   {/f2/fswiss/fcharset204/fprq2 Arial Cyr;}<#t>
   {/f3/fswiss/fcharset161/fprq2 Arial Greek;}<#t>
   {/f4/fbidi /froman/fcharset177/fprq2 Times New Roman (Hebrew);}<#t>
   {/f5/fbidi /froman/fcharset178/fprq2 Times New Roman (Arabic);}<#t>
   {/f6/fswiss/fcharset186/fprq2 Arial Baltic;}<#t>
   {/f100/fnil/fcharset2 Symbol;}<#t>
  }<#t>
  /viewkind4/uc1/pard/f0/fs#{RTF_DefaultFontSize*2}<#t>
  <#nested><#t>
 }<#t>
</#macro>

注:这里<#t>是换行符

然后在应用模板里调用
<#import "rtf.ftl" as rtf>
<@rtf.document>
<@rtf.H1>My big header<
/@rtf.H1><#t>
<@rtf.big>big<
/@rtf.big><#t>
<@rtf.big>${otherText}<
/@rtf.big><#t>
<
/@rtf.document>

是不是很方便?你可以到这里去下载:http://www.freemarker.org/libraries.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值