21.13.3 关于RequestToViewNameTranslator视图
如果一个View对象的逻辑视图名没有被显式指定,
RequestToViewNameTranslator接口会决定这个View对象的逻辑名。它只有一个实现类,叫DefaultRequestToViewNameTranslator。
DefaultReuqestToViewNameTranslator会把请求的多个URL映射到指定的逻辑视图名,见下例:
public class RegistrationController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
//处理请求...
ModelAndView mav = new ModelAndView();
// 添加一些必要的数据到model中...
return mav;
//请注意,既没有指定View对象,也没有设定逻辑视图名
}
}
<?xmlversion="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!—这就是那个众所周知的,用来生成视图名的bean-->
<bean id="viewNameTranslator"
class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
<bean class="x.y.RegistrationController">
<!—注入必要的依赖包 -->
</bean>
<!—把请求的URL映射到Controller的名字 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</bean>
请注意,在handleRequest(..)这个方法中的实现内容,在ModelAndView对象中,没有设定任何View对象或逻辑视图名就返回了。DefaultRequestToViewNameTranslator已经被指定用来从请求的URL中来生成一个逻辑视图名。在上例中的情况下,RegistrationController会与ControllerClassNameHandlerMapping一起合作,利用DefaultRequestToViewNameTranslator把类似http://localhost/registration.html这样的网址看作是请求叫registration的逻辑视图名,然后,这个逻辑视图名将被InternalResourceViewResolver这个bean解析到/WEB-INF/jsp/registration.jsp这个页面。
小提示:
你不必显式定义一个DefaultRequestToViewNameTranslator的bean。如果你喜好这个bean的默认配置,你可以依靠String Web MVC的DispatcherServlet来初始化这个类的实例。
当然,如果你想要改变这个bean的默认配置,你就需要显式的配置自己的DefaultRequestToViewNameTranslator的bean了。请参考DefaultRequestToViewNameTranslaot的文档来了解更多这个bean能被配置的属性。