这篇文章适合的人:
- 已经了解Spring MVC request 处理流程(参见 《Spring MVC请求处理流程》,该篇待续)
- 用maven开发
在Controller返回ModelAndView对象后,我希望view层用velociyt模版展示,需要配置特殊的ViewResolver。以请求http://localhost/vmview.htm为例,分以下几块说明:
- maven配置
- request定位到Contoller
- controller如何处理
- 模版选择,渲染输出
1. maven 的dependency
<properties>
<org.springframework.version>2.5.6</org.springframework.version>
</properties>
<dependencies>
<!-- servlet api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.5</version>
</dependency>
<dependencies>
2. 让request定位到具体的Controller
web.xml配置:
<!-- 配置上下文载入器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
ContextLoaderListner默认载入配置文件appName(项目名)-servlet.xml。
appName-servlet.xml配置:
<bean name="/vmview.htm" class="com.tiemei.spring.demo.controller.VelocityController" />
<!-- for velocity view -->
<bean id="velocityConfig"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/templates/" />
</bean>
<bean id="vmViewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".vm" />
<property name="order" value="1" /> <!-- 多ViewResovler配置 -->
</bean>
默认BeanNameUrlHandlerMapping,/vmview.htm路径的请求被分发到VelocityController。
3. VelocityController
public class VelocityController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.println("------------ enter VelocityController");
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
return new ModelAndView("vmview", "list", list);
}
}
最后new MovdelAndView传入的第一个参数vmview在后续ViewSovler寻找对应view时用到。
4. 定位模版,渲染输出
第2步中的appName-servlet.xml定义了寻找模版的规则。会去/WEB-INF/templates/目录下寻找vmview.vm模版(模版名由第3步确定)。
vmview.vm内容:
<ul>
#foreach( $entry in $list )
<li>$entry</li>
#end
</ul>
$list对应第三步中传入的变量名。
最终浏览器中输出:
- one
- two
- three