深入理解Spring MVC

1. Spring MVC 设计思想

1.1 回顾servlet 与jsp 执行过程

WEB-INF/web.xml

<servlet>
    <servlet-name>servlet</servlet-name>
    <servlet-class>bat.ke.qq.com.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>servlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
@WebServlet("/hello") 
public class HelloServlet extends HttpServlet {
   

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        resp.setContentType("text/html");
        resp.getWriter().write("<h1>hello world</h1>");
    }
}

img

1.2 什么是Spring MVC

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。其正式名称“Spring Web MVC”来自它的源模块(Spring -webmvc)的名称,但它更常见的名称是“Spring MVC”。

Springmvc本质上还是在使用Servlet处理,并在其基础上进行了封装简化了开发流程,提高易用性、并使用程序逻辑结构变得更清晰

  • 基于注解的URL映射
  • http表单参数转换
  • 全局统一异常处理
  • 拦截器的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gkRGgR3-1575868076522)(C:\Users\chaos\AppData\Roaming\Typora\typora-user-images\1562225442967.png)]

2. Spring MVC应用及其源码分析

2.1 Spring MVC 组件介绍

  • DispatchServlet

    前端控制器

    请求处理逻辑: DispatcherServlet#doDispatch

  • HandlerMapping

    处理器映射

    其为mvc 中url路径与Controller对象的映射,DispatcherServlet 就是基于此组件来寻找对应的Control,如果找不到就会报Not Found mapping 的异常。

    目前主流的三种mapping 如下:

    BeanNameUrlHandlerMapping   //基于ioc中beanName以 "/" 开头的Bean的映射
    
    SimpleUrlHandlerMapping  //基于手动配置 url 与controller映射
    
    RequestMappingHandlerMapping  //基于@RequestMapping注解配置对应的映射
    
  • HandlerAdapter

    处理器适配器

    Springmvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,其Handler与 HandlerAdapter 对应关系如下:

Handler类别 对应适配器 描述
Controller SimpleControllerHandlerAdapter 标准控制器,返回ModelAndView
HttpRequestHandler HttpRequestHandlerAdapter 业务自行处理 请求,不需要通过modelAndView 转到视图
Servlet SimpleServletHandlerAdapter 基于标准的servlet 处理
HandlerMethod RequestMappingHandlerAdapter 基于@requestMapping对应方法处理
  • HandlerExecutionChain

    处理器执行链(handler interceptors)

  • ViewResolver

    视图解析器

    找到应的Adapter 之后就会基于适配器调用业务处理,处理完之后业务方会返回一个ModelAndView ,在去查找对应的视图进行处理。

    其在DispatcherServlet#resolveViewName() 中遍历 viewResolvers 列表查找,如果找不到就会报一个 Could not resolve view with name 异常。

  • View

    具体解析视图

    基于ViewResolver**.**resolveViewName() 获取对应View来解析生成Html并返回

  • HandlerExceptionResolver

    处理器异常解析器

    该组件用于指示当出现异常时 Spring mvc 该如何处理。

    DispatcherServlet 会调用DispatcherServlet#processHandlerException() 方法,遍历 handlerExceptionResolvers 处理异常,处理完成之后返回errorView 跳转到异常视图。

  • HandlerInterceptor

    处理器拦截器

    其实现机制是基于 HandlerExecutionChain 分别在 doDispatch 方法中执行以下方法:

    • preHandle :业务处理前执行
    • postHandle:业务处理后(异常则不执行)
    • afterCompletion:视图处理后

在org/springframework/web/servlet/Di

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值