请问freemarker ftl文件件时怎么画出来的?

【FreeMarker】在FTL文件中使用自定义的Java方法
在项目中使用FreeMarker做为Spring
MVC中的视图文件,在展示List的时候,展示的对象中带有时间字段,但是此时间字段存的是整型的毫秒值,为了更好的展示给用户,必须要进行格式化。
但是FreeMarker中,没有这样的功能方法,只是自己去实现,还好它提供了一个接口,只需要在Java代码中,实现TemplateMethodModel,则可以在FTL中使用了。下面是我实现的Java代码:
class LongTimeToDate implements TemplateMethodModel
&&&&@SuppressWarnings("rawtypes")
&&&&@Override
&&&&public
Object exec(List args) throws TemplateModelException
&&&&&&&&if
!= args && 0 & args.size())
&&&&&&&&&&&&SimpleDateFormat
format = new SimpleDateFormat("yyyy-MM-dd
H:mm:ss");
&&&&&&&&&&&&return
format.format(new Date(Long.parseLong((String) args.get(0))));
&&&&&&&&&&&&return
在方法中,将参数传进来的对象,格式化成”yyyy-MM-dd
H:mm:ss”的样式返回,这样在前台界面就能看到友好样式的时间了。
为了在页面中使用,需要将它传递给页面,在网上很多文章中,都是写的放到传值的Map(一般名为root)中,但,因为我们使用的是Spring
MVC,其实传递的Map就是ModelMap,所以在 Controller中,使用下面的代码将它放到ModelMap中:
@RequestMapping
&&&&public
String browser(ModelMap model,
HttpServletRequest req, Plugin plugin, Pager page) {
&&&&&&&&if
(log.isDebugEnabled()) {
&&&&&&&&&&&&log.debug("PluginController.browser()...");
&&&&&&&&int
pluginManager.getPluginCount(plugin);
&&&&&&&&Page
pageObj = processPage(page, count, model, req);
&&&&&&&&List
plugins&& =
pluginManager.findPluginsByPage(plugin, pageObj.getStartOfPage(),
pageObj.getPageSize());
&&&&&&&&model.addAttribute("timer",
new LongTimeToDate());
&&&&&&&&model.addAttribute("plugins",
&&&&&&&&return
VIEW_PREFIX + "browser";
这样在FTL文件中,使用如下方式,就可以正常显示了:
timer(plugin.creationTime?c?if_exists)?if_exists }
上面的方法,已经能解决问题了,但还有一个问题,这样的方式,每写一个Controller,或是每个Action中要用到这个格式化方法的时候,都要向ModelMap中存值,这样就是相当相当的麻烦啦。如果做成全局的,就不需要每个都去做这样的操作了。
当然FreeMarker也提供了相应的方法,就是在配置FreeMarkerConfigurer的时候,添加freemarkerVariables,具体配置如下:
&&/code&bean
id="freemarkerConfig"
&&&&&&&&class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"&
&&&&&&&&&&/code&property
name="templateLoaderPath"
value="/WEB-INF/pages/"
&&&&&&&&&&/code&property
name="defaultEncoding"
value="UTF-8" /&
&&&&&&&&&&/code&property
name="freemarkerVariables"&
&&&&&&&&&&&&&&/code&map&
&&&&&&&&&&&&&&&&&&/code&entry
key="webroot" value="/nap" /&
&&&&&&&&&&&&&&&&&&/code&entry
key="timer" value-ref="longTimeToDate" /&
&&&&&&&&&&&&&/&/code&map&
&&&&&&&&&/&/code&property&
&&&&&/&/code&bean&
&&&&&&/code&bean
id="longTimeToDate"
class="com.xxx.nap.util.freemarker.LongTimeToDate"
其中的timer,就是你在FTL文件中使用的方法名了,FTL文件不变,而Controller中也不需要置入timer了。
现在就可以像使用内置方法一样使用timer方法了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。自定义指令macro
自定义指令可以使用 macro
指令来定义,这是模板设计者所关心的内容。Java程序员若不想在模板中实现定义指令,而是在Java语言中实现指令的定义,这时可以使用freemarker.template.TemplateDirectiveModel类来扩展(后续章节)。
宏是有一个变量名的模板片段。你可以在模板中使用宏作为自定义指令,这样就能进行重复性的工作。
&#macro greet&
&font size=&+2&&Hello Joe!&/font&
macro指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet的变量。在&#macro greet&和&/#macro&之间的内容(称为宏定义体)当使用它作为指令时将会被执行。你可以在FTL标记中通过@代替#来使用自定义指令。使用变量名作为指令名。而且,自定义指令的结束标记也是需要的。
&@greet&&/@greet&
&font size=&+2&&Hello Joe!&/font&
在macro指令中,宏名称的后面位置是用来定义变量的。
&#macro greet person&
&font size=&+2&&Hello ${person}!&/font&
按如下使用这个宏:
&@greet person=&Fred&/& and &@greet person=&Batman&/&
&font size=&+2&&Hello Fred!&/font&
and &font size=&+2&&Hello Batman!&/font&
使用预定义指令时,参数的值(=号后边的值)可以是FTL表达式。
自定义指令可以有多个参数。
&#macro greet person color&
&font size=&+2& color=&${color}&&Hello ${person}!&/font&
按如下使用:
&@greet person=&Fred& color=&black&/&
&@greet color=&black& person=&Fred&/&
参数的顺序并不重要。
可以指定参数的默认值。
&#macro greet person color=&black&&
&font size=&+2& color=&${color}&&Hello ${person}!&/font&
嵌套macro内容
自定义指令可以嵌套内容。
&#macro border&
&table border=4 cellspacing=0 cellpadding=4&&tr&&td&
&/td&&/tr&&/table&
按如下使用:
&@border&The bordered text&/@border&
&table border=4 cellspacing=0 cellpadding=4&&tr&&td&
The bordered text
&/td&&/tr&&/table&
nested指令可以多次被调用。
&#macro do_thrice&
&@do_thrice&
&/@do_thrice&
macro和循环变量
使用命名空间组织macro
参见命名空间一节。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:220130次
积分:6696
积分:6696
排名:第1552名
原创:450篇
转载:118篇
评论:39条
Shell 参考
(10)(4)(7)(15)(8)(7)(9)(20)(27)(53)(119)(64)(30)(8)(10)(9)(10)(11)(19)(35)(2)(1)(2)(3)(1)(1)(3)(2)(1)(5)(7)(8)(1)(5)(7)(3)(8)(1)(2)(5)(9)(10)(5)如何读取jar中的jsp或Html文件或ftl文件
[问题点数:40分]
如何读取jar中的jsp或Html文件或ftl文件
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。在html页面中包含&#include (ftl文件) /&这是什么语法,提供点相关资料!_百度知道
提问者采纳
这是 Freemarker网页展示技术的语法,类似于jsp(也是网页展示技术),freemarker现在国外用得比较多,好处我就不说了,&#include&这种是freemarker自带的标签命令,类似于jsp的&!@include&,而&@p.&这是通过freemarker的宏自定义出来的命令,相当于jsp 的自定义标签.ps:当然网页展示技术的背后,都必定会有解析这些命令的,并最终转化成网页能识别的(html)代码(架包)
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
其他类似问题
c开头是includec#开头是using他们是调用 引用的意思你这个引用了一个image_upload.html页面换句话说 引用好比一个工具箱假如你要修理电脑 要先把工具包拿出来 然后 在包里拿你所需要的工具但是你没有这个工具包的时候 你就无法用工具修电脑
为您推荐:
ftl的相关知识
其他1条回答
看上去你这个像电脑语言,就是c语言
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
金山产品经理
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
  FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
  FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序
  虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据
  FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件
  FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境
  FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库
Freemarker 开发配置
&&&&&原本对freemarker了解不多,只知道是一种模板语言,我的设计时都没有考虑到使用freemarker,而是直接JSP展示。在网站上线推广过程中了解到,各个搜索引擎对动态的链接不够友好,就是说对于网站中XXX.action?name= 这种格式的链接,搜索引擎不予收录,网络蜘蛛更亲奈.html的静态链接,为了便于更方便的网站推广,所以将网站集成URLREWRITER+FREEMARKER 技术改写了全站链接。大家可以去网站看下效果,&细心的人还是可以看见.action的痕迹的。
&&&& 现在网站中有两套链接,.action的动态链接,.html的静态链接。链接的改写纯粹是为了便于网站的推广,URLREWRITER过滤器的使用,FREEMARKER模板语言开发,这两块本人将在后续文章中做详细讲解,本文将结合网站详细介绍STRUTS2+FREEMARKER的开发配置。
1、准备相应的JAR包,struts2-core- 2.0.11.2.jar,xwork-2.0.5.jar,ognl-2.6.11.jar,freemarker- 2.3.8.jar,commons-logging-1.0.4.jar
2、解压缩struts2-core-2.0.11.2.jar复制META-INF/struts-tags.tld复制到工程WEB-INF目录下,FREEMARKER中默认是不支持struts2标签的,所以需将标签库导入模板中。
3、修改WEB.XML文件
&&& 添加STRUTS2过滤器
&filter&&&
&&&&&filter-name&struts2&/filter-name&&&
&&&&&filter-class&&&
&&&&org.apacher.sturts2.dispatcher.FilterDispatcher&&
&&&&&/filter-class&&&
&/filter&&&&&&
&filter-mapping&&&
&&&&&filter-name&struts2&/filter-name&&&
&&&&&url-parttern&/*&/url-parttern&&&
&/filter-mapping&&&
&注意:对于网络上所说的要想在Freemarker中使用Struts2标签必须配置一个新SERVLET
&servlet&&&&
&&&&&&&&&servlet-name&JspSupportServlet&/servlet-name&&&
&&&&&&&&&servlet-class&&&
&&&&&&&&&&&&org.apache.struts2.views.JspSupportServlet&&
&&&&&&&&&/servlet-class&&&
&&&&&&&&&load-on-startup&1&/load-on-startup&&&
&&&&&/servlet&&&
在本人的实践中发现这步并非必须的,此处有待深入研究
4、接下来这步应该是最重要的,配置struts.xml文件
&action&name="getVediosByCategory"&class="com.wang.vedio.action.IndexAction"&method="getVediosByCategory"&&&
&&&&result&name="success"&/secondPage.jsp&/result&&&
&/action&&&
以上ACTIN配置为正常使用STRUTS2的配置,但在结合FREEMARKER中则需做如下改变
&action&name="getVediosByCategory"&class="com.wang.vedio.action.IndexAction"&method="getVediosByCategory"&&&
&&&&result&name="success"&type="freemarker"&/WEB-INF/template/secondPage.ftl&/result&&&
&/action&&&
注意:&reslutl&元素的type 属性必须设置为freemarker,这是因为Freemarker模板文件必须由Freemarker模板引擎来解析,而Struts2内部实现了 Freemarker模板引擎,但我们必须声明返回结果类型为freemarker才可以
经过以上四步,STRUTS2+FREEMARKER配置完成,可以进行开发应用,下面展示一个简单的实例
IndexAction.java&&&
private&Log&log=LogFactory.getLog(IndexAction.class);&&
&private&String&&&
&private&String&&&
&&&*&登录处理&
&&&*&@return&
&&&*&@throws&Exception&
&public&String&getVediosByCategory()&throws&Exception{&&
&&&&&("执行了登录方法getVediosByCategory()");&&&
&&&&&return&SUCCESS;&&
&&&省略相应(getter,setter方法)&&&
创建登录页面index.jsp
&s:form&action="getVediosByCategory"&&&
&&&&&&&&登录名:&s:textfield&name="username"/&&br&&&&
&&&&&&&密码:&s:textfield&name="password"/&&&&
&&&&&&&&&s:submit&value="登录"&/&&&&
&/s:form&&&
创建结果页面:user.ftl
&#assign&s=JspTaglibs["/WEB-INF/struts-tags.tld&"]&&&
&&&&&body&&&
&&&&欢迎&@s.property&value="username"/&登录!&&&
&&&&&/body&&&
&/html&&&&注意:
1、Struts2标签在JSP 页面中的写法与在Freemarker模板文件中的写法不同。
Freemarker模板文件是以&@s.tag&开始,以&/@s.tag&结束
2、Freemarker模板文件的处理,通过Web容器是无法直接处理的,因此不要让用户直接访问模板 文件。在开发过程中,我们可以将Freemarker文件直接放到Web工程的 WEB-INF目录或其子目录下(用户无法访问WEB-INF目录下文件),并在相应的struts-*.xml文件中配置type="freemarker" 来输出模板
FREEMARKER接触不深,如有不足之处请大虾们多多指正
阅读(6187)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_087067',
blogTitle:'(转)Struts2跟freemarker的配置实例讲解(FTL文件解析)',
blogAbstract:'
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 ftl文件怎么打开 的文章

 

随机推荐