`
精神分裂
  • 浏览: 29200 次
  • 性别: Icon_minigender_1
  • 来自: 二次元世界
社区版块
存档分类
最新评论

Velocity与Struts 1.* -- VM展示

阅读更多
在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中进行如下配置:
<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的解析赋值完成。
分享到:
评论

相关推荐

    struts1&struts2

    - **Struts2** 的配置文件包括`web.xml`、`struts.xml`、`struts.properties`、`struts-default.xml`、`velocity.properties`和`struts-default.vm`。`web.xml`和`struts.xml`是核心配置文件,其他文件则可选,例如...

    velocity-1.6.1.tar.gz

    4. **强大的融合能力**:Velocity可以与Spring、Struts等其他Java框架无缝集成,提供更强大的应用开发能力。 ** Velocity 1.6.1 版本** `velocity-1.6.1.tar.gz` 是Velocity的1.6.1版本的归档文件,这个版本包含了...

    struts2基本教程

    5. **velocity.properties, struts-default.vm, struts-plugin.xml** - 其他辅助配置文件,分别涉及Velocity模板引擎、默认视图模板和插件配置。 为了在MyEclipse中获得XML编辑器的代码提示,你需要手动导入Struts2...

    Struts2教程

    - **struts-default.vm**:Velocity模板文件。 - **struts-plugin.xml**:插件配置文件,用于定义插件。 #### 三、IDE配置 **1. MyEclipse提示配置** - **XML提示**:为了在编辑struts.xml时获得更好的支持,需要...

    struts2的基本知识

    - **velocity.properties, struts-default.vm, struts-plugin.xml**:其他配置文件,如Velocity模板配置和插件配置。 3. **IDE支持** - 在MyEclipse中,为了获得struts.xml文件的代码提示,需要手动添加DTD。首先...

    struts2学习yugz

    - 如velocity.properties、struts-default.vm、struts-plugin.xml等,分别用于配置模板引擎、插件等功能。 #### 五、IDE支持与调试技巧 - **MyEclipse支持Struts2** - 为了获得更好的代码提示功能,需要手动导入...

    velocity学习笔记与struts2整合

    在Java世界中,Velocity常被用来作为MVC框架中的视图层技术,与Struts2等框架集成,以实现更灵活的页面渲染。 在Struts2框架中整合Velocity,首先需要确保引入了必要的依赖库。根据提供的标签和部分内容,这些库...

    struts2的说明文档

    - **其他配置文件**:如velocity.properties、struts-default.vm和struts-plugin.xml,用于特定功能或插件的配置。 4. **集成开发环境支持**: - 在MyEclipse中,为了获取XML(如struts.xml)的代码提示,需要...

    Velocity语法以及整合struts2总结

    1. **配置Struts2**:在`struts.xml`配置文件中,需要指定`struts.velocity.toolboxlocation`常量,指向Velocity的工具箱配置文件,如`/WEB-INF/toolbox.xml`。 2. **配置Action结果**:在Action的配置中,设置`...

    struts2详细介绍

    5. **velocity.properties**、**struts-default.vm**、**struts-plugin.xml**:用于支持Velocity模板引擎和插件扩展的配置文件。 #### 五、IDE集成与调试技巧 为了提升开发效率,集成开发环境(IDE)的支持是必不...

    struts2笔记.doc

    5. **其它配置文件**:如velocity.properties、struts-default.vm、struts-plugin.xml,分别用于Velocity模板引擎、默认视图模板和插件配置。 #### 三、工具集成与开发技巧 **MyEclipse提示xml信息**:为了在编写...

    使用了Struts结构和Velocity模板技术的BLOG

    Struts和Velocity是两种在Java Web开发中广泛使用的开源框架,它们在构建高效、可维护的Web应用程序中扮演着重要角色。本项目“使用了Struts结构和Velocity模板技术的BLOG”旨在演示如何结合这两种技术来创建一个...

    Struts2 整合 velocity最简单工程 最少的jar包

    Struts2 和 Velocity 的整合是Java Web开发中常见的技术组合,用于构建动态、高效的Web应用程序。Velocity 是一个基于模板语言的轻量级视图层框架,而Struts2 是一个强大的MVC(Model-View-Controller)框架。将这...

Global site tag (gtag.js) - Google Analytics