`
hzl7652
  • 浏览: 118689 次
  • 性别: 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章 ...

    struts2教程我在培训时用的

    - **在Struts2中使用FreeMarker**:配置Struts2以使用FreeMarker作为视图层。 - **使用Struts2标签**:在FreeMarker模板中使用Struts2提供的标签。 - **作为表现层**:使用FreeMarker来渲染视图。 - **解析模板中的...

    struts2学习总结

    - **Struts1**采用的是MVC(Model-View-Controller)模式的一种变种,其中Action类充当控制器的角色,而Model层的数据通常通过ActionForm对象传递。这意味着在Struts1中,Action类不仅负责业务逻辑处理,还需要处理...

    java Struts2快速入门教程pdf

    通过这个“java Struts2快速入门教程pdf”中文版,你可以了解到Struts2的基本架构和使用方法,为你的Java Web开发之路打下坚实基础。实际操作过程中,结合教程逐步实践,将理论与实践相结合,相信你很快就能掌握...

    黑马程序员struts2框架2016版资料(笔记+源码+思路图)

    Struts2使用OGNL作为表达式语言,用于在Action和视图之间传递数据。它能方便地访问对象属性和执行方法。 7. **配置文件**: `struts.xml`是Struts2的主要配置文件,用来定义Action、结果类型、拦截器栈等。此外,...

    Struts2资源

    下面是一个简单的Struts2示例代码分析,演示了如何使用Servlet模拟Struts的基本步骤。 1. **main.jsp**:首页,包含一个链接指向登录页面。 2. **login.jsp**:登录表单页面,用户填写用户名和密码后提交表单。 3. ...

    Struts2项目struts2 上传 下载 项目

    在Struts2中,Action充当Controller角色,处理用户请求并调用Service或DAO层;Model通常是业务实体或数据库模型;View则由JSP或FreeMarker等模板引擎生成。 7. **项目配置** 项目配置包括web.xml和struts.xml两个...

    使用Struts2开发Java Web应用程序

    Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层表达式语言,用于在Action和视图之间传递数据。OGNL提供灵活的数据访问和操作能力。 **7. 自定义拦截器** 开发者可以根据需求编写自定义拦截...

    struts2学习手册

    至于视图层,Struts2提供了多种技术的集成,如JSP、Tiles、FreeMarker等。手册可能包含如何使用这些技术创建动态页面的教程。 总的来说,"Struts2学习手册"将引导读者理解Struts2的核心组件和工作原理,通过实例和...

    Spring4+hibernate4+struts2整合

    在SSH4整合中,Struts2充当控制层,负责接收用户请求,调用业务逻辑,然后返回响应结果。 **SSH4整合步骤** 1. **引入依赖**:首先,在项目中引入Spring、Hibernate和Struts2的jar包,确保版本兼容。 2. **配置...

    struts2-login

    Struts2支持FreeMarker和Velocity等模板技术。 - Controller:处理用户请求,协调Model和View。在Struts2中,Action类充当Controller的角色。 3. **配置文件** - `struts.xml`是Struts2的主要配置文件,用于定义...

    struts2+hibernate+spring实现的博客系统

    5. **界面展示**:使用JSP或FreeMarker等模板技术,结合Struts2的Action结果,展示动态生成的博客页面,实现数据和视图的分离。 6. **异常处理**:利用Spring的AOP进行全局异常处理,统一捕获并处理可能出现的运行...

    struts2教程集合

    2. **配置文件**:Struts2使用XML配置文件(struts.xml或struts.properties)来定义Action类、结果类型、拦截器等。不过,也可以使用注解方式来简化配置。 3. **拦截器(Interceptor)**:拦截器是Struts2的一个...

    新手入门Struts2最小框架

    Struts2支持多种视图技术,如JSP、FreeMarker或Velocity等。JSP是最常见的选择,通过使用Struts2的标签库,可以轻松地将数据绑定到页面上。 3. **控制器(Controller)**:控制器负责协调模型和视图,接收用户的请求...

    Struts+2实战 struts2_in_action

    - **控制器(Controller)**:Struts2的核心组件Action充当控制器的角色,它负责处理来自用户的请求,并调用相应的模型进行处理,最后决定展示哪个视图。 ### Struts2的核心组件 #### Action Action是Struts2框架...

    Struts2_学习笔记.zip

    2. **配置文件**:Struts2使用struts.xml文件进行配置,定义Action的映射、结果类型、拦截器等,它是整个框架的配置中心。 3. **拦截器(Interceptors)**:拦截器是Struts2的一大特色,它允许在Action执行前后插入...

    Struts2.3.15jar包

    4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,允许在视图和模型之间灵活地传递数据,简化了数据绑定。 5. **插件体系**:Struts2拥有丰富的插件支持,如Tiles、JSON、i18...

Global site tag (gtag.js) - Google Analytics