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
自定义拦截器
- 实现 /HandlerInterceptor/接口
- 注册
<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框架
步骤
- Tomcat 加载web.xml ,前端控制器 DispatchServlet 加载指定的配置文件 springmvc.xml
- 包扫描,扫描注解
获取包磁盘路径, 扫描的是 .class结尾的文件
Threa.currentThread().getContextClassLoader().getResource(".").getPath()+packageName.replaceAll("\\.","/");
- IOC容器Bean初始化和依赖注入维护
- 建立 URL 和method 之间的映射关系
- 等待请求,处理请求
Spring MVC源码解析
doDispatch方法核心步骤
- 调用 getHandler() 获取 请求的执行链 HandlerExecutionChain
- 调用getHandlerAdapter() 获取 步骤1 中 Handler适配器
- 适配器调用Handler执行 ha.handle,返回 ModelAndView对象
- 调用 processDispatchResult()方法完成 视图渲染 跳转
SpringData
SpringDataJpa
spring基于 jpa规范的基础上封装的一套 JPA应用框架,简化数据库的访问和操作
网友评论