Velocity学习(三)Velocity遇见SpringMVC

在SpringMVC环境中要是使用Velocity模板引擎来解析View,首先想到是用JSP时,需要配置视图解析器,Velocity同样也需要配置解析器。先看一段简单的配置

	<bean id="velocityConfig" 
		class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
	    <property name="resourceLoaderPath" value="/WEB-INF/vm" />  
	    <property name="configLocation" value="classpath:properties/velocity.properties"/>
	</bean> 
	
	 
	<bean id="velocityViewResolver" 
		class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
	    <property name="prefix" value="/WEB-INF/vm/"/>
	    <property name="suffix" value=".html"/>
	    <!--解决中文乱码-->
	    <property name="contentType" value="text/html;charset=UTF-8" />
	</bean>

 在模板中输出一句简单的话

<body>
	Welcome to  $name!!!
</body>

 在SpringMVC中又该如何给这个变量赋值?在SpringMVC中赋值其实很简单

@RequestMapping("velocity")
@Controller
public class VelocityController {
	@RequestMapping(value = "entry", method = RequestMethod.GET)
	public ModelAndView entry() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("name", "Velocity先生");
		mv.setViewName("user");
		return mv;
	}
}

 同样也是会遇到ContextPath路径问题,如果只是针对路径这一个单一问题SpringMVC有一种很简便的解决方案,通过两个简单配置,在Velocity中就可以使用Request对象。

<!-- 开放request属性 -->
	    <property name="exposeRequestAttributes" value="true"/>   
	    <property name="requestContextAttribute" value="rc"/>

 在HTML中通过下面的方式就可以拿到ContextPath

<img src="$rc.contextPath/resources/images/head.jpg" width="60" heigth="60"/>

 使用Velocity-tool2.0同样也可以拿到ContextPath而且不仅如此可以使用Velocity其他的工具对象,但是似乎Spring4对Velocity-tool2.0支持不是太友好,需要费点周折。

首先需要创建一个ViewClass对象,以下代码从网上拷贝过来如下

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.context.Context;
import org.apache.velocity.tools.Scope;
import org.apache.velocity.tools.ToolManager;
import org.apache.velocity.tools.view.ViewToolContext;
import org.springframework.web.servlet.view.velocity.VelocityToolboxView;

public class VelocityToolbox2View extends VelocityToolboxView {
	@Override
	protected Context createVelocityContext(Map<String, Object> model,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// Create a ChainedContext instance.
		ViewToolContext ctx;

		ctx = new ViewToolContext(getVelocityEngine(), request, response,
				getServletContext());

		ctx.putAll(model);

		if (this.getToolboxConfigLocation() != null) {
			ToolManager tm = new ToolManager();
			tm.setVelocityEngine(getVelocityEngine());
			tm.configure(getServletContext().getRealPath(getToolboxConfigLocation()));
			if (tm.getToolboxFactory().hasTools(Scope.REQUEST)) {
				ctx.addToolbox(tm.getToolboxFactory().createToolbox(Scope.REQUEST));
			}
			if (tm.getToolboxFactory().hasTools(Scope.APPLICATION)) {
				ctx.addToolbox(tm.getToolboxFactory().createToolbox(Scope.APPLICATION));
			}
			if (tm.getToolboxFactory().hasTools(Scope.SESSION)) {
				ctx.addToolbox(tm.getToolboxFactory().createToolbox(Scope.SESSION));
			}
		}
		return ctx;
	}

}

 自定义ViewClass对象,下面将配置到SpringMVC解析器中

 <!-- 配置 velocity工具类  -->
	    <property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml"/>
	    <!-- Spring4 支持  velocity-tools2.0 -->
	    <property name="viewClass" value="org.lian.util.VelocityToolbox2View"/>

 toolbox.xml配置文件如下

<?xml version="1.0" encoding="UTF-8"?>

<tools>
   <toolbox scope="request">
     <tool key="link" class="org.apache.velocity.tools.view.LinkTool"
              forceRelative="true" includeRequestParams="true"/>
   </toolbox> 
</tools>
            

 这时我们也可以通借助Velocity工具对象来拿到ContextPath

<img src="$link.contextPath/resources/images/head.jpg" width="60" heigth="60"/>

 最后看一下完整配置

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
	    <property name="resourceLoaderPath" value="/WEB-INF/vm" />  
	    <property name="configLocation" value="classpath:properties/velocity.properties"/>
	</bean> 
	
	 
	<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
	    <property name="prefix" value="/WEB-INF/vm/"/>
	    <property name="suffix" value=".html"/>
	    <!--解决中文乱码-->
	    <property name="contentType" value="text/html;charset=UTF-8" />
	    <!-- 配置 velocity工具类  -->
	    <property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml"/>
	    <!-- Spring4 支持  velocity-tools2.0 -->
	    <property name="viewClass" value="org.lian.util.VelocityToolbox2View"/>
	    <!-- 开放request属性 -->
	    <property name="exposeRequestAttributes" value="true"/>   
	    <property name="requestContextAttribute" value="rc"/>
	</bean>

猜你喜欢

转载自blog-chen-lian.iteye.com/blog/2380837