我用的是velocity1.7版本,要在web使用velocity引擎,必须把它的velocity-1.7.jar包放在tomcat(整个tomcat的多个项目可以共用)或者webroot下的web-inf下(只有自己可以用);当然用到servle,就要引入tomcat的servlet-api.jar包,在引入java通用包:rt.jar环境就配置好了
下面写入html(velocity默认的后缀名是vm,我习惯用html):
代码<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< title > My JSP 'index.jsp' starting page </ title >
</ head >
< body >
#set( $this = "Velocity")
$this is so great!
< br >
#foreach( $name in $list )
$name 真的太奇妙啦! < br />
#end
#set( $condition = true)
#if ($condition)
您选择的是1!
#else
您选择的是0!
#end
< br >
我的主页. < br >
</ body >
</ html >
servlet服务端代码:
doget的方法:
代码public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType( " text/html " );
PrintWriter out = response.getWriter();
Velocity.init();
VelocityContext context = new VelocityContext();
ArrayList list = new ArrayList();
list.add( " ArrayList element 1 " );
list.add( " ArrayList element 2 " );
list.add( " ArrayList element 3 " );
list.add( " ArrayList element 4 " );
context.put( " list " , list);
Template template = null ;
String path = null ;
try
{
VelocityEngine velocityEngine = new VelocityEngine();
Properties properties = new Properties();
// 也可以在这里指定绝对路径。当指定相对路径时, 在不同的环境下是有区别的。
// 比如把程序部署到tomcat以后,相对路径相对到哪里是个很恶心的事情。
// String basePath = "";
// 可设置绝对路径
path = this .getClass().getResource( " / " ).toString()
.replaceAll( " ^file:/ " , "" );
path = request.getRealPath( " / " );
// String basePath = "E:/maven/test/velocity/src/main/resources";
// String path =
properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
velocityEngine.init(properties);
template = velocityEngine.getTemplate( " index.html " );
}
catch ( ResourceNotFoundException rnfe )
{
out.println( " Example : error : cannot find template " + path);
}
catch ( ParseErrorException pee )
{
out.println( " Example : Syntax error in template " + " : " + pee );
}
/*
* Now have the template engine process your template using the
* data placed into the context. Think of it as a 'merge'
* of the template and the data to produce the output stream.
*/
// BufferedWriter writer = writer = new BufferedWriter(
// new OutputStreamWriter(System.out));
if ( template != null )
template.merge(context, out);
out.flush();
out.close();
}
引入的包名:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import java.util.ArrayList;
import java.util.Properties;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.app.VelocityEngine;
请求端:
< html >
< head >
< title > 测试模板 </ title >
</ head >
< body >
< a href ="/servlet/WebServlet?id=aa" > 测试模板 </ a >
</ body >
</ html >
另存为wellcom.html
添加webroot下面web-inf的web.xml内容:
在web-app标签下添加:
< servlet >
< servlet-name > WebServlet </ servlet-name >
< servlet-class > javaweb.WebServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > WebServlet </ servlet-name >
< url-pattern > /servlet/WebServlet </ url-pattern >
</ servlet-mapping >
<!-- 设置开始主页 -->
< welcome-file-list >
< welcome-file > wellcom.html </ welcome-file >
</ welcome-file-list >
然后打开tomcat,开始运行,结果如下:
这里需要说明一下,welocity引擎会把html页面完全分离,就算你把模板页的后缀修改为jsp,在里面写<%%>服务端语言,输出后,tomcat也不会执行里面的服务器语言,你可以在servlet端添加模板变量,然后由模板语言代替原来的服务端代码
参考velocity api:http://velocity.apache.org/engine/releases/velocity-1.7/apidocs/index.html
这里讲一下里面用到的几个velocity api:
Velocity.init();
velocityEngine.init();
都是初始化引擎,Velocity的官方解释是:Simple Velocity Runtime engine initialization methods.也就是使用的是一个单独的引擎,不能实例化。
velocityEngine:This class provides a separate new-able instance of the Velocity template engine。可以创建多个实例化的引擎,也就是说,一个类里面可以创建多个模板
当然,如果一般网站项目都不会只用到一个项目,所以一般我们还是用velocityEngine的好
VelocityContext 是存放变量的地方,通过初始化:
VelocityContext context = new VelocityContext();
context.put("list", “test”);
可以放置数组,数字,字符串的java类型
Template 类就是通过
template = velocityEngine.getTemplate("index.html"); 获取所用的模板,这里有个地方,如果你的模板不在同一个文件夹了,需要修改
velocityEngine的模板存放文件属性,如:
Properties properties = new Properties();
path = request.getRealPath("/");
properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
velocityEngine.init(properties);
然后通过template.merge(context, out)合成到out流;这里的out是writer的类或子类
然后就可以输出了