- 浏览: 29328 次
- 性别:
- 来自: 二次元世界
文章分类
最新评论
在Struts中有两种使用Velocity的方法,一种是利用Velocity的vm模板进行页面展示,一种则是利用Velocity来生成静态页面。以下介绍在Struts 1.*版本中使用Velocity的vm模板显示。
在Struts 1.*版本中,并未支持对vm模板的显示,所以当ActionForward指向一个vm模板时,只会将模板中的Velocit语句当做普通字符内容显示出来,而不对其中的Velocity语句进行任何解析及赋值。所以在Struts 1.*版本中使用Velocity,需要在web.xml中配置VelocityViewServlet,以处理后缀为.vm的模板文件。
在web.xml中进行如下配置:
这样当ActionForward指向一个后缀为vm的模板时,该Servlet便会进行对vm模板的解析及赋值工作。
在web.xml中配置Struts 1.2的ActionServlet步骤省略。
vm模板:namelist.vm
Struts Action
这里需要注意forward = new ActionForward("/namelist.vm");这句,因为在velocity.properties中已经配置了模板存放位置,所以这里直接可以指定模板名称。需要注意的是这里和Servlet中应用不同,Servlet是通过getTemplate("sample.vm")来获取模板,而Struts则是通过转发,所以模板前需要加上/。关于在servlet中使用velocity,请参考本博客的《Velocity简单示例源码解析》一文)
Struts配置
浏览器输入:http://localhost:8080/Mixele_Velocity/StrutsSample.do?dispatch=showNameList
便可看到处理结果。
在Struts的Action中,只做了对用户请求的处理,以及回复工作,和vm模板解析相关的所有工作,由VelocityViewServlet完成。
在web.xml中配置VelocityViewServlet后,当系统启动时,VelocityViewServlet类会初始化。
VelocityViewServlet初始化过程
和在Servlet中使用Velocity一样,只是在初始化的过程中增加了读取Velocity Tools配置文件的步骤。
当Action跳转打到VM文件时,VelocityViewServlet类会对VM类型文件进行解析和赋值处理。
过程如下:
doGet() --> doRequest() --> createContext() --> setContentType() --> handleRequest() --> getTemplate() --> mergeTemplate() --> getResponseWriter() --> requestCleanup()
doGet():复写的HttpServlet方法,以获取用户的request
doRequest():这是处理vm的主要方法,在其中调用了以下方法:
createContext() – 获取Velocity的上下文
setContentType() – 设置HttpServletResponse的内容类型
handleRequest() – 使用模板处理请求(这个方法通过模板路径返回一个模板对象)
mergeTemplate() – 将模板和嵌入模板中的值合并
requestCleanup() – 应该是资源回收的方法,不过源码里是个空方法
通过以上的方法,VelocityViewServlet类对vm的解析赋值完成。
在Struts 1.*版本中,并未支持对vm模板的显示,所以当ActionForward指向一个vm模板时,只会将模板中的Velocit语句当做普通字符内容显示出来,而不对其中的Velocity语句进行任何解析及赋值。所以在Struts 1.*版本中使用Velocity,需要在web.xml中配置VelocityViewServlet,以处理后缀为.vm的模板文件。
在web.xml中进行如下配置:
<servlet> <servlet-name>velocity</servlet-name> <servlet-class> org.apache.velocity.tools.view.servlet.VelocityViewServlet </servlet-class> <init-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/toolbox.xml</param-value> </init-param> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping>
这样当ActionForward指向一个后缀为vm的模板时,该Servlet便会进行对vm模板的解析及赋值工作。
在web.xml中配置Struts 1.2的ActionServlet步骤省略。
vm模板:namelist.vm
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>StrutsSample_1</title> </head> <body> <h3>StrutsSample</h3> <table width="400" border="1"> #foreach($name in $list) <tr> <td>$name</td> </tr> #end </table> </body> </html>
Struts Action
public class StrutsSample extends DispatchAction { public ActionForward showNameList(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ActionForward forward = new ActionForward(); ActionMessages errors = new ActionMessages(); List<String> list = new ArrayList<String>(); String name = null; for(int i=0;i<20;i++){ name = "Hoffman "+i+" Name"; list.add(name); } request.setAttribute("list", list); if (!errors.isEmpty()) { saveErrors(request, errors); forward = new ActionForward(mapping.getInput()); } else { forward = new ActionForward("/namelist.vm"); } return forward; } }
这里需要注意forward = new ActionForward("/namelist.vm");这句,因为在velocity.properties中已经配置了模板存放位置,所以这里直接可以指定模板名称。需要注意的是这里和Servlet中应用不同,Servlet是通过getTemplate("sample.vm")来获取模板,而Struts则是通过转发,所以模板前需要加上/。关于在servlet中使用velocity,请参考本博客的《Velocity简单示例源码解析》一文)
Struts配置
<struts-config> <action-mappings> <action path="/StrutsSample" parameter="dispatch" scope="request" type="com.mixele.velocity.struts.StrutsSample" validate="true"> <forward name="namelist" path="/templates/namelist.vm" redirect="false"/> </action> </action-mappings> </struts-config>
浏览器输入:http://localhost:8080/Mixele_Velocity/StrutsSample.do?dispatch=showNameList
便可看到处理结果。
在Struts的Action中,只做了对用户请求的处理,以及回复工作,和vm模板解析相关的所有工作,由VelocityViewServlet完成。
在web.xml中配置VelocityViewServlet后,当系统启动时,VelocityViewServlet类会初始化。
VelocityViewServlet初始化过程
public void init(ServletConfig config) throws ServletException { super.init(config); initVelocity(config); //初始化Velocity initToolbox(config); //初始化Servlet的toolbox //当Velocity初始化后,可以获取以下这些(默认内容类型、模板字符编码) defaultContentType = RuntimeSingleton.getString(CONTENT_TYPE, DEFAULT_CONTENT_TYPE); String encoding = RuntimeSingleton.getString( RuntimeSingleton.OUTPUT_ENCODING, DEFAULT_OUTPUT_ENCODING); if (!DEFAULT_OUTPUT_ENCODING.equalsIgnoreCase(encoding)) { int index = defaultContentType.lastIndexOf("charset"); if (index < 0) { defaultContentType += "; charset=" + encoding; } else { Velocity.warn("VelocityViewServlet: Charset was already " + "specified in the Content-Type property. " + "Output encoding property will be ignored."); } } Velocity.info("VelocityViewServlet: Default content-type is: " + defaultContentType); } /** 初始化Velocity */ protected void initVelocity(ServletConfig config) throws ServletException { Velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, getServletContext()); // default to servletlogger, which logs to the servlet engines log Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, ServletLogger.class.getName()); // by default, load resources with webapp resource loader Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "webapp"); Velocity.setProperty("webapp.resource.loader.class", WebappLoader.class.getName()); // Try reading an overriding Velocity configuration try { ExtendedProperties p = loadConfiguration(config); //读取配置文件(velocity.properties) Velocity.setExtendedProperties(p); } catch (Exception e) { ……源码省略…… } try { Velocity.init(); //now all is ready - init Velocity } catch (Exception e) { getServletContext().log( "VelocityViewServlet: PANIC! unable to init() - " + e); throw new ServletException(e); } } /** 读取Velocity配置文件velocity.properties中的配置 * 若该文件不存在,使用默认配置,即org/apache/velocity/tools/view/servlet/velocity.properties */ protected ExtendedProperties loadConfiguration(ServletConfig config) throws IOException { ServletContext servletContext = config.getServletContext(); //获取Velocity文件的路径 String propsFile = config.getInitParameter(INIT_PROPS_KEY); if (propsFile == null || propsFile.length() == 0) { propsFile = servletContext.getInitParameter(INIT_PROPS_KEY); } ExtendedProperties p = new ExtendedProperties(); if (propsFile != null) { p.load(servletContext.getResourceAsStream(propsFile)); Velocity.info("VelocityViewServlet: Custom Properties File: " + propsFile); } else { Velocity.info("VelocityViewServlet: No custom properties found. " + "Using default Velocity configuration."); } return p; } /** 读取Velocity Tools配置文件toolbox.xml中的配置 * 若该文件不存在,使用Velocity Tools的默认配置 */ protected void initToolbox(ServletConfig config) throws ServletException { ServletContext servletContext = config.getServletContext(); /* 检查Servlet配置中关于toolbox的配置(即/WEB-INF/toolbox.xml) */ String file = config.getInitParameter(TOOLBOX_KEY); System.out.println("VelocityViewServlet == initToolbox == file = "+file); /* check the servlet context for a toolbox */ if (file == null || file.length() == 0) { file = servletContext.getInitParameter(TOOLBOX_KEY); } /* if we have a toolbox, get a manager for it */ if (file != null) { toolboxManager = ServletToolboxManager.getInstance(servletContext, file); } else { Velocity.info("VelocityViewServlet: No toolbox entry in configuration."); } }
和在Servlet中使用Velocity一样,只是在初始化的过程中增加了读取Velocity Tools配置文件的步骤。
当Action跳转打到VM文件时,VelocityViewServlet类会对VM类型文件进行解析和赋值处理。
过程如下:
doGet() --> doRequest() --> createContext() --> setContentType() --> handleRequest() --> getTemplate() --> mergeTemplate() --> getResponseWriter() --> requestCleanup()
doGet():复写的HttpServlet方法,以获取用户的request
doRequest():这是处理vm的主要方法,在其中调用了以下方法:
createContext() – 获取Velocity的上下文
setContentType() – 设置HttpServletResponse的内容类型
handleRequest() – 使用模板处理请求(这个方法通过模板路径返回一个模板对象)
mergeTemplate() – 将模板和嵌入模板中的值合并
requestCleanup() – 应该是资源回收的方法,不过源码里是个空方法
通过以上的方法,VelocityViewServlet类对vm的解析赋值完成。
发表评论
-
Velocity在Struts 2框架下的应用
2010-06-03 16:46 992Struts 2更是提供了对Velocity和FreeMark ... -
Velocity与Struts 1.* -- 静态页生成
2010-06-02 15:36 1339在Struts中有两种使用Velocity的方法,一种是利用V ... -
Velocity简单示例源码解析
2010-05-27 17:39 1593在基于WEB的应用中,通常大多数情况下是在servlet里使用 ... -
FreeMarker表达式
2010-05-11 10:53 2454表达式是FreeMarker模板的核心功能,表达式放置在插值语 ... -
FreeMarker模板文件
2010-05-11 10:44 1136FreeMarker模板文件主要由如下4个部分构成: 1. 文 ... -
FCKeditor 2.6控制上传文件的大小
2010-05-10 15:34 2127对于上传文件的大小,FCKeditor并没有提供限制,可以通过 ... -
Fckeditor 2.6上传中文问题
2010-05-10 11:04 1168在web.xml中配置FCKeditor提供的上传Servle ... -
OSCache - 在Hibernate中使用
2010-05-04 11:28 1455创建一个Java工程OSCacheTe ... -
OSCache - CacheFilter工作原理
2010-05-04 11:16 2628系统启动 – CacheFilter OS ... -
OSCache - 缓存标签
2010-05-04 11:10 1028<cache:cache>是OSCache提供的标 ...
相关推荐
- **Struts2** 的配置文件包括`web.xml`、`struts.xml`、`struts.properties`、`struts-default.xml`、`velocity.properties`和`struts-default.vm`。`web.xml`和`struts.xml`是核心配置文件,其他文件则可选,例如...
4. **强大的融合能力**:Velocity可以与Spring、Struts等其他Java框架无缝集成,提供更强大的应用开发能力。 ** Velocity 1.6.1 版本** `velocity-1.6.1.tar.gz` 是Velocity的1.6.1版本的归档文件,这个版本包含了...
5. **velocity.properties, struts-default.vm, struts-plugin.xml** - 其他辅助配置文件,分别涉及Velocity模板引擎、默认视图模板和插件配置。 为了在MyEclipse中获得XML编辑器的代码提示,你需要手动导入Struts2...
- **struts-default.vm**:Velocity模板文件。 - **struts-plugin.xml**:插件配置文件,用于定义插件。 #### 三、IDE配置 **1. MyEclipse提示配置** - **XML提示**:为了在编辑struts.xml时获得更好的支持,需要...
- **其他配置文件**:例如velocity.properties、struts-default.vm、struts-plugin.xml等,用于定制Struts2的行为。 #### 三、开发环境配置 1. **MyEclipse提示XML信息** 在编写struts.xml文件时,若希望获得...
- **struts-default.vm**:默认的Velocity模板文件。 - **struts-plugin.xml**:用于配置插件。 #### 三、MyEclipse中的XML提示支持 **1. 让MyEclipse提示XML信息** - **步骤**:[Window] > [Preferences] > ...
- **struts-default.vm**:默认的Velocity模板文件。 - **struts-plugin.xml**:定义插件配置,用于扩展struts2的功能。 #### 三、MyEclipse支持 **1. 让MyEclipse提示xml信息** - **导入DTD文件**:通过添加...
- **struts-default.vm**:Velocity模板的示例文件。 - **struts-plugin.xml**:定义插件的配置文件。 #### 三、让MyEclipse提示XML信息 **步骤:** 1. 打开MyEclipse,依次点击:[Window] -> [Preferences] -> ...
- **velocity.properties, struts-default.vm, struts-plugin.xml**:其他配置文件,如Velocity模板配置和插件配置。 3. **IDE支持** - 在MyEclipse中,为了获得struts.xml文件的代码提示,需要手动添加DTD。首先...
- 如velocity.properties、struts-default.vm、struts-plugin.xml等,分别用于配置模板引擎、插件等功能。 #### 五、IDE支持与调试技巧 - **MyEclipse支持Struts2** - 为了获得更好的代码提示功能,需要手动导入...
在Java世界中,Velocity常被用来作为MVC框架中的视图层技术,与Struts2等框架集成,以实现更灵活的页面渲染。 在Struts2框架中整合Velocity,首先需要确保引入了必要的依赖库。根据提供的标签和部分内容,这些库...
- **其他配置文件**:如velocity.properties、struts-default.vm和struts-plugin.xml,用于特定功能或插件的配置。 4. **集成开发环境支持**: - 在MyEclipse中,为了获取XML(如struts.xml)的代码提示,需要...
- **其他配置**:如velocity.properties、struts-default.vm和struts-plugin.xml,用于特定功能的配置。 **3. 开发环境集成** - **MyEclipse提示支持**:需要导入dtd文件到XML Catalog,如`struts-2.0.dtd`,以便在...
1. **配置Struts2**:在`struts.xml`配置文件中,需要指定`struts.velocity.toolboxlocation`常量,指向Velocity的工具箱配置文件,如`/WEB-INF/toolbox.xml`。 2. **配置Action结果**:在Action的配置中,设置`...
5. **velocity.properties**、**struts-default.vm**、**struts-plugin.xml**:用于支持Velocity模板引擎和插件扩展的配置文件。 #### 五、IDE集成与调试技巧 为了提升开发效率,集成开发环境(IDE)的支持是必不...
5. **其它配置文件**:如velocity.properties、struts-default.vm、struts-plugin.xml,分别用于Velocity模板引擎、默认视图模板和插件配置。 #### 三、工具集成与开发技巧 **MyEclipse提示xml信息**:为了在编写...
Struts和Velocity是两种在Java Web开发中广泛使用的开源框架,它们在构建高效、可维护的Web应用程序中扮演着重要角色。本项目“使用了Struts结构和Velocity模板技术的BLOG”旨在演示如何结合这两种技术来创建一个...
Struts2 和 Velocity 的整合是Java Web开发中常见的技术组合,用于构建动态、高效的Web应用程序。Velocity 是一个基于模板语言的轻量级视图层框架,而Struts2 是一个强大的MVC(Model-View-Controller)框架。将这...