题记 html
在公司的项目中,前台界面的展示是使用Velocity模版来实现的。如今利用一些时间,把之前的使用经验记录一下,不是什么宝典秘籍,也不是什么高深理论,纯粹为一些使用经验记录,开发知识备忘。 java
1.介绍 web
Velocity是一个基于java的模板引擎(template engine)。它容许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。理解这句话很重要,Veocity模版的做用,实质上是让开发者在Web页面上能够直接使用java数据对象和命令。 spring
“模版引擎”是一个总体的概念,Velocity只是其中的一种实现方式而已,也并不单单是java语言有模版引擎的概念,其余PHP、Python、C#都有可用的模版引擎,具体信息可参考:http://www.oschina.net/project/tag/136/template-engine?lang=0&os=0&sort=view apache
理解Velocity模版,还须要区分清楚“模版”和“页面”的概念;“模版”能够看做是一个等待注入数据的一个框架,在将这个框架注入相应的数据之后,就可以生成一个用户在浏览器中看到的“页面”(请求的后缀名能够为 .html 或 .do 或 .action 或者没有,这个根据MVC框架配置肯定)。 浏览器
2.如何在项目中使用? 服务器
(1)配置模版引擎: app
<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