javaweb实训第六天上午——JSON&SpringMVC进阶(1)https://developer.aliyun.com/article/1415126
5.SpringMVC拦截器
5.1.创建拦截器
public class MyInterceptor implements HandlerInterceptor { //preHandle()方法在业务处理器处理请求之前被调用 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进入拦截器了...."); //这里可以判断用户是否登录 //没有登录可以使用 request/response跳转回登录页面 //注:如果不继续执行返回false,否则返回true return false; } // postHandle()方法在业务处理器处理请求之后被调用 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } // afterCompletion()方法在DispatcherServlet完全处理完请求后被调用 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
5.2.配置拦截器
<!-- 配置拦截器组 --> <mvc:interceptors> <!-- 拦截器 --> <mvc:interceptor> <!-- 要拦截的配置,该配置必须写在不拦截的上面,/*拦截一级请求,/**拦截多级请求 --> <mvc:mapping path="/**" /> <!-- 设置不拦截的配置 --> <mvc:exclude-mapping path="/login"/> <!-- 配置拦截器 --> <bean class="cn.itsource.springmvc._06_interceptor.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
6.SpringMVC执行流程
6.1.流程图
6.2.流程描述
注:控制器即处理器(Handler)
用户向服务器发送请求,请求会统一交给SpringMVC前端控制DispatcherServlet处理;
DispatcherServlet通过请求HandlerMapping(处理器映射管理对象)找到该请求对应的Handler对象(包括控制器以及Handler对象对应的拦截器) 和HandlerExecutionChain对象(包含:控制器+2个拦截器);
DispatcherServlet请求HandlerAdapter,选择一个合适的HandlerAdapter去处理Handler。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法);
提取request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;
ViewResolver 结合Model和View,来渲染视图(Model+View合成)
将渲染结果返回给客户端;
6.3.SpringMVC工作流程描述(简易版本:面试)
客户端将请求统一提交到DispatcherServlet;
DispatcherServlet会将请求交给HandlerMapping进行请求映射,匹配该请求的Handler;
DispatcherServlet再请求HandlerAdapter调用相应的Handler处理请求,并向前端控制器返回一个ModelAndView对象;
DispatcherServlet将ModelAndView对象交给ViewResoler视图解析器处理,返回指定的视图View;
DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中);
DispatcherServlet 将页面响应给用户;
7.课程总结
7.1.重点
- SpringMvc返回Json数据;
- SprignMvc文件上传;
- SpringMvc执行流程;
7.2.难点
- SprignMvc文件上传;
- SpringMvc执行流程;
7.3.如何掌握
- 课上认真听课;
- 完成课后练习;
- 抓住课程重点;
7.4.排错技巧
- 通过异常和错误找出问题,分析问题,解决问题;
- 还原代码;
- 代码最小化;
- 断点;
8.常见问题
状态异常:如果出现406状态异常,jackson的jar文件没有导入
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
分析:缺少配置
9.课后练习
- 课堂代码1-2遍;
10.面试题
- SpringMVC执行流程?
11.扩展知识或课外阅读推荐(可选)
11.1.扩展知识
拦截器(interceptor)与过滤器(filter)的区别?
拦截器与过滤器有很多相似之处,都可以拦截请求,也可以放行;
拦截器是SpringMVC中的组件,需要在Spring的配置文件中配置。而过滤器是JavaEE中的组件,在web.xml中配置。Filter的执行顺序在Interceptor之前;
拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor;