`
hzl7652
  • 浏览: 117988 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

struts2使用freemarker充当表现层

阅读更多

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模板文件中引用和使用标签

<#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标签了。

  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标签没什么好说的

<#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为索引值

 

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 pageSize=page.getPageSize()
					    currentPageNo=page.getPageNo() 
					    formId="listForm"
				        totalCount=page.totalCount
					    totalPageCount=page.totalPages />
</div>	
</body>
分享到:
评论

相关推荐

    [Struts 2权威指南--基于WebWork核心的MVC开发(高清完整版) 1/12

    第10章 Struts 2的标签库,第11章 Struts 2的Ajax支持,第12章 使用FreeMarker充当表现层,第13章 整合Spring,第14章 整合JSF,第15章 整合SiteMesh,第16章 整合JasperReports,第17章 整合JFreeChart,第18章 ...

    freemarker总结

    其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替&gt;会有更好的效果,因为 FreeMarker会把&gt;解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:(x&gt;y)&gt; ...

    java线商城系统.rar

    基于java技术开发有如下特性: 1,使用spring+hibernate+struts2+freemarker+jquery+css开发 2,在服务端有部分为android设备提供的方法,android版本2.33 ...5,由freemarker充当显示层。 仅用于学习和参考

    java在线商城系统.rar

    基于java技术开发有如下特性: 1,使用spring+hibernate+struts2+freemarker+jquery+css开发 2,在服务端有部分为android设备提供的方法,android版本2.33 ...5,由freemarker充当显示层。 项目仅供学习和参考

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包9

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包101

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    Java资源包01

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics