21.13.3 视图-请求与视图名的映射

RequestToViewNameTranslator接口可以在逻辑视图名未被显式提供的情况下,决定一个可用的逻辑视图View名。

DefaultRequestToViewNameTranslator能够将请求URL映射到逻辑视图名上去,如下面代码例子所示:

  1. public class RegistrationController implements Controller {
  2. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
  3. // 处理请求……
  4. ModelAndView mav = new ModelAndView();
  5. // 向Model中添加需要的数据
  6. return mav;
  7. // 请注意这里,没有设置任何View对象或逻辑视图名
  8. }
  9. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <!-- 这个众人皆知的bean将为我们自动生成视图名 -->
  8. <bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
  9. <bean class="x.y.RegistrationController">
  10. <!-- 如果需要,注入依赖 -->
  11. </bean>
  12. <!-- 请请求URL映射到控制器名 -->
  13. <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
  14. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  15. <property name="prefix" value="/WEB-INF/jsp/"/>
  16. <property name="suffix" value=".jsp"/>
  17. </bean>
  18. </beans>

请注意在handleRequest(...)方法实现中,返回的ModelAndView对象上自始至终未设置任何View对象或逻辑视图名。这是由DefaultRequestToViewNameTranslator完成的,它的任务就是从请求的URL中生成一个逻辑视图名。在上面的例子中,RegistrationController与配置的ControllerClassNameHandlerMapping一起使用的结果是,一个URL为<http://localhost/registration.html>的请求,会经由DefaultRequestToViewNameTranslator生成并对应到一个逻辑视图名registration上。该逻辑视图名又会由InternalResourceViewResolverbean解析到/WEB-INF/jsp/registration.jsp视图上。

你无需显式地定义一个DefaultRequestToViewNameTranslatorbean。如果默认的DefaultRequestToViewNameTranslator配置已能满足你的需求,那么你无需配置,Spring Web MVC的DispatcherServlet会为你实例化这样一个默认的对象。

当然,如果你需要更改默认的设置,那你就需要手动地配置自己的DefaultRequestToViewNameTranslatorbean。关于可配置属性的一些详细信息,你可以去咨询DefaultRequestToViewNameTranslator类详细的java文档。