使用 Velocity 作为 viewResolver 是可能的。
我正在使用这个配置:
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/views/"/>
<property name="velocityProperties">
<props>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
</props>
</property>
</bean>
<!-- #Velocity -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".vm" />
<property name="layoutUrl" value="layout1.vm" />
<property name="contentType" value="text/html;charset=UTF-8" />
</bean>
属性 layoutUrl 是您的默认模板,即 webapp/WEB-INF/views/ 文件夹中的 HTML 文件:
layout1.vm:
<html>
<body>
<h1>Hello world 1!</h1>
$screen_content
</body>
</html>
velocity View Resolver 会将 $screen_content 替换为控制器响应的视图内容:
MyController.java
...
@RequestMapping("/mycontroller")
public String myController() {
return "myView1";
}
...
所以,如果 webapp/WEB-INF/views/ 中的视图 myView1.vm 类似于:
<h2> Foo Bar! </h2>
对 /myApp/mycontroller 的请求的结果如下:
<html>
<body>
<h1>Hello world 1!</h1>
<h2> Foo Bar! </h2>
</body>
</html>
如果你想使用另一个模板,你可以在你的控制器上动态设置它,在你的模型变量上设置值:
...
@RequestMapping("/mycontrollerWithADifferentLayout")
public String myController2(Model m) {
m.addAttribute("layout", "layout2");
return "myView1";
}
...
在模型上设置“布局”属性时,Velocity 将使用提供的视图作为模板。