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

Velocity简单示例源码解析

阅读更多
在基于WEB的应用中,通常大多数情况下是在servlet里使用Velocity。在servlet里的Velocity基本应用是非常简单的,只需通过两个必要步骤就可以实现:
1. 继承org.apache.velocity.servlet.VelocityServlet抽象类:
public class SampleServlet extends VelocityServlet
2. 仅需实现VelocityServlet类的一个方法handleRequest():
public Template handleRequest(HttpServletRequest req, HttpServletResponse resp, Context context)

创建一个web工程,在webroot下建立templates文件夹以存放模板文件。
在src下建立velocity.properties配置文件,内容如下:
file.resource.loader.path = templates ##指定模板文件存放目录
runtime.log = log/velocity.log ##指定日志文件位置
关于Velocty中出现中文乱码问题,可以在velocity.properties文件中加入下面的三行就可以解决:
default.contentType=text/html; charset=UTF-8
input.encoding=UTF-8
output.encoding=UTF-8

在templates文件夹中建立名为sample.vm的模板,内容如下:
<html>
<head><title>Sample velocity page</title></head>
<body bgcolor="#ffffff">
	<center>
			<h2>Hello Velocity</h2>
			<table width="100" cellpadding="5" cellspacing="1" bordercolor="#333333">
			<tr><td bgcolor="#eeeeee" align="center">Names</td></tr>
			#foreach ($name in $theList)
			<tr><td bgcolor="#6666FF" align="center">$name</td></tr>
			#end
		</table>
	</center>
</body>
</html>


接着我们需要开发自己的Servlet,这个Servlet继承VelocityServlet。
public class SampleServlet extends VelocityServlet {
	private static final long serialVersionUID = 1L;
	/** for setting up the Velocity runtime 在系统启动时执行该方法
	 * Loads the configuration information and returns that information as a Properties, 
	 * which will be used to initialize the Velocity runtime. */
	protected Properties loadConfiguration(ServletConfig config)
			throws IOException, FileNotFoundException {
		String propsFile = config.getInitParameter(INIT_PROPS_KEY); //读取配置文件
		Properties p = new Properties();
		if (propsFile != null) {
			String realPath = getServletContext().getRealPath(propsFile);
			if (realPath != null) {
				propsFile = realPath;
			}
			p.load(new FileInputStream(propsFile));
		}
		String log = p.getProperty(Velocity.RUNTIME_LOG); //设置velocity日志文件的位置
		if (log != null) {
			log = getServletContext().getRealPath(log);
			if (log != null) { p.setProperty(Velocity.RUNTIME_LOG, log); }
		}
		String path = p.getProperty(Velocity.FILE_RESOURCE_LOADER_PATH); //设置模板的位置
		if (path != null) {
			path = getServletContext().getRealPath(path);
			if (path != null) { p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); }
		}
		return p;
	}
	/** Implement this method to add your application data to the context, 
	 * calling the getTemplate() method to produce your return value. */
	public Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) {
		String p1 = "Hoffman";
		String p2 = "Song";
		Vector personList = new Vector();
		personList.addElement(p1);
		personList.addElement(p2);
		ctx.put("theList", personList); //将模板数据 list放置到上下文环境context中
		Template outty = null;
		try {
			outty = getTemplate("sample.vm");
		} catch (ParseErrorException pee) {
			System.out.println("SampleServlet : parse error for template " + pee);
		} catch (ResourceNotFoundException rnfe) {
			System.out.println("SampleServlet : template not found " + rnfe);
		} catch (Exception e) {
			System.out.println("Error " + e);
		}
		return outty;
	}
}


然后在web.xml中配置这个Servlet,如下:
<servlet>
	<servlet-name>SampleServlet</servlet-name>
	<servlet-class>com.mixele.velocity.SampleServlet</servlet-class>
	<init-param>
		<param-name>org.apache.velocity.properties</param-name>
		<param-value>/WEB-INF/classes/velocity.properties</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>SampleServlet</servlet-name>
	<url-pattern>/SampleServlet</url-pattern>
