velocity在servlet中的使用
本文将对velocity进行简单的介绍,并展示Velocity在servlet中的基本方式。但是其中有些东西我也不是十分理解,惭愧惭愧。
1.定义
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的方法。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
2.用途
网页应用(动态网页)
代码生成(根据模板生成java代码,sql代码或者js代码等)
自动生成邮件内容(网站注册,密码提示或者自动生成的报告)
XML转化
3.velocity的JAR包
当前稳定版本是1.7.
两个JAR包,一个是velocity-1.7.zip,这是velocity的主包,包含
-velocity-<version>.jar 说明: 只包含org.apache.velocity.* packages下特定的代码,不含依赖包,适合嵌入自己的代码或者大型项目
-velocity-dep-<version>.jar 说明:包含Velocity引擎的所有代码(runtime,anakia, texen and their respective ant tasks)和其他所有的依赖包
两外一个是:velocity-tools-2.0.gz,这是velocity的工具包,其中包含
-velocity-tools-<version>.jar 说明:包含三个包中的所有内容
-velocity-tools-view-<version>.jar 说明:只包含VelocityView和Generic Tools子项目的类,不含Struts相关的内容。
-velocity-tools-generic-<version>.jar 说明:只含有velocity-tools-generic子项目点的类,不依赖Servlet API 或者 Struts.
4.使用Velocity
这里,我只介绍两种使用方式,一种是不使用tools工具包的,一种是使用tools工具包的。而且,都是配合Servlet下的使用。
注意:velocity使用时需要一个配置文件和一个后缀名为vm的模板文件。
不使用tools工具包
1.项目结构
2.TestVelocity.java
1 package com.bjsxt.velocity.action; 2 3 import java.io.BufferedWriter; 4 import java.io.IOException; 5 import java.util.ArrayList; 6 import java.util.Properties; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 import org.apache.velocity.Template; 14 import org.apache.velocity.VelocityContext; 15 import org.apache.velocity.app.Velocity; 16 import org.apache.velocity.exception.ParseErrorException; 17 import org.apache.velocity.exception.ResourceNotFoundException; 18 19 20 public class TestVelocity extends HttpServlet { 21 22 private static final long serialVersionUID = 1L; 23 public void doGet(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 doPost(request, response); 26 } 27 28 public void doPost(HttpServletRequest request, HttpServletResponse response) 29 throws ServletException, IOException { 30 //载入配置文件 31 Properties p=new Properties(); 32 p.setProperty("file.resource.loader.class", 33 "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 34 Velocity.init(p); 35 36 //取得VelocityContext作用域 37 VelocityContext context = new VelocityContext(); 38 //将list放入context作用域 39 context.put("list", getNames()); 40 context.put("uname", "Vic"); 41 42 Template template = null; 43 String templateFile = "example.vm"; 44 try { 45 //载入模板文件 46 template = Velocity.getTemplate(templateFile); 47 } catch (ResourceNotFoundException rnfe) { 48 System.out.println("Example : error : cannot find template "+ templateFile); 49 } catch (ParseErrorException pee) { 50 System.out.println("Example : Syntax error in template "+ templateFile + ":" + pee); 51 } 52 BufferedWriter writer = new BufferedWriter(response.getWriter()); 53 if (template != null) 54 template.merge(context, writer); 55 writer.flush(); 56 writer.close(); 57 } 58 private ArrayList getNames() { 59 ArrayList list = new ArrayList(); 60 list.add("ArrayList element 1"); 61 list.add("ArrayList element 2"); 62 list.add("ArrayList element 3"); 63 list.add("ArrayList element 4"); 64 return list; 65 } 66 public void init() throws ServletException { 67 super.init(); 68 } 69 }
2.模板文件
#set( $this = "Velocity")
$this is great!
#foreach( $name in $list )
$name is great!
#end
My Name Is $uname
3.访问http://localhost:8080/hello_velocity/testVelocity.action即可。
结果:
Velocity is great!
ArrayList element 1 is great!
ArrayList element 2 is great!
ArrayList element 3 is great!
ArrayList element 4 is great!
My Name Is Vic
-------------------------------------------------------------------------------
以下内容来自http://www.blogjava.net/sxyx2008/archive/2010/11/11/337819.html
使用tools工具包
项目目录:
2.velocity.properties
resource.loader = webapp webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader webapp.resource.loader.path=/WEB-INF/vm/ input.encoding=gbk output.encoding=gbk
3.
1 package com.bjsxt.velocity.action; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.apache.velocity.Template; 10 import org.apache.velocity.context.Context; 11 import org.apache.velocity.tools.view.VelocityViewServlet; 12 13 import com.bjsxt.velocity.bean.Department; 14 import com.bjsxt.velocity.bean.Employee; 15 16 17 @SuppressWarnings("serial") 18 public class CustomerVelocityServlet extends VelocityViewServlet{ 19 20 21 //设置返回视图为text/html编码为gbk 22 @Override 23 protected void setContentType(HttpServletRequest request, 24 HttpServletResponse response) { 25 response.setContentType("text/html;charset=gbk"); 26 } 27 28 //处理请求 29 @Override 30 protected Template handleRequest(HttpServletRequest request, 31 HttpServletResponse response, Context ctx) { 32 ctx.put("username", "张三"); 33 ctx.put("password", "123456789"); 34 ctx.put("age", "20"); 35 ctx.put("address", "陕西西安"); 36 ctx.put("blog", "http://blogjava.net/sxyx2008"); 37 38 List<Employee> list=new ArrayList<Employee>(); 39 list.add(new Employee(1,"张三","陕西西安",18,new Department(1,"软件研发部1"))); 40 list.add(new Employee(2,"张三","陕西西安",19,new Department(2,"软件研发部2"))); 41 list.add(new Employee(3,"张三","陕西西安",20,new Department(3,"软件研发部3"))); 42 list.add(new Employee(4,"张三","陕西西安",21,new Department(4,"软件研发部4"))); 43 list.add(new Employee(5,"张三","陕西西安",22,new Department(5,"软件研发部5"))); 44 list.add(new Employee(6,"张三","陕西西安",23,new Department(6,"软件研发部6"))); 45 list.add(new Employee(7,"张三","陕西西安",24,new Department(7,"软件研发部7"))); 46 list.add(new Employee(8,"张三","陕西西安",25,new Department(8,"软件研发部8"))); 47 list.add(new Employee(9,"张三","陕西西安",26,new Department(9,"软件研发部9"))); 48 list.add(new Employee(10,"张三","陕西西安",27,new Department(10,"软件研发部10"))); 49 50 ctx.put("list", list); 51 //调用父类的方法getTemplate() 52 return getTemplate("demo.vm"); 53 } 54 }
4.demo.vm文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> velocity </TITLE> </HEAD> ##嘿嘿,我是velocity中的注释噢 #* 嘿嘿,我也是velocity中的注释噢 *# <BODY> <h1>hehe,这是经过由servlet返回的velocity视图</h1> hello ${username},这是你的信息 <ul> <li>用户密码为:${password}</li> <li>年龄为:${age}</li> <li>出生地址为:${address}</li> <li>个人主页为:<a href='${blog}'>${blog}</a></li> </ul> <br/> #foreach($emp in $!{list}) $!{velocityCount} $!{emp.id} $!{emp.ename} $!{emp.eaddress} $!{emp.age} $!{emp.department.id} $!{emp.department.deptname} <hr/> #end </BODY> </HTML>
5.访问http://localhost:8080//hello_velocity2/customerVelocityServlet.action
结果:
hehe,这是经过由servlet返回的velocity视图
hello 张三,这是你的信息
用户密码为:123456789
年龄为:20
出生地址为:陕西西安
个人主页为:http://blogjava.net/sxyx2008
1 1 张三 陕西西安 18 1 软件研发部1
2 2 张三 陕西西安 19 2 软件研发部2
3 3 张三 陕西西安 20 3 软件研发部3
4 4 张三 陕西西安 21 4 软件研发部4
5 5 张三 陕西西安 22 5 软件研发部5
6 6 张三 陕西西安 23 6 软件研发部6
7 7 张三 陕西西安 24 7 软件研发部7
8 8 张三 陕西西安 25 8 软件研发部8
9 9 张三 陕西西安 26 9 软件研发部9
10 10 张三 陕西西安 27 10 软件研发部10
项目文件打包下载:
http://dl.vmall.com/c0mlkunq2s