关于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 的整合
- 在FreeMarker模板中使用标签毕竟不同于在JSP页面中使用标签,因为FreeMarker不支持使用taglib指令来导入标签库.但Struts2为了在FreeMarker模板中使用标签库提供了额外的支持.可以按照下面的步骤进行:
- 1,将系统所需要的标签库定义文件(.tld文件)复制到WEB-INF目录下,对于Struts2,则是复制struts2-core-2.0.11.2.jar中的META-INF\struts-tags.tld文件
- 2,在web.xml文件中启动JspSupportServlet.为了启动它,则应该在web.xml文件中增加如下配置片段:
-
- <servlet>
- <servlet-name>JspSupportServlet</servlet-name>
- <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
-
- <load-on-startup>1</load-on-startup>
- </servlet>
- 3,在FreeMarker模板中使用assign指令导入标签库,导入标签库的代码如下:
- <#-- 定义/WEB-INF/struts-tags.tld文件对应的标签库前缀为s -->
- <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
- 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
具体的用途,以后有空再总结,最近用到的有
- 一般写法是这个样子的
-
- <#list dataEntity as de>
-
- <a href="${de.url}">${de.name}</a>
-
- </#list>
-
-
- 要是排序,则用
-
- <#list dataEntity?sort as de>
-
- <a href="${de.url}">${de.name}</a>
-
- </#list>
-
- 这是按元素的首字母排序。若要按list中对象元素的某一属性排序的话,则用
-
- <#list dataEntity?sort_by([“name”]) as de>
-
- <a href="${de.url}">${de.name}</a>
-
- </#list>
-
- 这个是按list中对象元素的[name]属性排序的,是升序,而我们大多情况要用到降排序,这时得改成如下的样子:
-
- <#list dataEntity?sort_by([“name”])?reverse as de>
-
- <a href="${de.url}">${de.name}</a>
-
- </#list>