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代碼 ?
在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"]?/>??
在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文件中增加如下配置片段:
<!-- 定義一個JspSupportServlet -->
<servlet><servlet-name>JspSupportServlet</servlet-name><servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class><!-- 配置JspSupportServlet優先啟動 --><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"] />
?
?
Html代碼 ?
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}"?/>??
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代碼 ?
一般寫法是這個樣子的 ????<#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>??
總結
以上是生活随笔為你收集整理的Struts2解析FreeMarker模板中变量的顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。