实现了不同业务层面的解耦,隔离。
http://www.dairan.com?id=?&type=
将传输数据封装成一个完成的载体。把很多参数传成一个Model。就是一种设计模式,你也可以不封装。
视图,用来展示或者输出的模块(HTML、JSP、JSON、String、Swing、XML…)
控制交互的一个中间组件,由它来根据用户请求分发不同任务从而得到不同的结果。
DTO,POJO 就是一个 Model
MVC :基于项目开发的设计模式。用来解决用户和后台交互的问题。
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 映射管理器 }
FrameworkServlet.processRequest()
doService()
DispatcherServlet.doService()
抽象方法调用子类实现,叫做模板方法模式。
Spring url 是可以支持正则表达式的。
HandlerMapping 是模范了 Struts ActionMapping
严格地说是 Spring MVC 还支持 Ant Pattern
主要是非 Spring MVC,获取 Bean 的方式比较麻烦
需要通过 Spring 应用上下文获取
并且对于 REST 支持,其他框架相对薄弱
Spring MVC 是 Struts 2 + JAX-RS 的混合体
JAX-RS: Java API for RESTful Web Services
来源于: https://javaguide.net
微信公众号:不止极客