這篇文章適合的人:
- 已經瞭解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定位到具體的Controllerweb.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 {@Overrideprotected 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對應第三步中傳入的變數名。
最終瀏覽器中輸出: