struts2使用freemarker充当表现层。
安装freemark eclipse的编辑器,更新地址为:
- <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中支持标签功能
- <servlet>
- <servlet-name>JspSupportServlet</servlet-name>
- <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
2、在freemarker模板文件中引用和使用标签
3、如果freemarker模板文件很多,通过#assign的方式引用标签库有很多缺点:开发效率低、可维护性差等。更好的办法是通过Struts2的拦截器机制同一处理。关键代码如下:
- TaglibFactory jspTaglibs = new TaglibFactory(ServletActionContext.getServletContext());
- TemplateModel cjm = jspTaglibs.get(“/WEB-INF/cjm.tld”);
- ActionContext.getContext().put(“cjm”, cjm);
4、注意在 FreeMarker 语法中你不能像 JSP 那样在参数中使用${…},而且不能给参数值加引号。所以这样是不对的。
- <xxx:page pageSize=”${page.pageSize}”
- currentPageNo=”${page.pageNo }”
- formId=”listForm”
- totalCount=”${page.totalCount }”
- totalPageCount=”${page.totalPages }” />
- 要改为:
- <@xxx.page pagepageSize=page.getPageSize()
- currentPageNo=page.getPageNo()
- formId=”listForm”
- totalCount=page.totalCount
- totalPageCount=page.totalPages />
这样在freemark中就可以使用jsp标签了。
2、jsp include 标签的替换<%@ include file=”"%>
由于使用struts2,所以直接用struts2 include标签替换写法为:
- <@s.include value=”/common/meta.jsp” />
- <@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标签没什么好说的
Struts2解析FreeMarker模板中变量的顺序如下:
1,FreeMarker模板内建的变量;
2,ValueStack中的变量;
3,ActionContext中的变量;
4,HttpServletRequest中的属性;
5,HttpSession中的属性;
6,ServletContext范围的属性.
iterator标签
- struts2标签
- <s:iterator value=”page.result” status=”status” var=”etsp”>
- <tr>
- <td width=”30″><s:property value=”#status.index+1+page.pageSize*(page.pageNo-1)”/></td>
- <s:iterator value=”etspShowPropertyName” var=”propertyName”>
- <td width=”50″>${etsp[propertyName]}</td>
- </s:iterator>
- </tr>
- </s:iterator>
- freemark标签
- <#list page.result as etsp>
- <tr>
- <td>${etsp_index+1+page.getPageSize()*(page.getPageNo()-1)}</td>
- <#list etspShowPropertyName as propertyName>
- <td width=”50″>${etsp[propertyName]!”}</td>
- </#list>
- </tr>
- </#list>
- 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文件如下:
- <#assign xxx=JspTaglibs["/WEB-INF/tlds/xxx.tld"] >
- <@s.include value=”/common/taglibs.jsp” />
- <!DOCTYPE html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN” ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
- <html xmlns=”http://www.w3.org/1999/xhtml”>
- <head>
- <@s.include value=”/common/meta.jsp” />
- <@s.include value=”/common/import-basic-js-css.jsp” />
- <!–截取文字start–>
- <script type=”text/javascript” src=”${base}/js/text/text-overflow.js”></script>
- <!–截取文字end–>
- <!– 扩展表格start –>
- <link rel=”stylesheet” type=”text/css” href=”${base}/js/table/flexigrid/css/flexigrid/flexigrid.css”></link>
- <script type=”text/javascript” src=”${base}/js/table/flexigrid/flexigrid.js”></script>
- <!– 扩展表格end –>
- <link href=”${base}/css/paging.css” rel=”stylesheet” type=”text/css”/>
- <script>
- $(function(){
- var parentMainHeight = window.parent.document.documentElement.clientHeight;
- var flexiGridHeight=parentMainHeight-parentTopHeight-parentBottomHeight-fixHeight-45;
- //定义flexiGridHeight是为了让表格自适应页面高度,如果不需要可以将下面的height设为一个具体数值
- $(‘table.flexiStyle’).flexigrid({
- height:flexiGridHeight,
- resizable: false
- });
- });
- </script>
- </head>
- <body>
- <table class=”flexiStyle”>
- <thead>
- <tr>
- <th width=”30″>序号</th>
- <#list etspShowPropertyName as propertyName>
- <th width=”50″>${etspPropertyMap[propertyName]}</th>
- </#list>
- </tr>
- </thead>
- <tbody>
- <#list page.result as etsp>
- <tr>
- <td>${etsp_index+1+page.getPageSize()*(page.getPageNo()-1)}</td>
- <#list etspShowPropertyName as propertyName>
- <td width=”50″>${etsp[propertyName]!”}</td>
- </#list>
- </tr>
- </#list>
- </tbody>
- </table>
- <@xxx.page pagepageSize=page.getPageSize()
- currentPageNo=page.getPageNo()
- formId=”listForm”
- totalCount=page.totalCount
- totalPageCount=page.totalPages />
- </div>
- </body>
http://hzl7652.iteye.com/blog/1238714