Spring MVC 一种 Web 开发的设计模式
实现了不同业务层面的解耦,隔离。
http://www.dairan.com?id=?&type=
Model:
将传输数据封装成一个完成的载体。把很多参数传成一个Model。就是一种设计模式,你也可以不封装。
View:
视图,用来展示或者输出的模块(HTML、JSP、JSON、String、Swing、XML.....)
Control:
控制交互的一个中间组件,由它来根据用户请求分发不同任务从而得到不同的结果。
DTO,POJO 就是一个 Model
MVC :基于项目开发的设计模式。用来解决用户和后台交互的问题。
J2EE标准
JSP 页面是一个万能的组件,可以写 HTML、写 JS、写 JAVA 逻辑、写 SQL 语句
MVC 框架应运而生: Struts1、Struts2、Webwork、Spring MVC
SpringMVC: 只是 MVC 设计模式的应用典范。给 MVC 的实现制定了一套标准
M:支持将 URL 参数自动封装成一个 Object 或者 Map
V:自己只有一个默认的 template、支持扩展、自定义 View,能够自定义解析
C:做到把限制放宽了,任何一个类,都有可能是一个 Controller
Struts 对用户的要求太高了,Spring MVC 对应用户的要求几乎没有。写几个 annotation 就好了
DispatcherServlet
FrameworkServlet
HttpServletBean
ApplicationContextAware
-setContextInitializers
FrameworkServlet
-refresh()
-onRefresh()
@Override
protected void onRefresh(ApplicationContext context) {
// Strategy 策略
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
// 有九个策略
// 针对于每个用户请求,都会经过一些处理的策略之后,最终才能会有结果输出。
// 每种策略可以自定义敢于,但是最终的结果都是一致
// ModelAndView
// ==========这里就是传输中的 Spring MVC 中的九大组件=========
initMultipartResolver(context); // 文件上传解析,如果请求类型是 multipart 将通过 MultipartREsolver
initLocaleResolver(context);// 本地化解析
initThemeResolver(context);// 主题解析
/** 我们自己会实现 */
initHandlerMappings(context);// 通过 HandlerMapping,将请求映射到处理器
/** 我们自己会实现*/
initHandlerAdapters(context);// 通过 HandlerAdapter 继续进行多类型的参数的动态匹配
initHandlerExceptionResolvers(context);// 如果执行过程中遇到异常,将交给 HandlerExceptionResolvers
initRequestToViewNameTranslator(context); // 直接解析请求到视图名
/** 我们自己会实现*/
initViewResolvers(context);// 通过 viewResolver 解析逻辑试图到具体试图实现
initFlashMapManager(context); // flash 映射管理器
}
@Override
protected void onRefresh(ApplicationContext context) {
// Strategy 策略
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
// 有九个策略
// 针对于每个用户请求,都会经过一些处理的策略之后,最终才能会有结果输出。
// 每种策略可以自定义敢于,但是最终的结果都是一致
// ModelAndView
// ==========这里就是传输中的 Spring MVC 中的九大组件=========
initMultipartResolver(context); // 文件上传解析,如果请求类型是 multipart 将通过 MultipartREsolver
initLocaleResolver(context);// 本地化解析
initThemeResolver(context);// 主题解析
/** 我们自己会实现 */
initHandlerMappings(context);// 通过 HandlerMapping,将请求映射到处理器
/** 我们自己会实现*/
initHandlerAdapters(context);// 通过 HandlerAdapter 继续进行多类型的参数的动态匹配
initHandlerExceptionResolvers(context);// 如果执行过程中遇到异常,将交给 HandlerExceptionResolvers
initRequestToViewNameTranslator(context); // 直接解析请求到视图名
/** 我们自己会实现*/
initViewResolvers(context);// 通过 viewResolver 解析逻辑试图到具体试图实现
initFlashMapManager(context); // flash 映射管理器
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
请求过程:
FrameworkServlet.processRequest()
doService()
DispatcherServlet.doService()
抽象方法调用子类实现,叫做模板方法模式。
MVC 的基本原理:
Spring url 是可以支持正则表达式的。
Spring MVC 讨论
HandlerMapping 是模范了 Struts ActionMapping
严格地说是 Spring MVC 还支持 Ant Pattern
马哥,那你认为它能够干掉 struts 是因为它的哪一点优点呢?
主要是非 Spring MVC,获取 Bean 的方式比较麻烦
需要通过 Spring 应用上下文获取
并且对于 REST 支持,其他框架相对薄弱
Spring MVC 是 Struts 2 + JAX-RS 的混合体
JAX-RS: Java API for RESTful Web Services