欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Velocity学习(三)Velocity遇见SpringMVC

程序员文章站 2022-06-12 09:46:43
...

在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>

 

 

相关标签: SpringMVC Velocity