RESTRUL_CRUD_需求
显示所有员工信息
- URI: emps
- 请求方式:GET
- 显示效果

- 不论控制器返回一个String,ModelAndView,View都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转。
![]()
- 视图解析源码分析:重要的两个接口
- 断点调式
流程图
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口:

视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题




1 | @RequestMapping("hello") |
1 | /** |
1 | < fmt:setLocale> |
*注意:使用jstl国际化是,页面映射不能带前缀 *
| i18n.properties | i18n_en_US.properties | i18n_zh_CN.properties | ||
|---|---|---|---|---|
| i18n.username=username | i18n.password=password | i18n.username=Username | ||
| i18n.password=Password | i18n.username=\u7528\u6237\u540D | i18n.password=\u5BC6\u7801 | ||
| 1. 增加jstl标签 jar包(断点调试,这时的View对象就是JstlView) | ||||
![]() |
||||
| 2. 设置国际化资源文件 | ||||
|
||||
| 3. 控制器代码 | ||||
|
||||
| 4. 成功页面(/success.jsp)使用fmt标签库 | ||||
|
||||
| ## mvc:view-controller标签 | ||||
| - 若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view-controller 标签实现 | ||||
|
||||
| - 请求的路径: | ||||
|
||||
| - 配置mvc:view-controller会导致其他请求路径失效 | ||||
| - 解决办法: | ||||
|
||||
| ## 自定义视图 | ||||
| - 自定义视图(需要加入SpringMVC,那么,一定需要实现框架的接口) | ||||
| - 若希望使用 Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcelView 即可。 | ||||
| - 实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以了。 | ||||
| - AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。 | ||||
| - 视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可 | ||||
| - 若希望直接在浏览器中直接下载 Excel 文档,则可以设置响应头 Content-Disposition 的值为 attachment;filename=xxx.xls | ||||
![]() |
||||
| ## 实验代码 | ||||
| 1. 测试链接 | ||||
|
||||
| 2. 控制方法 | ||||
|
||||
| 3. 自定义视图 | ||||
|
||||
| 4. 自定义视图解析器 | ||||
|
||||
| 5. 声明视图解析器 | ||||
|
||||
| —— | ||||
| 注意:InternalResourceViewResolver默认的优先级:private int order = Integer.MAX_VALUE; |
任何方法的返回值,最终都会被包装成ModelAndView对象
processDispatchResult(HttpServletRequest request, HttpServletResponse response,HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception)
视图渲染流程:将域中的数据页面显示,页面就是渲染模型数据
render(mv, request, response);
View与ViewResolver:
ViewResolver对象就是根据视图名返回View对象
怎么能根据方法的返回值得到View对象?
1 | protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale, |
1 | @Override |
1 | @Override |
**视图解析器得到View的流程**
> 所有配置的视图解析器都来尝试根据视图名(返回值)得到View对象
> 如果能得到就返回,得不到就换下一个视图解析器
> 再调用View对象的Render,View中的render得到
1 | @Override |
renderMergedOutputModel位于InternalResourceView
1 | @Override |
为什么数据可以在请求域中获得
1 | protected void exposeModelAsRequestAttributes(Map<String, Object> model, HttpServletRequest request) throws Exception { |
视图解析器只是为了获得视图对象;视图对象才能真正的转发(将模型数据全部放在请求域中)或者重定向到页面
视图对象才能真正渲染视图
源码执行流程
Spring MVC除了在原生的request和session外还能怎么样把数据带给页面
1) 可以在方法处传入Map,或者Model或者ModelMap。给这些参数里面保存的所有数据都会放在所有的数据都会放在请求域中。可以在页面中获取
在PageContext、Request、Session、Application
Map(interface(jdk)) ModelMap(class)
Model(interface(spring))
2) 方法的返回值可以变为ModeAndView类型
既包含视图信息(页面地址)也包含模型数据(给页面带的数据)
而且数据是放在请求域中
request、session、application
3) Spring MVC提供了一种可以临时给Session域中保存数据的方式
使用一个注解 @SessionAttributes(只能标注在类上)
给BindingAwareModelMap中保存的数据,同时给session中放一份
Servlet启动加载,Servlet原本是第一次访问创建对象
load-on-startup: 服务器启动的时候创建对象,值越小优先级越高
Update your browser to view this website correctly. Update my browser now