- 请求处理方法执行完成后,最终返回一个 ModelAndView
对象。对于那些返回 String,View 或 ModeMap 等类型的
处理方法,Spring MVC 也会在内部将它们装配成一个
ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终
的视图对象(View),最终的视图可以是 JSP ,也可能是
Excel、JFreeChart 等各种表现形式的视图对于最终究竟采取何种视图对象对模型数据进行渲染,处
理器并不关心,处理器工作重点聚焦在生产模型数据的工
作上,从而实现 MVC 的充分解耦
视图
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客
户为了实现视图模型和具体实现技术的解耦,Spring 在
org.springframework.web.servlet 包中定义了一个高度抽象的 View
接口- 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们
不会有线程安全的问题
视图解析器
SpringMVC 为逻辑视图名的解析提供了不同的策略,可
以在 Spring WEB 上下文中配置一种或多种解析策略,并
指定他们之间的先后顺序。每一种映射策略对应一个具体
的视图解析器实现类视图解析器的作用比较单一:将逻辑视图解析为一个具体
的视图对象。- 所有的视图解析器都必须实现 ViewResolver 接口
InternalResourceViewResolver
- JSP 是最常见的视图技术,可以使用
InternalResourceViewResolver 作为视图解析器
- 若项目中使用了 JSTL,则 SpringMVC 会自动把视图由
InternalResourceView 转为 JstlView,并且若使用 JSTL 的 fmt 标签则需要在 SpringMVC 的配置文件中配置国际
化资源文件 - 示例代码:
- 导入jstl标签库
- src目录下新建三个国际化文件
- 代码
- springMVC配置文件
<!-- 配置国际化资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
- success.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
...
...
<fmt:message key="i18n.name"></fmt:message>
<br><br>
<fmt:message key="i18n.password"></fmt:message>
<br><br>
- 使用火狐浏览器进行国际化的测试
若希望直接响应通过 SpringMVC 渲染的页面,可以在springMVC的配置文件中使用 mvc:viewcontroller标签实现
<!-- 配置直接转发的页面,可以直接通过url访问,不需要经过 controller 的目标方法,但是必须配置mvc:annotation-driven 标签 -->
<mvc:view-controller path="/success" view-name="success"/>
<!-- 在实际开发中,还需要配置mvc:annotation-driven 标签 -->
<mvc:annotation-driven></mvc:annotation-driven>
测试图:
自定义视图对象
- 可以自己实现View的接口,然后调用springMVC的特殊的视图解析器进行解析,可以整合其他资源的视图(如excel)
- 示例代码
- springMVC 的配置文件
<!-- 配置视图解析器:即如何把 handler 方法返回值解析为实际的物理视图,order属性值为int类型最大值,即默认最后进行视图解析的
视图解析器
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置 BeanNameViewResolver 视图解析器:使用视图的名字来解析自定义的视图类 -->
<!-- 通过order 属性来定义视图解析器的优先级,order值越小,越优先 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
- 自定义视图类
@Component
public class MyView implements View{
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest arg1, HttpServletResponse arg2) throws Exception {
arg2.getWriter().write("hello,this is my view :"+new Date());
}
}
- 测试
@RequestMapping("testMyView")
public String testMyView() {
System.out.println("testMyView");
return "myView";
}
测试图:
- 如何使用 springMVC 实现 excel 的上传和下载