一、SpringMVC框架介绍
简单介绍
Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc
),但它通常被称为“Spring MVC”。
有什么作用?
最显著、最主要的其实就是SpringMVC简化了在原来ServletAPI开发下的请求和响应参数。
框架工作流程
文字描述:(各组件工作)
DispatcherServlet:处理全部请求并响应
handlerMapping:缓存handler方法和地址(就是记录方法和方法地址的)
handlerAdapter:负责请求/相应简化的
视图解析器:负责查找视图页面
快速体验
略
二、SpringMVC接收数据
总结:
接收参数 1.路径设置 @RequestMapping(value="地址",method="请求方式") 类|方法 @GetMapping /@PostMapping 方法 2.接收参数【重点】 param(参数) 举例:http://localhost:8080/ssm?key=value&key=value... 直接接收 handler(类型 形参名)形参名 = 请求参数名 eg: 前端请求: http://localhost:8080/param/value?name=xx&age=18 后端定义: public String setupForm(String name,int age) 注解指定 handler(@RequestParam(name="请求 参数名",required=true,defaultValue="默认值”)) 一名多值 handler(@RequestParam List key) 实体接收 handler(实体 对象)对象的属性名 -请求参数名 路径参数 举例:http://localhost:8080/ssm/users/profile 设置动态路径和标识 /{key}/info/{key} 接收路径 handler(@PathVariable(动态路径key)类型 形参名) json参数 数据接收 handler(@RequestBody 实体类 对象) 准备工作: 导入jackson依赖 @EnableWebMvc[加入handlerMapping 加入handlerAdapter 给handlerAdapter配置json处理器] 3.cookie接收 handler(@CookieValue("cookie的名字”)) 4.请求头接收 handler(@RequestHeader("cookie的名字")) 5.原生api获取 handler(httpServletRequest,response,session) ServletContext->ioc->全局变量 @Autowired 6.共享域获取 原生api方式即可
三、SpringMVC响应数据
无非就是返回json、页面跳转
在前后端分离项目中,页面跳转更多是由前端路由和js实现,因此,更为重要和常用的是json进行数据传输
总结: 请求数据接收,我们都是通过handler的形参列表
前端数据响应,我们都是通过handler的return关键字快速处理!
springmvc简化了参数接收和响应!
四、SpringMVC的全局异常处理机制
一般处理异常有两种方式:
编程式异常处理:显式的在代码中使用try-catch块进行代码的捕捉和处理
声明式异常处理:将处理异常的逻辑和业务逻辑分离,通过配置等方式进行统一管理、处理(好处:可以统一项目处理异常的思路)
下面就说说声明式异常处理:
声明异常处理控制器类
异常处理控制类,统一定义异常处理handler方法!
/** * projectName: com.atguigu.execptionhandler * * description: 全局异常处理器,内部可以定义异常处理Handler! */ /** * @RestControllerAdvice = @ControllerAdvice + @ResponseBody * @ControllerAdvice 代表当前类的异常处理controller! */ @RestControllerAdvice public class GlobalExceptionHandler { }
声明异常处理hander方法
异常处理handler方法和普通的handler方法参数接收和响应都一致!
只不过异常处理handler方法要映射异常,发生对应的异常会调用!
普通的handler方法要使用@RequestMapping注解映射路径,发生对应的路径调用!
/** * 异常处理handler * @ExceptionHandler(HttpMessageNotReadableException.class) * 该注解标记异常处理Handler,并且指定发生异常调用该方法! * * * @param e 获取异常对象! * @return 返回handler处理结果! */ @ExceptionHandler(HttpMessageNotReadableException.class) public Object handlerJsonDateException(HttpMessageNotReadableException e){ return null; } /** * 当发生空指针异常会触发此方法! * @param e * @return */ @ExceptionHandler(NullPointerException.class) public Object handlerNullException(NullPointerException e){ return null; } /** * 所有异常都会触发此方法!但是如果有具体的异常处理Handler! * 具体异常处理Handler优先级更高! * 例如: 发生NullPointerException异常! * 会触发handlerNullException方法,不会触发handlerException方法! * @param e * @return */ @ExceptionHandler(Exception.class) public Object handlerException(Exception e){ return null; }
总之,就是要么在类上定义一个异常处理器;要么就注解声明处理异常的方法,可以对异常的情况的捕捉和处理更加精细化
-
配置文件扫描控制器类配置
确保异常处理控制类被扫描
<!-- 扫描controller对应的包,将handler加入到ioc--> @ComponentScan(basePackages = {"com.atguigu.controller", "com.atguigu.exceptionhandler"})
*五、拦截器
在Spring MVC中使用拦截器(Interceptor)通常包括以下步骤:
-
定义拦截器: 创建一个实现了
HandlerInterceptor
接口的类,并实现其方法,如preHandle
、postHandle
和afterCompletion
。public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前执行的操作 return true; // 返回true继续流程,返回false中断请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后,视图渲染之前执行的操作 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求完成后执行清理操作 } }
-
注册拦截器: 在Spring MVC的配置类中注册拦截器。如果您使用的是Java配置,可以在配置类中添加
WebMvcConfigurer
接口的实现;如果使用XML配置,则在<mvc:interceptors>
元素中注册。Java配置示例:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/ignore", "/css/**", "/js/**"); // 排除某些路径 } }
XML配置示例:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/ignore"/> <mvc:exclude-mapping path="/css/**"/> <mvc:exclude-mapping path="/js/**"/> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
配置拦截器顺序(可选): 如果需要,可以为拦截器设置顺序,这将决定它们执行的顺序。
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(1); 或者使用注解 @Order(数字)
-
使用拦截器的注解(可选): 在Spring MVC中,您还可以使用
@Interceptor
注解直接在Spring配置中声明拦截器。@Interceptor("/**") public class MyInterceptor extends HandlerInterceptorAdapter { // 实现必要的方法 }
-
配置Spring MVC: 确保您的Spring MVC配置是正确的,并且已经启用了Spring MVC的自动配置(如果您使用的是Spring Boot,通常会自动配置)。
-
测试拦截器: 启动应用程序并测试拦截器是否按预期工作,检查日志和拦截器方法的执行情况。
-
调整拦截器逻辑(如果需要): 根据测试结果和应用程序需求,调整拦截器的逻辑。
通过这些步骤,您可以在Spring MVC应用程序中使用拦截器来添加或修改请求处理流程。拦截器可以用于日志记录、权限检查、事务管理等多种用途。