视图和视图解析器
请求处理方法执行完成之后,最终返回的是一个ModelAndView对象,对于那些返回String,View或者ModelMap等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。
SpringMVC接触视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可能是EXCEL、JFreeChart等各种表现是形式的视图
对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。
视图(View)
视图的作用使渲染模型数据,将模型里的数据以某种形式呈现给客户。为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个高度抽象的View接口
视图对象由视图解析器负责实例化,由于视图是无状态的,所以它们不会有现成安全的问题。
视图解析器(ViewResolver)
SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring Web上下文中配置一种或多种解析策略,并制定它们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。所有的视图解析器都必须实现ViewResolver接口。
org.springframework.web.servlet.view.InternalResourceViewResolver用于JSP解析。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
若项目中使用了JSTL,则SpringMVC会自动把视图由InternalResourceView转化为JstlView。若使用JSTL的fmt标签,则需要在SpringMVC的配置文件中配置国际化资源文件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
如果希望直接相应通过SpringMVC渲染的页面而不经过Handler处理,那么可以使用mvc:view-controller标签实现,比如直接访问/success,不经过Handler而直接访问success。jsp页面,由视图解析器解析为相应的jsp页面。首先需导入MVC命名空间,如下配置
<mvc:view-controller path="/success" view-name="success"/>
//为了保证原先的请求能够正确找到相应的页面,必须配置以下代码,才能够正常
<mvc:annotation-driven></mvc:annotation-driven>
自定义视图解析器
首先需要创建视图解析器类,是实现View接口,并且需要由Spring容器管理
@Component
public class MyView implements View {
public String getContentType() {
// TODO Auto-generated method stub
return "text/html";
}
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// TODO Auto-generated method stub
System.out.println("*********");
response.getWriter().write("this is 自定义视图!");
}
}
配置视图解析器,BeanNameViewResolver根据视图名字解析视图
//通过order属性指定视图解析器的优先级,值越小优先级越高,
//开始配置的InternalResourceViewResolver默认是最大的,为Integer.MAX_VALUE
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
编写Handler中的处理方法
//返回值是自定义视图解析器的类名第一个字母小写的名字
@RequestMapping("/testView")
public String testView() {
return "myView";
}
重定向:
一般情况系啊,控制器方法返回字符串类型的值会被当成逻辑视图名处理,如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理。将forward:和redirect:当成指示符,其后的字符串作为URL来处理。
redirect:success.jsp : 会完成一个到success.jsp的重定向的操作
forward:success.jsp : 会完成一个到success.jsp的转发操作