struts2使用freemarker充当表现层实例介绍



struts2使用freemarker充当表现层。

安装freemark eclipse的编辑器,更新地址为:

Html代码  收藏代码
  1. <a href=”http://download.jboss.org/jbosstools/updates/stable/galileo/”>http://download.jboss.org/jbosstools/updates/stable/galileo/</a>

由于是在已有系统上进行更新,所于要解决以下的:

1、系统中自定义的jsp标签,在freemark如何使用。

2、jsp include 标签的替换<%@ include file=”"%>

3、定义的<c:set var=”ctx” value=”${pageContext.request.contextPath}”/> ctx如何在freemark中取得。

一、在freemark中如何jsp标签

1、需要在web.xml文件中配置以下信息,让Struts2在freemarker中支持标签功能

Xml代码  收藏代码
  1. <servlet>
  2.         <servlet-name>JspSupportServlet</servlet-name>
  3.         <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
  4.         <load-on-startup>1</load-on-startup>
  5. </servlet>

2、在freemarker模板文件中引用和使用标签

Xml代码  收藏代码
  1. <#assign xxx=JspTaglibs["/WEB-INF/tlds/xxx.tld"]  >

3、如果freemarker模板文件很多,通过#assign的方式引用标签库有很多缺点:开发效率低、可维护性差等。更好的办法是通过Struts2的拦截器机制同一处理。关键代码如下:

Java代码  收藏代码
  1. TaglibFactory jspTaglibs = new TaglibFactory(ServletActionContext.getServletContext());
  2. TemplateModel cjm = jspTaglibs.get(“/WEB-INF/cjm.tld”);
  3. ActionContext.getContext().put(“cjm”, cjm);

4、注意在 FreeMarker 语法中你不能像 JSP 那样在参数中使用${…},而且不能给参数值加引号。所以这样是不对的。

Html代码  收藏代码
  1. <xxx:page pageSize=”${page.pageSize}”
  2.                         currentPageNo=”${page.pageNo }”
  3.                         formId=”listForm”
  4.                         totalCount=”${page.totalCount }”
  5.                         totalPageCount=”${page.totalPages }” />
  6. 要改为:
  7. <@xxx.page pagepageSize=page.getPageSize()
  8.                         currentPageNo=page.getPageNo()
  9.                         formId=”listForm”
  10.                         totalCount=page.totalCount
  11.                         totalPageCount=page.totalPages />

这样在freemark中就可以使用jsp标签了。

  2、jsp include 标签的替换<%@ include file=”"%>

由于使用struts2,所以直接用struts2 include标签替换写法为:

Html代码  收藏代码
  1. <@s.include value=”/common/meta.jsp” />
  2. <@s.include value=”/common/import-basic-js-css.jsp” />

看freemark文档还可以使用由 FreemarkerServlet(2.3.15 版本之后)提供的客户化标签
<@include_page path=”…”/>来包含另一个 Web 应用资源的内容到输出内容中;
这对于整合JSP页面(在同一Web服务器中生活在FreeMarker模板旁边)的输出到FreeMarker
模板的输出中非常有用。使用:

<@include_page path=”path/to/some.jsp”/>

和使用jsp指令功能一样<jsp:include page=”path/to/some.jsp”>

 3、ctx变量的取得

struts2与FreeMarker整合提供的内建变量如下:


名称 作用
stack            值栈本身, 方便使用 ${stack.findString(‘ognl expr’)}的方式调用
action           最近执行的action
response      HttpServletResponse
res               与response相同
request        HttpServletRequest
req              与reqeust相同
session       HttpSession
application  ServletContext
base           request的上下文路径(context path)

所以使用${base}替换${ctx}就可以

4、使用freemark的 if,list替换struts2的if iterator标签

if标签没什么好说的

Html代码  收藏代码
  1. <#if x == 1>
  2.     x is 1
  3. <#elseif x == 2>
  4.     x is 2
  5. <#elseif x == 3>
  6.     x is 3
  7. </#if>
  8. x为action的变更

Struts2解析FreeMarker模板中变量的顺序如下:
1,FreeMarker模板内建的变量;
2,ValueStack中的变量;
3,ActionContext中的变量;
4,HttpServletRequest中的属性;
5,HttpSession中的属性;
6,ServletContext范围的属性.

 

iterator标签

