Struts2结合Velocity开发(Layout布局方式)
1.重写Struts2中的VelocityResult,使其带有Layout功能
(原因:struts2默认只有不带布局功能的velocity模板类VelocityResult,所以需要重写)
package com.tairan.taihang.struts.velocity; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspFactory; import javax.servlet.jsp.PageContext; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.VelocityResult; import org.apache.struts2.views.JspSupportServlet; import org.apache.struts2.views.velocity.VelocityManager; import org.apache.velocity.Template; import org.apache.velocity.context.Context; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; public class VelocityLayoutResult extends VelocityResult { private static final long serialVersionUID = 6020934292083047099L; private static final Logger LOG = LoggerFactory.getLogger(VelocityLayoutResult.class); public static String KEY_SCREEN_CONTENT = "screen_content"; public static String KEY_LAYOUT = "layout"; public static final String PROPERTY_DEFAULT_LAYOUT = "tools.view.servlet.layout.default.template"; public static final String PROPERTY_LAYOUT_DIR = "tools.view.servlet.layout.directory"; public static final String PROPERTY_INPUT_ENCODING = "input.encoding"; public static final String PROPERTY_OUTPUT_ENCODING = "output.encoding"; public static final String PROPERTY_CONTENT_TYPE = "default.contentType"; protected VelocityManager velocityManager; protected String defaultLayout; protected String layoutDir; protected String inputEncoding; protected String outputEncoding; protected String contentType; @Override public void setVelocityManager(VelocityManager mgr) { this.velocityManager = mgr; super.setVelocityManager(mgr); } @Override public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { ValueStack stack = ActionContext.getContext().getValueStack(); HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); JspFactory jspFactory = null; ServletContext servletContext = ServletActionContext.getServletContext(); Servlet servlet = JspSupportServlet.jspSupportServlet; velocityManager.init(servletContext); boolean usedJspFactory = false; PageContext pageContext = (PageContext) ActionContext.getContext().get(ServletActionContext.PAGE_CONTEXT); if (pageContext == null && servlet != null) { jspFactory = JspFactory.getDefaultFactory(); pageContext = jspFactory.getPageContext(servlet, request, response, null, true, 8192, true); ActionContext.getContext().put(ServletActionContext.PAGE_CONTEXT, pageContext); usedJspFactory = true; } try { String encoding = getEncoding(finalLocation); String contentType = getContentType(finalLocation); if (encoding != null) { contentType = contentType + ";charset=" + encoding; } Template t = getTemplate(stack, velocityManager.getVelocityEngine(), invocation, finalLocation, encoding); Context context = createContext(velocityManager, stack, request, response, finalLocation); StringWriter stringWriter = new StringWriter(); t.merge(context, stringWriter); context.put(KEY_SCREEN_CONTENT, stringWriter.toString()); Object obj = context.get(KEY_LAYOUT); String layout = (obj == null) ? null : obj.toString(); defaultLayout = (String) velocityManager.getVelocityEngine().getProperty(PROPERTY_DEFAULT_LAYOUT); layoutDir = (String) velocityManager.getVelocityEngine().getProperty(PROPERTY_LAYOUT_DIR); if (!layoutDir.endsWith("/")) { layoutDir += '/'; } if (!layoutDir.startsWith("/")) { layoutDir = "/" + layoutDir; } defaultLayout = layoutDir + defaultLayout; if (layout == null) { layout = defaultLayout; } else { layout = layoutDir + layout; } Template layoutVm = null; try { inputEncoding = (String) velocityManager.getVelocityEngine().getProperty(PROPERTY_INPUT_ENCODING); layoutVm = getTemplate(stack, velocityManager.getVelocityEngine(), invocation, layout, inputEncoding); } catch (Exception e) { LOG.error("VelocityLayoutResult: Can't load layout \"" + layout + "\": " + e); if (!layout.equals(defaultLayout)) { layoutVm = getTemplate(stack, velocityManager.getVelocityEngine(), invocation, defaultLayout, inputEncoding); } } outputEncoding = (String) velocityManager.getVelocityEngine().getProperty(PROPERTY_OUTPUT_ENCODING); Writer writer = new OutputStreamWriter(response.getOutputStream(), outputEncoding); response.setContentType(contentType); layoutVm.merge(context, writer); writer.flush(); } catch (Exception e) { LOG.error("Unable to render Velocity Template, '" + finalLocation + "'", e); throw e; } finally { if (usedJspFactory) { jspFactory.releasePageContext(pageContext); } } return; } }
2.在struts.xml中增加velocity相关配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- struts.objectFactory这个属性用于说明Struts2的 对象池创建工厂当想要得到Spring中的对象池时, --> <!-- 申明struts.objectFactory为Spring的对象池构建工厂 --> <constant name="struts.objectFactory" value="spring" /> <!-- 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。 --> <!-- 通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false --> <constant name="struts.devMode" value="false" /> <!-- 该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件 , --> <!-- 该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。 --> <constant name="struts.i18n.reload" value="false" /> <!-- 该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false --> <constant name="struts.configuration.xml.reload" value="false" /> <!-- 该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开 --> <constant name="struts.custom.i18n.resources" value="globalMessages,filePath" /> <!-- 该属性指定Struts 2生成URL时是否包含请求参数。 --> <!-- 该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。 --> <!-- <constant name="struts.url.includeParams" value="none" /> --> <!-- 该属性指定视图标签默认的视图主题,该属性的默认值是xhtml --> <constant name="struts.ui.theme" value="simple" /> <!-- 设置velocity配置文件 --> <constant name="struts.velocity.configfile" value="velocity.properties"/> <!-- 该属性设置文件上传的大小,现设置为10MB. --> <constant name="struts.multipart.maxSize" value="10485760" /> <package name="user" extends="struts-default"> <result-types> <result-type name="velocity" class="com.tairan.taihang.struts.velocity.VelocityLayoutResult"/> </result-types> <interceptors> <!-- 自定义登录拦截器 --> <interceptor name="loginInterceptor" class="loginInterceptor"/> <!-- 异常拦截器 --> <!-- <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionmappingInterceptor" /> --> <!-- 拦截器栈 --> <interceptor-stack name="myDefault"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="loginInterceptor" /> <!-- <interceptor-ref name="exception"></interceptor-ref> --> </interceptor-stack> </interceptors> <global-results> <!-- 拦截器跳转到登录页面 --> <result name="toLogin" type="velocity">WEB-INF/vm/screen/storage/user/login.vm</result> <!-- 统一的错误页面 --> <result name="error" type="velocity">WEB-INF/vm/screen/storage/error.vm</result> <!-- 异常页面 --> <result name="root" type="velocity">WEB-INF/vm/screen/storage/error.vm</result> <result name="sql" type="velocity">WEB-INF/vm/screen/storage/error.vm</result> </global-results> <!-- 全局异常处理 --> <global-exception-mappings> <!-- Action抛出Exception时,转入名为root的结果 --> <exception-mapping result="root" exception="java.lang.Exception" /> <!-- Action抛出SqlException时,转入名为sql的结果 --> <exception-mapping result="sql" exception="java.sql.Exception" /> </global-exception-mappings> <action name="index" class="userAction" method="index"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/index.vm</result> </action> <action name="toLogin" class="userAction" method="toLogin"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/user/login.vm</result> </action> <action name="login" class="userAction" method="login"> <result name="success" type="redirectAction">userInfo</result> <result name="input" type="velocity">WEB-INF/vm/screen/storage/user/login.vm</result> </action> <action name="toRegister" class="userAction" method="toRegister"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/user/register.vm</result> </action> <action name="register" class="userAction" method="register"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/user/registerSuccess.vm</result> <result name="input" type="velocity">WEB-INF/vm/screen/storage/user/register.vm</result> </action> <action name="json" class="userAction" method="toJson"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/jsonTest.vm</result> </action> <action name="exit" class="userAction" method="exit"> <result name="success" type="velocity">WEB-INF/vm/screen/storage/user/login.vm</result> </action> </package> <package name="userInfo" extends="user"> <action name="userInfo" class="userInfoAction" method="userInfo"> <interceptor-ref name="myDefault" /> <result name="success" type="velocity">WEB-INF/vm/screen/storage/userInfo/userInfo.vm</result> </action> <action name="toAddUserInfo" class="userInfoAction" method="toAddUserInfo"> <interceptor-ref name="myDefault" /> <result name="success" type="velocity">WEB-INF/vm/screen/storage/userInfo/addUserInfo.vm</result> </action> <action name="addUserInfo" class="userInfoAction" method="addUserInfo"> <result name="success" type="redirectAction">userInfo</result> </action> <action name="toModifyUserInfo" class="userInfoAction" method="toModifyUserInfo"> <interceptor-ref name="myDefault" /> <result name="success" type="velocity">WEB-INF/vm/screen/storage/userInfo/modifyUserInfo.vm</result> </action> <action name="modifyUserInfo" class="userInfoAction" method="modifyUserInfo"> <result name="success" type="redirectAction">userInfo</result> </action> <action name="toDeleteUserInfo" class="userInfoAction" method="deleteUserInfo"> <interceptor-ref name="myDefault" /> <result name="success" type="redirectAction">userInfo</result> </action> </package> <!-- JSON --> <package name="jsonTest" extends="json-default"> <action name="testList" class="jsonAction" method="getList"> <result type="json"> <param name="root">responseJsonList</param> </result> </action> <action name="testMap" class="jsonAction" method="getMap"> <result type="json"> <param name="root">responseJsonMap</param> </result> </action> <action name="testObject" class="jsonAction" method="getObject"> <result type="json"> <param name="root">responseJsonObject</param> </result> </action> <action name="checkName" class="userAction" method="checkName"> <result type="json"> <param name="root">errorMsg</param> </result> </action> <action name="checkRegisterName" class="userAction" method="checkRegisterName"> <result type="json"> <param name="root">errorMsg</param> </result> </action> </package> </struts>
需要注意的地方有3点:
(1).设置velocity配置文件
<constant name="struts.velocity.configfile" value="velocity.properties"/>
(2).修改struts2引用的VelocityResult类为我们重写后的类
<result-types> result-type name="velocity" class="com.tairan.taihang.struts.velocity.VelocityLayoutResult"/> </result-types>
(3).type不再是默认的dispatcher,修改为velocity
<result name="toLogin" type="velocity">WEB-INF/vm/screen/storage/user/login.vm</result>
3.增加velocity相关配置文件:velocity.properties
tools.view.servlet.layout.directory =/WEB-INF/vm/layout/ tools.view.servlet.layout.default.template=default.vm input.encoding=UTF-8 output.encoding=UTF-8
4.增加默认布局文件:default.vm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="IE=edge;text/html; charset=utf-8" /> <link href="htdocs/sc/css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="htdocs/sc/css/bootstrap-progress.css" rel="stylesheet" media="screen"> <link href="htdocs/sc/css/grumble.css" rel="stylesheet" media="screen"> <link href="htdocs/sc/css/bootstrap-modal.css" rel="stylesheet" media="screen"> <link href="htdocs/sc/css/bootstrap-switch.css" rel="stylesheet" media="screen"> <link href="htdocs/css/taihang.css" rel="stylesheet" type="text/css"> <!--validform --> <link href="htdocs/sc/css/style.css" rel="stylesheet" type="text/css"> <!--jquery datepicker --> <link href="htdocs/sc/css/jquery-ui.css" rel="stylesheet" type="text/css"> <script src="htdocs/sc/js/jquery-1.8.3.js"></script> <script src="htdocs/sc/js/bootstrap.js"></script> <script src="htdocs/sc/js/bootstrap-switch.js"></script> <script src="htdocs/sc/js/grumble.min.js"></script> <script src="htdocs/sc/js/thtools.js"></script> <script src="htdocs/sc/js/Chart.js"></script> <!--validform --> <script type="text/javascript" src="htdocs/sc/js/Validform_v5.3.2.js" ></script> <script type="text/javascript" src="htdocs/sc/js/Validform_Datatype.js" ></script> <script type="text/javascript" src="htdocs/sc/js/sc_Datatype.js" ></script> <!--jquery datepicker --> <script type="text/javascript" src="htdocs/sc/js/jquery-ui-datepicker.js" ></script> </head> <body> #if($pageIndex=='customersSub') $screen_content #elseif($pageIndex=='customersCenter') #parse('/WEB-INF/vm/control/head.vm') #parse('/WEB-INF/vm/control/centerTop.vm') <div class="div980 adjust pt10"> #parse('/WEB-INF/vm/control/centerLeft.vm') $screen_content </div> #parse('/WEB-INF/vm/control/bottom.vm') #end </body> </html>
5.在vm页面代码中设置布局:
#set($pageIndex="customersCenter") <div> <h1>欢迎光临!</h1> </div>
相关推荐
Struts2和Velocity是两种广泛应用于Java Web开发的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,而Velocity则是一个快速、轻量级的模板引擎,主要用于生成动态网页内容。将两者集成可以有效地提高...
Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中广泛使用,用于构建可维护、可扩展的Web应用程序。而Velocity则是一个轻量级的模板引擎,它允许开发者将HTML与Java代码分离,使得视图层...
Struts2和Velocity是Java Web开发中的两个重要框架,它们在构建动态Web应用程序时发挥着关键作用。Struts2是一个强大的MVC(Model-View-Controller)框架,而Velocity则是一个模板引擎,专注于视图层的呈现。在这个...
Struts2和Velocity是两种非常重要的Java Web开发框架。Struts2是一个强大的MVC(Model-View-Controller)框架,而Velocity则是一个快速、轻量级的模板引擎,主要用于生成动态网页内容。将两者整合使用,可以充分利用...
Struts2和Velocity是两种广泛应用于Java Web开发的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,而Velocity则是一个模板引擎,它专注于视图层的呈现,可以替代传统的JSP(JavaServer Pages)来实现...
Struts2 和 Velocity 的整合是Java Web开发中常见的技术组合,用于构建动态、高效的Web应用程序。Velocity 是一个基于模板语言的轻量级视图层框架,而Struts2 是一个强大的MVC(Model-View-Controller)框架。将这...
Struts2和Velocity是两个非常重要的Java开源框架,它们在Web开发中有着广泛的应用。Struts2是一个基于MVC(Model-View-Controller)设计模式的框架,它为构建Java Web应用程序提供了强大的支持。而Velocity则是一个...
Spring框架则是一个广泛使用的Java企业级应用开发框架,提供了一种结构化的应用开发方式。Struts2是一个基于MVC设计模式的Java Web框架,用于简化Web应用的开发。JSON(JavaScript Object Notation)是一种轻量级的...
Struts2和Velocity是两个在Java Web开发中广泛使用的开源框架。Struts2是一个MVC(Model-View-Controller)框架,它为构建基于Java应用的Web用户界面提供了强大的支持,而Velocity则是一个模板引擎,主要用于生成...
Struts2+velocity 整合时所用的jar包 资源目录如下 commons-collections-3.1 commons-digester-2.0 commons-fileupload-1.2.2 commons-lang-2.5 freemarker-2.3.16 ognl-3.0.1 oro-2.0.8 struts2-core-2.2.3.1 ...
Struts2和Velocity是两种在Java Web开发中广泛使用的开源框架。Struts2是一个MVC(Model-View-Controller)框架,它极大地简化了Java Web应用程序的开发,而Velocity则是一个快速、简单、可嵌入的Java模板引擎,用于...
在Web开发领域,Spring、Struts2、iBatis和Velocity是四个非常重要的组件,它们各自承担着不同的职责,共同构建出高效、灵活的Web应用程序。本实例以"Maven构建spring struts2 ibatis velocity小实例"为主题,将详细...
Velocity 模板引擎的优点在于,它可以使得开发人员快速开发显示层,同时也可以与 Struts2 框架集成,以实现显示层与程序代码的分离。 在 Struts2 中使用 Velocity 模板引擎,可以通过在配置文件中指定 result 的 ...
Struts2是一个流行的Java web应用程序框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式,而Velocity则是Apache软件基金会开发的一个模板引擎,用于生成动态内容。Struts2与Velocity结合使用,可以...
Struts2、Spring和Velocity是Java Web开发中的三个重要框架,它们各自负责应用程序的不同层面,协同工作可以构建出高效、可维护的Web应用。在这个"struts2+spring+velocity扩展实例V1版本"中,我们可以看到这三个...
本项目“使用了Struts结构和Velocity模板技术的BLOG”旨在演示如何结合这两种技术来创建一个功能完善的博客系统。 **Struts框架** Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它为...
在结合Struts2和Velocity时,通常会在Struts2的Action中处理业务逻辑,并将结果对象放入到Value Stack或Session中,然后配置一个Struts2的Result类型为“velocity”,指定对应的Velocity模板文件。当Action执行完成...
在实际开发中,Struts2 通常与 Velocity 结合使用,Struts2 负责业务逻辑和请求处理,Velocity 负责生成动态内容。通过将 Velocity 模板嵌入到 Struts2 的结果中,可以构建出灵活且易于维护的Web应用。在提供的...
Struts2是一个流行的Java web应用程序框架,它提供了一种组织和构建MVC(模型-视图-控制器)架构的方式。Velocity则是Apache软件基金会的一个开源模板引擎,它允许开发者使用简单的语法来创建动态网页内容。在Struts...
commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.13.jar struts2-core-2.1.6.jar xwork-2.1.2.jar