Struts2解析FreeMarker模板中变量的顺序

http://zhxing.iteye.com/blog/391560

关于FreeMarker 的基础学习请参考文档。。这里主要记录 FreeMarker 的一些问题。。

1.FreeMarker  乱码问题

     在struts2 中s:component默认是使用freemarker模板方式处理

     IDE是MyEclipse6.5,使用的是默认的GBK编码:可以在这里查看:Window->Preferences->Workspace->Text file encoding

    struts2的配置文件中是这么配置编码的:<constant name="struts.i18n.encoding" value="utf-8" /> 

    使用s:component时,模板页内容有中文时会乱码,在网上查了一通,自已又尝试了多种方式,一直无法解决乱码问题,郁闷了很长一段时间。无意间发现,修改ftl文件的编码即可很容易解决乱码问题:选择ftl文件->右键->Properties->Text file encoding,改为utf-8。

 

2、FreeMarker 和Struts2 的整合

 

Xml代码 复制代码  收藏代码
  1. 在FreeMarker模板中使用标签毕竟不同于在JSP页面中使用标签,因为FreeMarker不支持使用taglib指令来导入标签库.但Struts2为了在FreeMarker模板中使用标签库提供了额外的支持.可以按照下面的步骤进行:   
  2. 1,将系统所需要的标签库定义文件(.tld文件)复制到WEB-INF目录下,对于Struts2,则是复制struts2-core-2.0.11.2.jar中的META-INF\struts-tags.tld文件   
  3. 2,在web.xml文件中启动JspSupportServlet.为了启动它,则应该在web.xml文件中增加如下配置片段:   
  4. <!-- 定义一个JspSupportServlet -->  
  5. <servlet>  
  6.    <servlet-name>JspSupportServlet</servlet-name>  
  7.    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>  
  8.    <!-- 配置JspSupportServlet优先启动 -->  
  9.    <load-on-startup>1</load-on-startup>  
  10. </servlet>  
  11. 3,在FreeMarker模板中使用assign指令导入标签库,导入标签库的代码如下:   
  12. <#-- 定义/WEB-INF/struts-tags.tld文件对应的标签库前缀为s -->  
  13. <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />  

 

 

Html代码 复制代码  收藏代码
  1. Struts2解析FreeMarker模板中变量的顺序如下:   
  2.   
  3. 1,FreeMarker模板内建的变量;   
  4. 2,ValueStack中的变量;   
  5. 3,ActionContext中的变量;   
  6. 4,HttpServletRequest中的属性;   
  7. 5,HttpSession中的属性;   
  8. 6,ServletContext范围的属性.   
  9.   
  10. FreeMarker模板的内建变量有如下几个:   
  11. 1,stack:代表ValueStack本身,可通过如下方式来访问其中的变量"${stack.findString('ognl expr')}"   
  12. 2,action:代表刚刚执行过的Action实例   
  13. 3,response:代表HpptServletResponse实例   
  14. 4,res:代表HpptServletResponse实例   
  15. 5,request:代表HpptServletRequest实例   
  16. 6,req:代表HpptServletRequest实例   
  17. 7,session:代表HpptSession实例   
  18. 8,application:代表ServletContext实例   
  19. 9,base:代表用户请求的上下文路径.   
  20.   
  21. FreeMarker中访问Servlet/JSP范围对象   
  22.   
  23. Struts2还为在FreeMarker模板中访问Servlet/JSP范围对象提供了支持,通过这种支持可以直接访问这些变量.   
  24. 访问application范围内的属性代码如下:   
  25. <#if Application.attributeName?exists>  
  26. ${Application.attributeName}   
  27. </#if>  
  28. 也可以通过使用Struts2标签来输出,代码如下:   
  29. <@s.property value="${#application.attributeName}" />  
  30.   
  31. 访问session范围内的属性如下:   
  32. <#if Session.attributeName?exists>  
  33. ${Session.attributeName}   
  34. </#if>  
  35. 或   
  36. <@s.property value="${#session.attributeName}" />  
  37.   
  38. 访问request范围内的属性如下:   
  39. <#if Request.attributeName?exists>  
  40. ${Request.attributeName}   
  41. </#if>  
  42. 或   
  43. <@s.property value="${#request.attributeName}" />  
  44.   
  45. 对于request,还可以访问request的请求参数,如下:   
  46. <#if Parameter.parameterName?exists>  
  47. ${Parameter.parameterName}   
  48. </#if>  
  49. 或   
  50. <@s.property value="${#parameter.parameterName}" />  
  51.   
  52. 访问ValueStack上下文参数,代码如下:   
  53. ${stack.findValue('#myContextParam')}   
  54. 或   
  55. <@s.property value="${#myContextParam}" />  
