velocity 的学习笔记
项目中需要使用模板来建构整体框架,使前台和后台分开,
找来找去发apache的 velocity 不错,周末研究了一下,
部分代码是网上所得,根据自己实际的操作做了下笔记。
velocity 网站: http://velocity.apache.org/
从官网上看,velocity自己有一套模板书写的语法格式,
不是很难,关键是要懂得模板运行机制,总结了一下,
模板技术就是一种替换技术,以前php使用正则表达式同样可以
实现模板的替换,而在JAVA下,apache已经提供了功能强大且开源的velocity,
为何不试试呢。
以下是我的Linux AD4+RESIN-2.1.17+JDK1.6下的配置
基本机制:
建立模板文件,
使用jsp或者servlet来读取模板文件,替换相应的变量,达到你需要的表现效果,
其中velocity有一些特有的配置方法,具体可以看看相关资料。
目录结构:
我把模板文件放在发布目录中,为了方便,建立了templates目录
../httpdocs/templates
把velocity-1.5.jar 放到lib目录下,
具体为: WEB-INF/lib
我在配置时出现了缺少apache.common包的问题,google了一下,原来是少了
velocity-dep-1.5.jar包,把它也放到lib下
新建 velocity.properties 配置文件
内容为:
file.resource.loader.path = templates #指定模板的目录
runtime.log = log/velocity.log #实际为发布目录的log目录,但是我在测试过程中没有生成日志。
把它放到classes目录下
接下可以是新建模板文件
本例子也网上看到的。修改了一下,servlet读取模板时出现了中文显示的乱码问题。
filename: temp.vm
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″ />
<title>velocity 测试页面</title>
</head>
<body bgcolor=”#ffffff”>
<center>
<h2>模板测试</h2>
<i>d动物列表:</i>
<table cellspacing=”0″ cellpadding=”5″ width=”100%”>
<tr>
<td bgcolor=”#eeeeee” align=”center”>姓名</td>
</tr>
#foreach ($name in $theList)
<tr>
<td bgcolor=”#eeeeee”>$name</td>
</tr>
#end
</table>
</center>
</html>
#### TempServlet.java
package com.2hei.temp.Exp;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.Vector;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.VelocityServlet;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
public class TempServlet extends VelocityServlet
{
protected Properties loadConfiguration(ServletConfig config)throws IOException, FileNotFoundException{
/*
* 得到属性配置文件并load它
*/
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));
}
/*
* 设置velocity日志文件在web应用中的位置
*/
String log = p.getProperty(Velocity.RUNTIME_LOG);
if (log != null){
log = getServletContext().getRealPath(log);
if (log != null) {
p.setProperty(Velocity.RUNTIME_LOG, log);
}
}
/*
* 设置模板文件在web应用中的位置
*/
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;
}
public Template handleRequest(HttpServletRequest request,HttpServletResponse response,Context ctx){
//response.setContentType(“text/html;charset=utf-8”);
String p1 = “I’m a Cat”;
String p2 = “I’m a Dog”;
Vector personList = new Vector();
personList.addElement(p1);
personList.addElement(p2);
/*
* 将模板数据 list 放置到上下文环境 context 中去
*/
ctx.put(“theList”, personList);
/*
* 获取模板对象,有三种可能产生的异常
*/
Template outty = null;
try{
outty = getTemplate(“temp.vm”);
} catch (ParseErrorException pee){
System.out.println(
“SampleServlet : parse error for template ” + pee);
}catch (ResourceNotFoundException rnfe){
System.out.println(“TempServlet : template not found ” + rnfe);
}catch (Exception e){
System.out.println(“Error ” + e);
}
return outty;
}
}
现在模板可以显示出来:
本文固定链接: https://www.2hei.net/2007/09/02/velocity-%e7%9a%84%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0/ | 2hei.net
最活跃的读者