</servlet-mapping>


部署并启动工程,之后执行这个Servlet,浏览器便会显示使用vm模板展示的页面。

org.apache.velocity.servlet.VelocityServlet继承了HttpServlet,因此它继承了HttpSetvlet的对生命周期的管理,而且,只要我们在实现自己velocity servlet的时候,继承org.apache.velocity.servlet.VelocityServlet,然后继承它的一些重要的方法就可以完成实际的业务。
当web工程启动时,系统会先执行SampleServlet的父类VelocityServlet中的init()方法。
VelocityServlet源代码:
/** 初始化Veocity */
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		initVelocity(config); //初始化Velocity
		/* Velocity初始化时修改部分配置 */
		defaultContentType = RuntimeSingleton.getString(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
		System.out.println("defaultContentType = "+defaultContentType);
	}
	/** Velocity在运行时初始化,读取Velocity配置文件 */
	protected void initVelocity(ServletConfig config) throws ServletException {
		try {
			Properties props = loadConfiguration(config); //读取velocity.properties
			Velocity.init(props); //初始化Velocity
		} catch (Exception e) {
			throw new ServletException("Error initializing Velocity: " + e, e);
		}
	}

在执行VelocityServlet类的initVelocity方法时,因为SampleServlet类继承并重写了其中所调用的loadConfiguration方法,故系统会执行SampleServlet类的loadConfiguration方法。该过程获取了自行设置velocity日志文件的位置和自行设置模板的位置。

在这个过程中,Velocity会自行访问velocity.properties配置文件,以读取其中的信息。如果不配置该配置文件,或者不配置key为file.resource.loader.path的项,在执行Template outty = getTemplate("sample.vm");语句或Template outty = getTemplate("/templates/sample.vm");时,会发生无法找到模板的错误。
至此,Velocity在容器启动初始化完毕。

当在浏览器中输入http://localhost:8080/Mixele_Velocity/SampleServlet时,Velocity的处理过程为:
从执行SampleServlet父类VelocityServlet的doGet开始 --> doRequest --> createContext  --> setContentType --> chooseCharacterEncoding --> handleRequest(SampleServlet继承) --> getTemplate(String name) --> mergeTemplate(将模板和嵌入模板中的值合并) --> requestCleanup
分享到:
评论

