美文网首页
MVC框架设计实现及SpringMVC源码分析

MVC框架设计实现及SpringMVC源码分析

作者: 极速魔法 | 来源:发表于2022-03-20 20:49 被阅读0次

SpringMVC基础

Spring MVC本质是对 servlet的封装,简化了 Servlet的开发

经典三层

  • 表现层:view,controller
  • 业务层: service
  • DAO层

MVC

  • M: model(数据模型+业务模型)
  • V: view
  • C: controller

Spring MVC 核心三大组件

  • 处理器映射器 HandlerMapping
  • 处理器适配器 HandlerAdapter
  • 视图解析器 ViewResovler

url-pattern配置

  • 配置 / 拦截静态资源
    原因:tomcat中有 web.xml(父配置),默认实现 DefaultServlet。项目中也有 web.xml(子配置),继承关系。项目中的web.xml会覆盖 Tomact中的web.xml。请求到来会走项目的 web.xml中,因此被拦截。

  • 不拦截 .jsp
    原因:父web.xml中有 JspServlet, 项目中没有覆写这个配置,JSP的处理交给 Tomcat处理。

  • 静态资源放行
    <mvc:default-servlet-handler/>
    添加标签后,SpringMVC上下文中定义一个 /DefaultServeltHttpRequestHandler/对象,对进入 DispatcherServlet 的URL 进行过滤,
    放行静态资源,交给 Tomcat 默认的 DefaultServlet处理。
    其他资源,交个 SpringMVC处理

监听器、过滤器和拦截器对⽐

  • Servlet:处理Request请求和Response响应

  • 过滤器(Filter):对Request请求起到过滤的作⽤,作⽤在Servlet之前,如果配置为/*可以对所 有的资源访问(servlet、js/css静态资源等)进⾏过滤处理

  • 监听器(Listener):实现了javax.servlet.ServletContextListener 接⼝的服务器端组件,它随 Web应⽤的启动⽽启动,只初始化⼀次,然后会⼀直运⾏监视,随Web应⽤的停⽌⽽销毁

  • 拦截器(Interceptor):框架⾃⼰的,不会拦截 jsp/html/css/image的访问等,只会拦截访问的控制器⽅(Handler)。
    拦截过程:
    request —> 过滤器 —> 拦截器(Handler执行前)—>Controller —> 拦截器(Handler执行完跳转页面前)—>
    视图渲染 —> 拦截器(跳转页面后拦截)—> response

自定义拦截器

  1. 实现 /HandlerInterceptor/接口
  2. 注册
<mvc:interceptors>
    <mvc: interceptor>
<!-- 拦截所有 ** 代表当前目录及其子目录的所有URL -->
        <mvc:mapping path="/**" />
        <bean class="xx" />
    </mvc: interceptor>
</mvc:interceptors>

异常处理机制

// 异常处理器 写在 Controller中只对当前Controller生效
@ExceptionHandler(ArithmeticException.class)
public void handleExecption(ArithmeticException exception,HttpServletResponse resp) {
        ...

}
// 捕获所有Controller对象Handler 方法抛出的异常
@ControllerAdvice
public Class GlobalExceptionResolver {
        // 处理具体的异常          @ExceptionHandler(ArithmeticException.class)
        public void handleExecption(ArithmeticException exception,HttpServletResponse resp) {
        ...

    }
}

自定义MVC框架

步骤

  1. Tomcat 加载web.xml ,前端控制器 DispatchServlet 加载指定的配置文件 springmvc.xml
  2. 包扫描,扫描注解
    获取包磁盘路径, 扫描的是 .class结尾的文件
Threa.currentThread().getContextClassLoader().getResource(".").getPath()+packageName.replaceAll("\\.","/");
  1. IOC容器Bean初始化和依赖注入维护
  2. 建立 URL 和method 之间的映射关系
  3. 等待请求,处理请求

Spring MVC源码解析

doDispatch方法核心步骤

  1. 调用 getHandler() 获取 请求的执行链 HandlerExecutionChain
  2. 调用getHandlerAdapter() 获取 步骤1 中 Handler适配器
  3. 适配器调用Handler执行 ha.handle,返回 ModelAndView对象
  4. 调用 processDispatchResult()方法完成 视图渲染 跳转

SpringData

SpringDataJpa

spring基于 jpa规范的基础上封装的一套 JPA应用框架,简化数据库的访问和操作

相关文章

网友评论

      本文标题:MVC框架设计实现及SpringMVC源码分析

      本文链接:https://www.haomeiwen.com/subject/zvpadrtx.html