SpringMVC的了解和使用
文章目录1. 概述2. 执行流程3. 相关组件1DispatcherServlet2HandlerMapping3Handler4HandlAdapter5View Resolver4. 参数封装1封装基本数据类型2封装pojo对象3封装List4封装Map5. 相关注解1Controller2RequestMapping3RestController4PostMapping5ModelAttribute6RequestBody7ResponseBody8RequestHeader9CookieValue10SessionAttributes6. 数据响应和页面跳转1数据相应2页面跳转3返回值7. 拦截器1概念2自定义拦截器3过滤器4拦截器和过滤器的区别1. 概述1. SpringMVC是一种基于java 实现MVC设计模型的 请求驱动类型的 轻量级框架。属于Spring FrameWork 的后续产品。 2. 它通过一套注解让一个简单的java类成为处理请求的控制器而无须实现任何接口同时还支持RESTful 编程风格的请求。 3. MVCweb层的一种设计模式 Mmodule模型domain实体类 Vwiew视图jsphtml Ccontroller前端控制器2. 执行流程具体步骤 1. 用户发送请求至前端核心控制器 DispatcherServlet。 2. DispatcherServlet接收到请求调用 HandlerMapping 处理器映射器。 3. 处理器映射器找到具体的处理器(可根据xml配置、注解进行查找)生成处理器对象及处理器拦截器(如果有则生成)并一并返回给 DispatcherServlet。 4. DispatcherServlet 调用 HandlAdapter 处理器适配器。 5. HandlAdapter 经过适配调用具体的处理器(Controller也叫后端控制器)。 6. Controller 执行完成返回 ModelAndView。 7. HandlAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。 8. DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。 9. ViewReslover 解析后返回具体的 View。 10. DispatcherServlet 根据 View 进行渲染视图(将模型数据填充到视图中)。 11. DispatcherServlet 响应用户。 具体描述 1 客户端通过url发送请求。 2-3 核心控制器 DispatcherServlet 接收到请求通过系统或者自定义的映射器配置找到对应的处理器映射器 HandlerMapping并将url映射的控制器 Controller返回给前端核心控制器。 4 通过核心控制器找到系统或者默认的处理器适配器。 5-7 由找到的处理器适配器调用实现对应接口的处理器并将结果返回给适配器结果中包含数据模型和视图对象再由适配器返回给前端核心控制器。 8-9 前端核心控制器 将获取的数据和视图结合的对象 传递给 视图解析器并由视图解析器响应给前端核心控制器。 10-11 前端核心控制器 将视图进行渲染并返回给客户端。3. 相关组件1DispatcherServlet1. 概念前端核心控制器 2. 特点 可以获取到 request 、response 、session 等对象需要什么对象就直接将什么对象配置到控制器方法的参数中。2HandlerMapping1. 概念处理器映射器3Handler1. 概念处理器4HandlAdapter1. 概念处理器适配器5View Resolver1. 概念视图解析器 2. 需要配置前缀和后缀来指定跳转的页面路径。4. 参数封装1封装基本数据类型1需要什么参数就直接将参数写到控制器方法的参数列表上。 2前台参数传递的时候请求的参数名必须等于控制器方法中写的参数名。2封装pojo对象1将需要的参数(pojo对象)配置到控制器方法的参数列表上。 2前台页面传递时请求的参数名封装的对象中的属性名。3封装List1方法1直接将对象作为参数再获取对象中的list属性。 2方法2将ListPojo作为参数再获取每个对象中的属性。4封装Map1方法1直接将对象作为参数再获取对象中的Map属性。 2方法2将Map作为参数获取对应的key/value。5. 相关注解1Controller1. 作用表明是一个控制器。2RequestMapping1. 作用配置请求路径 2. 参数 value请求路径可以配置在类上/方法上如果配置在类上表示类里面的每个方法都有该前缀如果配置在方法上表示是该方法的路径。 method指定此连接可以接受请求方式。 params执行此连接必须携带的请求参数名。3RestController1. 作用配置请求路径,是Controller RequestMapping 的简写。4PostMapping1. 作用配置请求方式和路径是RequestMapping(methodRequestMethod.POST的简写)。5ModelAttribute1. 作用配置在方法上可以在执行指定的方法之前先执行该方法类似于前置通知。而且传递的参数也都可以获取到。6RequestBody1. 作用自动的将页面请求中的json字符串转化为对象。7ResponseBody1. 作用自动的将响应对象转化为json字符串返回。8RequestHeader1. 作用获取请求头中的信息。 2. 使用方法 1加一个RequestHeader的注解。 2value 是希望获取的请求头的key。 3参数(headerValue) 就是请求头(value) 对应的值。9CookieValue1. 作用获取cookie 中的信息。 2. 使用方法 1加一个CookieValue的注解。 2value 是希望获取的cookie中某一个值的key。 3参数(cookieValue) 就是请求头(value) 对应的值。10SessionAttributes1. 作用配置到类上可以自动的将此类中涉及到的指定的属性名存入到session域中。 2. 使用方法 1添加一个SessionAttributes注解。 2name {“想存入的属性名1”“想存入的属性名2” }。 3name中指定的属性就可以自动的存入到session域中。存入数据获取数据清空数据6. 数据响应和页面跳转1数据相应1. 数据相应的方法 1将数据绑定到域中进行传递一般是绑定到request域中。 2在页面上通过el表达式进行获取获取方式 ${ } 。2页面跳转1. 页面跳转的方式 1请求转发(forward) 只发送一次请求请求路径不会变化数据不会丢失可以跳转到受保护的页面但一般是服务器端内部使用。 2重定向发送两次或多次请求(第一次用户行为之后是浏览器行为)会丢失数据不能跳转到受保护的资源会改变请求路径。3返回值1. 作用指定返回页面的视图地址。 2. 返回值类型 1void 。 2/String。 3/ ModelAndView。 3. void类型的返回值 void类型的返回值数据响应和页面跳转跟servlet一模一样 通过servlet对象(request对象和response对象) 来实现。4. /String类型的返回值 1返回内容 a. 返回 success //前缀和后缀经过视图解析器的处理不用写---逻辑视图 b. 返回 /WEB-INF/jsps/aa.jsp //没有经过视图解析器处理的完整地址---物理视图 2) 响应数据 数据绑定到request域中可以通过el表达式获取。 3默认的跳转方式 默认以请求转发的形式进行页面跳转(跳转到逻辑视图)。 4 指定跳转方式 语法forward/redirect物理视图地址。5. /ModelAndView 类型的返回值 1返回内容 返回的是一个ModelAndView对象。 2添加数据 mv.addObject(String key,Objrect value) ; 数据绑定到request域中可以通过el表达式获取。 3默认的跳转方式 默认以请求转发的形式进行页面跳转(跳转到逻辑视图)。 4 指定页面跳转 mv.setViewName(); 5 指定跳转方式 语法forward/redirect物理视图地址。7. 拦截器1概念拦截器 interceptor 是springMVC提供的一种对请求和响应进行处理的机制并可以对请求进行拦截过滤和放行等功能。 只有在springMVC工程中才可以用 拦截器。2自定义拦截器1. 实现HandlerIntercaptor接口 里面有三个默认方法需要哪个就实现哪个方法。 1preHandle在请求之前先执行该方法。 2postHandle必须preHandle都为true接口有相应才会执行如果有preHandle是false那么不会执行。 3afterHandle只要preHandle是true就会执行。2. 在springMVC.xml中进行配置3. 多个拦截器之间的执行顺序 1拦截器的执行顺序跟在springMVC.xml中的配置顺序有关哪个配置在前面哪个配置就先执行。a. 当拦截器都为true时执行顺序为pre1--pre2--控制器方法--post2--post1--after2--after1 b. 拦截器1的pre 为true拦截器2的pre为 false执行结果pre1--pre2--after1 c. 拦截器1的pre 为 false时执行结果pre1 4. 设置不拦截的请求路径3过滤器1. 概述 是Servlet 规范任何Java Web容器如Tomcat均可使用与框架无关。 可以拦截所有请求包括静态资源、JSP等。4拦截器和过滤器的区别1. 归属规范 过滤器属于 Servlet 规范任何Java Web容器如Tomcat均可使用依赖servlet容器与框架无关。 拦截器属于 Spring MVC 框架的组件依赖Spring环境与容器无关。 2. 作用范围 过滤器 可拦截所有请求包括静态资源、JSP等作用范围更广。 拦截器只能对action请求起作用拦截Spring MVC处理的请求如Controller中的接口对静态资源无效。 3. 实现方式 过滤器实现 javax.servlet.Filter 接口通过 web.xml 或 WebFilter 注解配置在Spring Boot中也可使用 FilterRegistrationBean。 拦截器实现 HandlerInterceptor 接口通过Spring配置类注册如实现 WebMvcConfigurer 并重写 addInterceptors 方法。 4. 执行顺序 请求流程 客户端请求 → 过滤器链Filter Chain→ DispatcherServlet → 拦截器链Interceptor Chain→ Controller 过滤器 1在请求进入Servlet之前执行 doFilter()。 2在响应返回客户端之前执行 doFilter() 之后的代码类似后置处理 拦截器 1preHandle()Controller方法执行前。 2postHandle()Controller方法执行后视图渲染前。 3afterHandle()整个请求完成后视图渲染完毕。 5. 功能差异 过滤器 1可以直接操作 ServletRequest 和 ServletResponse例如修改请求参数、设置字符编码、过滤敏感内容等。 2无法获取Spring上下文如Controller的类、方法信息action上下文 和 值栈里的对象。 3容器启动时会被初始化一次随后每次请求都会被调用。 拦截器 1可以获取处理请求的 Controller类、方法信息 以及 ModelAndView 对象。 2能够使用Spring的依赖注入如调用Service层 Bean。 3无法直接修改请求内容但可以通过包装请求对象实现。 4在action的生命周期中拦截器可以多次被调用。 6. 机制 过滤器基于函数回调。 拦截器基于java的反射机制。 6. 使用场景 过滤器 1全局字符编码设置如 CharacterEncodingFilter。 2跨域处理CORS。 3敏感词过滤或XSS防御。 4请求日志记录如记录所有请求的耗时。 拦截器 1权限验证如检查Token是否有效。 2细粒度的日志记录如记录Controller方法的入参和返回结果。 3接口性能监控统计方法执行时间。 4通用参数处理如从请求头中提取用户信息。 7. 异常处理 过滤器抛出异常时请求可能直接返回错误无法进入Controller。 拦截器afterCompletion() 方法无论请求成功与否都会执行适合资源清理或异常日志记录。对比图