velocity是模版引擎,简单说就是替代jsp的一个东西。
前一阵子用过webpy和它默认额templetor模版,明白了render(渲染)是怎么会事儿:模版文件主体是html,用于展示页面,页面中会变化的那些数据则使用模版语法调用后端脚本语言的对象来实现。webpy的templetor给我的感觉是渲染是在server端进行的,其他渲染模版应该也一样。简言之,渲染就是server端将夹杂有脚本语言变量对象的模版文件解释为纯html页面的过程!
velocity可以和struts,spring mvc等框架结合使用,当然最基本的是纯Servlet+Velocity的组合。
velocity当前版本1.7,使用Servlet时候需呀velocity和velocity tools包,使用后者中的VelocityViewServlet。以前1.4版本和之前用的VelocityServlet已经不推荐使用。
Eclipse中创建最简单Servlet+Velocity的webapp,过程:
新建Dynamic web app,配置tomcat等应用容器
修改web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>velocity</servlet-name> <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.vm</welcome-file> </welcome-file-list> </web-app>
在web.xml同一级路径下添加velocity.properties:
velocimacro.library = /WEB-INF/VM_global_library.vm velocimacro.permissions.allow.inline = true velocimacro.permissions.allow.inline.to.replace.global = false velocimacro.permissions.allow.inline.local.scope = false velocimacro.context.localscope = false
在webapp根目录下创建index.vm模版文件(velocity template,所以后缀是vm):
<html> <body> I'm a velocity template. #if ($XHTML) #set( $br="<br />") #else #set( $br="<br>") #end $br $br </body> </html>
好了,项目可以运行了。因为就是要run通一个最简单的Servlet+Velocity的webapp。部署到server上,打开localhost://your_app_name/index.vm查看页面
好吧,确实太简陋了什么都做不了。后台的servlet和前台模版之间连数据交互都没有,怎么搞呢?
=========================
可能是后台servlet和前台vm模版文件之间数据交互太低级了以至于网上的教程中我没找到明确说怎么传递的:(
先前用过web.py+templetor组合中,传递的数据是以参数形式传递的,不过在velocity中,自定义的Servlet通过继承VelocityViewServlet类,并重写protected Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)这一方法,就相当于原来的HttpServlet的doPost( )方法了,其中的ctx参数是一个「数据容器」,把需要传递给vm模版文件的数据扔进去就好了(调用.put( )方法来插入key-value对)。
比如这么写:
package com.velocity.servlet; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.velocity.Template; import org.apache.velocity.context.Context; import org.apache.velocity.tools.view.VelocityViewServlet; import com.velocity.bean.Department; import com.velocity.bean.Employee; @SuppressWarnings("serial") public class CustomerVelocityServlet extends VelocityViewServlet{ //设置返回视图为text/html编码为utf-8 @Override protected void setContentType(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html;charset=utf-8"); } //处理请求 @Override protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) { ctx.put("username", "张三"); ctx.put("password", "123456789"); ctx.put("age", "20"); ctx.put("address", "陕西西安"); ctx.put("blog", "http://blogjava.net/sxyx2008"); List<Employee> list=new ArrayList<Employee>(); list.add(new Employee(1,"张三","陕西西安",18,new Department(1,"软件研发部1"))); list.add(new Employee(2,"张三","陕西西安",19,new Department(2,"软件研发部2"))); list.add(new Employee(3,"张三","陕西西安",20,new Department(3,"软件研发部3"))); list.add(new Employee(4,"张三","陕西西安",21,new Department(4,"软件研发部4"))); list.add(new Employee(5,"张三","陕西西安",22,new Department(5,"软件研发部5"))); list.add(new Employee(6,"张三","陕西西安",23,new Department(6,"软件研发部6"))); list.add(new Employee(7,"张三","陕西西安",24,new Department(7,"软件研发部7"))); list.add(new Employee(8,"张三","陕西西安",25,new Department(8,"软件研发部8"))); list.add(new Employee(9,"张三","陕西西安",26,new Department(9,"软件研发部9"))); list.add(new Employee(10,"张三","陕西西安",27,new Department(10,"软件研发部10"))); ctx.put("list", list); //调用父类的方法getTemplate() //return getTemplate("demo.vm", "utf-8"); return getTemplate("demo.vm");//!!!调用模版文件 } }
模版文件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>
好吧我承认这段代码也是网上copy来的,我只不过是把velocity的包换成最新的1.7版和velocity-tool2.0版本,发现也能运行,只不过包的引入VelocityViewServlet在新版中换了位置,从org.apache.velocity.tools.view.Servlet.VelocityViewServlet换到了org.apache.velocity.tools.view.VelocityViewServlet(少了包的最后一层路径)
工程下载:http://pan.baidu.com/s/1eQd9Kjg