安装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中取得。
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模板文件中引用和使用标签
<#assign xxx=JspTaglibs["/WEB-INF/tlds/xxx.tld"] >
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 pageSize=page.getPageSize() currentPageNo=page.getPageNo() formId="listForm" totalCount=page.totalCount totalPageCount=page.totalPages />
这样在freemark中就可以使用jsp标签了。
由于使用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">
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)
if标签没什么好说的
<#if x == 1> x is 1 <#elseif x == 2> x is 2 <#elseif x == 3> x is 3 </#if> x为action的变更
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为索引值
计算序号一开始的写法为:
${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 pageSize=page.getPageSize() currentPageNo=page.getPageNo() formId="listForm" totalCount=page.totalCount totalPageCount=page.totalPages /> </div> </body>