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>
分享到:
相关推荐
第10章 Struts 2的标签库,第11章 Struts 2的Ajax支持,第12章 使用FreeMarker充当表现层,第13章 整合Spring,第14章 整合JSF,第15章 整合SiteMesh,第16章 整合JasperReports,第17章 整合JFreeChart,第18章 ...
- **在Struts2中使用FreeMarker**:配置Struts2以使用FreeMarker作为视图层。 - **使用Struts2标签**:在FreeMarker模板中使用Struts2提供的标签。 - **作为表现层**:使用FreeMarker来渲染视图。 - **解析模板中的...
- **Struts1**采用的是MVC(Model-View-Controller)模式的一种变种,其中Action类充当控制器的角色,而Model层的数据通常通过ActionForm对象传递。这意味着在Struts1中,Action类不仅负责业务逻辑处理,还需要处理...
通过这个“java Struts2快速入门教程pdf”中文版,你可以了解到Struts2的基本架构和使用方法,为你的Java Web开发之路打下坚实基础。实际操作过程中,结合教程逐步实践,将理论与实践相结合,相信你很快就能掌握...
Struts2使用OGNL作为表达式语言,用于在Action和视图之间传递数据。它能方便地访问对象属性和执行方法。 7. **配置文件**: `struts.xml`是Struts2的主要配置文件,用来定义Action、结果类型、拦截器栈等。此外,...
下面是一个简单的Struts2示例代码分析,演示了如何使用Servlet模拟Struts的基本步骤。 1. **main.jsp**:首页,包含一个链接指向登录页面。 2. **login.jsp**:登录表单页面,用户填写用户名和密码后提交表单。 3. ...
在Struts2中,Action充当Controller角色,处理用户请求并调用Service或DAO层;Model通常是业务实体或数据库模型;View则由JSP或FreeMarker等模板引擎生成。 7. **项目配置** 项目配置包括web.xml和struts.xml两个...
Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层表达式语言,用于在Action和视图之间传递数据。OGNL提供灵活的数据访问和操作能力。 **7. 自定义拦截器** 开发者可以根据需求编写自定义拦截...
至于视图层,Struts2提供了多种技术的集成,如JSP、Tiles、FreeMarker等。手册可能包含如何使用这些技术创建动态页面的教程。 总的来说,"Struts2学习手册"将引导读者理解Struts2的核心组件和工作原理,通过实例和...
在SSH4整合中,Struts2充当控制层,负责接收用户请求,调用业务逻辑,然后返回响应结果。 **SSH4整合步骤** 1. **引入依赖**:首先,在项目中引入Spring、Hibernate和Struts2的jar包,确保版本兼容。 2. **配置...
Struts2支持FreeMarker和Velocity等模板技术。 - Controller:处理用户请求,协调Model和View。在Struts2中,Action类充当Controller的角色。 3. **配置文件** - `struts.xml`是Struts2的主要配置文件,用于定义...
5. **界面展示**:使用JSP或FreeMarker等模板技术,结合Struts2的Action结果,展示动态生成的博客页面,实现数据和视图的分离。 6. **异常处理**:利用Spring的AOP进行全局异常处理,统一捕获并处理可能出现的运行...
2. **配置文件**:Struts2使用XML配置文件(struts.xml或struts.properties)来定义Action类、结果类型、拦截器等。不过,也可以使用注解方式来简化配置。 3. **拦截器(Interceptor)**:拦截器是Struts2的一个...
Struts2支持多种视图技术,如JSP、FreeMarker或Velocity等。JSP是最常见的选择,通过使用Struts2的标签库,可以轻松地将数据绑定到页面上。 3. **控制器(Controller)**:控制器负责协调模型和视图,接收用户的请求...
- **控制器(Controller)**:Struts2的核心组件Action充当控制器的角色,它负责处理来自用户的请求,并调用相应的模型进行处理,最后决定展示哪个视图。 ### Struts2的核心组件 #### Action Action是Struts2框架...
2. **配置文件**:Struts2使用struts.xml文件进行配置,定义Action的映射、结果类型、拦截器等,它是整个框架的配置中心。 3. **拦截器(Interceptors)**:拦截器是Struts2的一大特色,它允许在Action执行前后插入...
4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,允许在视图和模型之间灵活地传递数据,简化了数据绑定。 5. **插件体系**:Struts2拥有丰富的插件支持,如Tiles、JSON、i18...