题记
在公司的项目中,前台界面的展现是使用Velocity模版来实现的。现在利用一些时间,把以前的使用经验记录一下,不是什么宝典秘籍,也不是什么高深理论,纯粹为一些使用经验记录,开发知识备忘。
1.介绍
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。理解这句话很重要,Veocity模版的作用,实质上是让开发者在Web页面上可以直接使用java数据对象和命令。
“模版引擎”是一个整体的概念,Velocity只是其中的一种实现方式而已,也并不仅仅是java语言有模版引擎的概念,其他PHP、Python、C#都有可用的模版引擎,具体信息可参考:http://www.oschina.net/project/tag/136/template-engine?lang=0&os=0&sort=view
理解Velocity模版,还需要区分清楚“模版”和“页面”的概念;“模版”可以看作是一个等待注入数据的一个框架,在将这个框架注入相应的数据以后,就能够生成一个用户在浏览器中看到的“页面”(请求的后缀名可以为 .html 或 .do 或 .action 或者没有,这个根据MVC框架配置确定)。
2.如何在项目中使用?
(1)配置模版引擎:
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/views/" />
<property name="configLocation" value="classpath:velocity.properties" />
</bean>
resourceLoaderPath 属性指定模版文件在项目中的路径;
(2)配置视图解析器
<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
<property name="layoutUrl" value="layout/layout.vm" />
<property name="suffix" value=".vm" />
<property name="contentType" value="text/html;charset=UTF-8" />
</bean>
suffix 属性指定模版文件的后缀名,视图解析器将会按照"模版逻辑名"+suffix 的格式来寻找模版文件。
例如:return new ModelAndView("login"); 视图的逻辑名为 login,在解析视图时,velocityViewResolver会在 resourceLoaderPath 路径下寻找“login.vm”这个模版。
3."$"引用和"#"指令
首先介绍两个特殊符号"$"和"#":以$开头的表示“引用”的意思,是指取得一些东东。而"指令"(Directives)则以#开头来表示,有点“做些什么动作”的意思。在模版页面中,引用一个java 数据对象时,使用 $userName 的格式,这个是简单的变量引用,还可以直接引用对象的属性,例如 $userInfo.userName 。"指令"以"#"开头,可以看作是VTL(Velocity Template Language)的流程控制语言,例如:赋值,循环,条件判断,引入模版,解析模版,宏调用等。下面是一个循环示例:
#foreach( $user in $userList)
#if( $user.userRole == 1)
<h1>登录成功:$user.userName</h1>
#end
#end
下面是一个条件判断的示例:
#if( $user.userRole == 2)
<h1>没有登录权限:$user.userName</h1>
#elseif( $user.userRole == 3)
<h1>您不在此权限范围:$user.userName</h1>
#end
4.很有用的#parse()指令
在页面中,经常遇到有相同内容的元素,比如几个页面的导航栏都是一样的,就可以专门定义一个 header.vm 模版,在其他需要使用到的页面中,直接 #parse("header.vm") 就ok了,注意,#parse() 后面是不加分号的。这样做的好处也是很明显的,如果要修改这个 header 的话,只需要修改一处,其他页面就全部更新了。如下为一个完整示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>示例网站</title>
</head>
<body>
#parse("/layout/header.vm")
<div class="page_wrap">
我是页面中的文字,请无视~
</div>
#parse("/layout/footer.vm")
</body>
5.接收浏览器请求(SpringMVC),响应页面
@RequestMapping(value="/login", method = RequestMethod.GET)
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
UserInfo user = new UserInfo();
user.setUserRole(1);
user.setUserName("abc");
mv.addObject("user", user);
mv.setViewName("login");
return mv;
}
6.扩展阅读
Velocity官方网站:http://velocity.apache.org/
Velocity模版使用指南:http://www.cnblogs.com/firstyi/archive/2007/11/01/945745.html
使用 Velocity 实现客户端和服务器端模板:https://www.ibm.com/developerworks/cn/java/j-velocity/index.html
Spring MVC:使用 Web 视图技术:http://www.ibm.com/developerworks/cn/education/opensource/os-ag-springframe6/section4.html