Struts2解析FreeMarker模板中变量的顺序如下:

1,FreeMarker模板内建的变量;
2,ValueStack中的变量;
3,ActionContext中的变量;
4,HttpServletRequest中的属性;
5,HttpSession中的属性;
6,ServletContext范围的属性.

FreeMarker模板的内建变量有如下几个:
1,stack:代表ValueStack本身,可通过如下方式来访问其中的变量"${stack.findString('ognl expr')}"
2,action:代表刚刚执行过的Action实例
3,response:代表HpptServletResponse实例
4,res:代表HpptServletResponse实例
5,request:代表HpptServletRequest实例
6,req:代表HpptServletRequest实例
7,session:代表HpptSession实例
8,application:代表ServletContext实例
9,base:代表用户请求的上下文路径.

FreeMarker中访问Servlet/JSP范围对象

Struts2还为在FreeMarker模板中访问Servlet/JSP范围对象提供了支持,通过这种支持可以直接访问这些变量.
访问application范围内的属性代码如下:
<#if Application.attributeName?exists>
${Application.attributeName}
</#if>
也可以通过使用Struts2标签来输出,代码如下:
<@s.property value="${#application.attributeName}" />

访问session范围内的属性如下:
<#if Session.attributeName?exists>
${Session.attributeName}
</#if>
或
<@s.property value="${#session.attributeName}" />

访问request范围内的属性如下:
<#if Request.attributeName?exists>
${Request.attributeName}
</#if>
或
<@s.property value="${#request.attributeName}" />

对于request,还可以访问request的请求参数,如下:
<#if Parameter.parameterName?exists>
${Parameter.parameterName}
</#if>
或
<@s.property value="${#parameter.parameterName}" />

访问ValueStack上下文参数,代码如下:
${stack.findValue('#myContextParam')}
或
<@s.property value="${#myContextParam}" />

 

 3、FreeMarker 的内建函数

chunk,  is_date,  last,  root,  j_string,  round,  contains,  is_hash,  long,  float,  ends_with,  namespace,  matches,  time,  values,  seq_last_index_of,  uncap_first,  byte,  substring,  is_transform,  web_safe,  groups,  seq_contains,  is_macro,  index_of,  word_list,  int,  is_method,  eval,  parent,  xml,  number,  capitalize,  if_exists,  rtf,  node_type,  double,  is_directive,  url,  size,  default,  floor,  ceiling, is_boolean,  split,  node_name,  is_enumerable,  seq_index_of,  is_sequence,  sort,  is_node, 
sort_by,  left_pad,  cap_first,  interpret,  children,  node_namespace,  chop_linebreak, date,  short,  last_index_of,  is_collection,  ancestors,  length,  trim,  datetime, is_string,  reverse,  c,  keys,  upper_case,  js_string,  has_content,  right_pad,  replace,  is_hash_ex,  new,  is_number,  lower_case,  is_indexable,  string,  exists,  html,  first

 

具体的用途,以后有空再总结,最近用到的有

Html代码 复制代码  收藏代码
  1. 一般写法是这个样子的   
  2.   
  3. <#list dataEntity as de>  
  4.   
  5. <a href="${de.url}">${de.name}</a>  
  6.   
  7. </#list>  
  8.   
  9.   
  10. 要是排序,则用   
  11.   
  12. <#list dataEntity?sort as de>  
  13.   
  14. <a href="${de.url}">${de.name}</a>  
  15.   
  16. </#list>  
  17.   
  18. 这是按元素的首字母排序。若要按list中对象元素的某一属性排序的话,则用   
  19.   
  20. <#list dataEntity?sort_by([“name”]) as de>  
  21.   
  22. <a href="${de.url}">${de.name}</a>  
  23.   
  24. </#list>  
  25.   
  26. 这个是按list中对象元素的[name]属性排序的,是升序,而我们大多情况要用到降排序,这时得改成如下的样子:   
  27.   
  28. <#list dataEntity?sort_by([“name”])?reverse as de>  
  29.   
  30. <a href="${de.url}">${de.name}</a>  
  31.   
  32. </#list>  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值