Html代码  收藏代码
  1. struts2标签
  2. <s:iterator value=”page.result” status=”status” var=”etsp”>
  3.                   <tr>
  4.                     <td width=”30″><s:property value=”#status.index+1+page.pageSize*(page.pageNo-1)”/></td>
  5.                     <s:iterator value=”etspShowPropertyName” var=”propertyName”>
  6.                       <td width=”50″>${etsp[propertyName]}</td>
  7.                     </s:iterator>
  8.                   </tr>
  9. </s:iterator>
  10. freemark标签
  11. <#list page.result as etsp>
  12.                     <tr>
  13.                         <td>${etsp_index+1+page.getPageSize()*(page.getPageNo()-1)}</td>
  14.                         <#list etspShowPropertyName as propertyName>
  15.                              <td width=”50″>${etsp[propertyName]!”}</td>
  16.                         </#list>
  17.                     </tr>
  18. </#list>
  19. etsp_index为索引值

 

5、遇到的小意外

计算序号一开始的写法为:

${etsp_index+1+page.pageSize*(page.pageNo-1)}

进入页面就报:

进入排行页面时就出现如下错误:
Expecting a string, date or number here, Expression page.pageNo is instead a freemarker.ext.beans.SimpleMethodModel。

不清楚这个错误信息是啥意思,感觉甚是奇怪。于是,在网上查找原因,有网友说是方法名和字段名相同造成的。还真如这网友说的一样,Page.java中确实有个方法名叫pageNo:
public Page pageNo(final int thePageNo) {
setPageNo(thePageNo);
return this;
}

最后改成:${etsp_index+1+page.getPageSize()*(page.getPageNo()-1)}这样方法调用就可以

完整的ftl文件如下:

 

Html代码  收藏代码
  1. <#assign xxx=JspTaglibs["/WEB-INF/tlds/xxx.tld"]  >
  2. <@s.include value=”/common/taglibs.jsp” />
  3. <!DOCTYPE html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN” ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
  4. <html xmlns=”http://www.w3.org/1999/xhtml”>
  5. <head>
  6. <@s.include value=”/common/meta.jsp” />
  7. <@s.include value=”/common/import-basic-js-css.jsp” />
  8. <!–截取文字start–>
  9. <script type=”text/javascript” src=”${base}/js/text/text-overflow.js”></script>
  10. <!–截取文字end–>
  11. <!– 扩展表格start –>
  12. <link rel=”stylesheet” type=”text/css” href=”${base}/js/table/flexigrid/css/flexigrid/flexigrid.css”></link>
  13. <script type=”text/javascript” src=”${base}/js/table/flexigrid/flexigrid.js”></script>
  14. <!– 扩展表格end –>
  15. <link href=”${base}/css/paging.css” rel=”stylesheet” type=”text/css”/>
  16. <script>
  17. $(function(){
  18.         var parentMainHeight = window.parent.document.documentElement.clientHeight;
  19.         var flexiGridHeight=parentMainHeight-parentTopHeight-parentBottomHeight-fixHeight-45;
  20.         //定义flexiGridHeight是为了让表格自适应页面高度,如果不需要可以将下面的height设为一个具体数值
  21.         $(‘table.flexiStyle’).flexigrid({
  22.             height:flexiGridHeight,
  23.             resizable: false
  24.             });
  25. });
  26. </script>
  27. </head>
  28. <body>
  29.     <table class=”flexiStyle”>
  30.             <thead>
  31.               <tr>
  32.                 <th width=”30″>序号</th>
  33.                 <#list etspShowPropertyName as propertyName>
  34.                     <th width=”50″>${etspPropertyMap[propertyName]}</th>
  35.                 </#list>
  36.               </tr>
  37.               </thead>
  38.               <tbody>
  39.                 <#list page.result as etsp>
  40.                     <tr>
  41.                         <td>${etsp_index+1+page.getPageSize()*(page.getPageNo()-1)}</td>
  42.                         <#list etspShowPropertyName as propertyName>
  43.                              <td width=”50″>${etsp[propertyName]!”}</td>
  44.                         </#list>
  45.                     </tr>
  46.                 </#list>
  47.               </tbody>
  48.     </table>
  49. <@xxx.page pagepageSize=page.getPageSize()
  50.                         currentPageNo=page.getPageNo()
  51.                         formId=”listForm”
  52.                         totalCount=page.totalCount
  53.                         totalPageCount=page.totalPages />
  54. </div>
  55. </body>

http://hzl7652.iteye.com/blog/1238714