相关推荐

    Struts+Velocity整合示例(含源码)

    **示例源码解析** 在提供的压缩包`struts2+velocity`中,可能包含了以下内容: 1. `struts.xml`: Struts2的配置文件,定义了Action、Result和Interceptor等。 2. `Action类`: 实现特定业务逻辑的Java类,继承自...

    Velocity 源码例子

    - **模板解析**:Velocity 首先会解析模板文件,将模板中的指令(如`#if`, `#foreach`, `#set`等)识别出来,形成抽象语法树(AST)。 - **数据绑定**:在运行时,通过`VelocityContext`将Java对象绑定到模板中,...

    Spring Velocity简单的一个例子(转)

    Spring Velocity是一个将Velocity模板引擎与Spring框架集成的示例,这个例子主要展示了如何在Spring应用中使用Velocity来渲染动态内容。Velocity是一个Java模板引擎,它允许开发者将逻辑和表示分离,使得网页设计...

    velocity web开发

    以下是一个简单的Velocity模板示例: ```html $title &lt;h1&gt;Welcome, $name! &lt;p&gt;Today is $date. ``` 在这个例子中,`$title`、`$name`和`$date`都是来自上下文的变量。 ** 实战开发 ** 在实际开发中,...

    Velocity

    深入研究Velocity的源码有助于理解其工作原理,例如如何解析模板、如何执行指令、如何处理上下文对象等。这不仅可以帮助优化模板设计,还能为自定义扩展提供基础。 ### 学习资源 - 博文链接:...

    Qt6 QML Book/图形效果/粒子参数示例源码

    《Qt6 QML图形效果与粒子参数:源码解析》 Qt6是Qt框架的最新版本,它在图形渲染和用户界面设计方面有着显著的提升。QML(Qt Meta Language)是Qt提供的一种声明式语言,用于构建丰富的、动态的用户界面。在QML中,...

    SpringBoot Velocity 代码生成模板

    4. 使用Velocity模板引擎,将解析出的信息填入模板,生成Java源码。 5. 编译生成的Java文件,添加到Spring Boot项目中。 在`demo`这个文件中,可能包含了上述步骤的示例代码或者配置文件。通过学习和理解这个示例,...

    Velocity 模版

    以下是一个简单的示例: ```java VelocityContext context = new VelocityContext(); context.put("name", "张三"); Template template = Velocity.getTemplate("template.vm"); String output = template.merge...

    简单学习使用Spring+Velocity发送邮件

    此外,Spring还提供了一个`SimpleMailMessage`类,用于创建简单的邮件消息对象,包括收件人、主题、正文等内容。 接下来,我们引入Velocity。Velocity模板引擎允许我们将动态数据插入到静态的HTML模板中。例如,你...

    Velocity教程

    3. **Velocity Engine**: 这是 Velocity 的核心组件,负责解析模板,合并上下文数据,并生成最终的输出。 **三、Velocity模板语言** 1. **变量(Variable)**: 变量以`$`开头,如`$name`。当Velocity渲染模板时,它...

    Struts2&&Velocity

    在"Velocity003"这个压缩包中,可能包含了一些关于如何在Struts2项目中集成和使用Velocity模板的示例代码或教程。例如,可能有Action类的实现,展示了如何设置和返回结果对象;还有Velocity模板文件,演示了如何在...

    模板引擎 Velocity

    **源码解析** Velocity 的源码结构清晰,易于理解和扩展。主要包含以下几个关键组件: 1. **`VelocityContext`**:这是模板和 Java 代码之间的桥梁,用于存放所有要在模板中使用的变量。你可以将 Java 对象放入上...

    Velocity--java的模板引擎

    在Velocity中,View就是模板文件(.vm),它包含静态文本和Velocity指令,Model则是Java对象,Controller的工作由Velocity Engine完成,它解析模板,将Java对象的数据嵌入到模板中,生成最终的HTML或其他格式的输出...

    掌握Apache Velocity

    - **运行示例**: 包括一些简单的示例来演示Velocity的基本用法。 ### 知识点六:构建Hello World示例 - **无上下文模板**: 介绍了一个简单的模板示例,该示例不使用任何外部数据。 - **使用上下文的模板**: 展示了...

    Velocity 入门

    Velocity 示例 ```html $title &lt;h1&gt;Welcome, $user.name! &lt;p&gt;Today is #if($isWeekday)"weekday"#else"weekend"#end. #foreach($item in $list) $item #end ``` 在这个例子中,`$title`、`$user.name` ...

    velocity-1.6.1.tar.gz

    3. **Velocity Examples**:示例代码,帮助开发者理解和学习如何使用Velocity。 4. **Documentation**:包括用户手册、开发者指南、API文档等,帮助开发者更好地了解和使用Velocity。 **使用Velocity** - **安装**...

    velocity使用

    - 构建工具:在构建过程中生成源码、类文件等。 总的来说,Velocity是一个强大且灵活的模板引擎,它简化了Java应用中的视图层开发,让非编程人员也能参与,提高了协作效率,并且提供了丰富的语法结构以满足各种需求...

    NVelocity1.1版及示例Demo(全源码)

    这个压缩包“NVelocity1.1版及示例Demo(全源码)”包含了NVelocity 1.1版本的所有源代码以及相关的示例和Demo,对于学习和理解NVelocity的工作原理以及如何在实际项目中应用是非常有价值的。 NVelocity的核心功能...

    velocity

    Velocity通过使用简单的模板语言(VTL,Velocity Template Language)来实现这一目标,它的设计灵感来源于Perl和Python等脚本语言,但更强调可读性和可维护性。 在提供的压缩包文件中,我们可以看到以下几个关键...

Global site tag (gtag.js) - Google Analytics