一、简介
在文章velocity使用(一)--简介中,我们对velocity进行了基本介绍。在本文,
将介绍velocity与spring的整合,以及自定义指定的使用。
二、velocity与spring整合的开发流程
1、添加maven依赖(spring的依赖在此略写)
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency>2、配置velocity配置文件velocity.properties
input.encoding=UTF-8 output.encoding=UTF-8 contentType=text/html;charset=UTF-8 resource.loader=webapp, class class.resource.loader.description=Velocity Classpath Resource Loader class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path=/ webapp.resource.loader.cache=false userdirective=com.dragon.velocitystudy.velocity.ShowDirective3、dispatchServlet配置dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <context:annotation-config /> <context:component-scan base-package="com.dragon.velocitystudy" /> <mvc:annotation-driven /> <mvc:resources mapping="/bootstrap/**" location="/bootstrap/"/> <!--规定模板文件的类型和位置--> <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/views" /> <property name="configLocation" value="classpath:velocity.properties" /> </bean> <!--配置附加工具,以及将后缀为vm的文件交给下面的VelocityViewResolver处理--> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="prefix" value="/views/" /> <property name="suffix" value=".vm" /> <property name="contentType" value="text/html;charset=UTF-8" /> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> </list> </property> </bean> </beans>4、web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:dispatcher-servlet.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/</welcome-file> </welcome-file-list> </web-app>5、在配置路径/views/下添加vm文件即可
三、自定义指令开发流程
在使用velocity做模板时,除了默认的#foreach 、#if等指令外,还可以自定义指令。
1、实现org.apache.velocity.runtime.directive.Directive接口,创建自定义指令的控制类。
public class ShowDirective extends Directive { /** * 自定义指令名称 * @return */ @Override public String getName() { return "show"; } /** * 自定义指令类型(包块模块和行模块) * @return */ @Override public int getType() { return BLOCK; } /** * 指令操作 * @param context * @param writer * @param node * @return * @throws IOException * @throws ResourceNotFoundException * @throws ParseErrorException * @throws MethodInvocationException */ @Override public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException { Node childNode1 = node.jjtGetChild(0); //获取第一个参数 String p1 = childNode1.literal(); Node body = node.jjtGetChild(1); //获取最后一个参数的下一个,即是自定义指令内包含的内容 String bodyHtml = body.literal(); if("true".equals(p1)){ //显示原文 writer.write(bodyHtml); }else{ //不显示原文 String cacheHtml = "no content"; writer.write(cacheHtml); } return true; } }
2、配置文件velocity.properties添加自定义指令
input.encoding=UTF-8 output.encoding=UTF-8 contentType=text/html;charset=UTF-8 resource.loader=webapp, class class.resource.loader.description=Velocity Classpath Resource Loader class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path=/ webapp.resource.loader.cache=false userdirective=com.dragon.velocitystudy.velocity.ShowDirective
3、自定义指令使用
<!doctype html> <htm> <head> </head> <body> #show(true) content one #end <br/> #show(false) content two #end </body> </htm>输出:
content one
no content