首页 > 其他分享 >SpringMVC 扩展

SpringMVC 扩展

时间:2024-08-17 16:39:18浏览次数:8  
标签:拦截器 请求 SpringMVC 扩展 value handler public 标注

SpringMVC 扩展

1. RESTFul 风格

RESTFul是一种基于 HTTP 和标准化设计原则的软件架构风格,用于设计和实现可靠、可扩展和易于集成的 Web 服务和应用程序。

要求:

  • 每一个URI 代表一种资源,是名词,也就是 url中不要带动作

  • 客户端使用 GET、POST、PUT、DELETE 表示操作方式的动词对服务端资源进行操作,GET获取资源,进行查询操作。POST进行插入操作,PUT进行更新操作,DELETE 进行删除操作。

使用 RESTFul 风格,url可能是相同的,但是通过 请求方式的不同可以区别不同的请求

操作 传统风格 REST风格
保存 /crud/saveEmp url:/crud/emp 请求方式:POST
删除 /crud/deleteEmp?id=1 url:/crud/emp/1 请求方式:DELETE
更新 /crud/updateEmp url:/crud/emp 请求方式:PUT
查询 /crud/selectEmp?id=1 url:/crud/emp/1 请求方式:GET

 

RESTFul 并不是只能用 路径传参。在某些情况下也可以使用 param传参

当查询的是一个单一的资源,传入的是一个id值,这时候可以用 路径传参,比如根据id 查询一个用户

当查询的是一个集合资源,传入的是一个范围值,这时可以用 param传参,比如分页查询或多条件模糊查询等

而POST 和 PUT 用 请求体传参即可,即json数据

 

2. 全局异常处理

当出现异常时,有两种解决方案:

  • 编程式异常处理:在业务逻辑代码中显示地进行异常处理,用try catch

  • 声明式异常处理:将业务逻辑代码与异常处理分离,通过配置进行统一的管理,互不干扰

 

步骤:

  1. 声明异常处理控制器类

    定义一个类,在类上使用 @ControllerAdvice 或 @RestControllerAdvice 注解,捕捉全局异常

  2. 在这个类中,声明异常处理handler方法,通过 @ExceptionHandler 注解指定相应的异常

当出现异常时,就会走对应的handler方法

@ControllerAdvice 和 @RestControllerAdvice 的区别是:前者可以返回视图,可以重定向和转发。后者返回字符串

@RestController
@RequestMapping("exception")
public class ExceptionController {
    @GetMapping("data")
    public String data(){
        String name = null;
        name.toString();
        return name;
    }
}

上面会出现空指针异常

@RestControllerAdvice
public class GlobalExceptionHandler {
​
    @ExceptionHandler(NullPointerException.class)
    public Object NullPointerException(NullPointerException e){
        return e.getMessage();
    }
}

定义了一个全局异常处理类,里面通过 @ExceptionHandler 指定了 如果出现 NullPointerException异常就会走下面的方法,在该方法中处理异常即可。

注意:需要保证 @RestControllerAdvice 被扫描到

 

3. 拦截器

拦截器可以在执行handler 之前和之后或者在DispatcherServlet返回时执行一些代码,加上一些功能,如登录校验等。和Filter功能类似。

拦截器和过滤器的区别:

相似点:

  • 拦截:必须把请求拦住,才能执行后续操作

  • 过滤:拦截器或过滤器存在的意义就是对请求进行统一处理

  • 放行:对请求执行了必要操作后,放请求过去,让它访问原本想要访问的资源

不同点:

  • 工作平台不同

    • 过滤器工作在Servlet容器中

    • 拦截器工作在SpringMVC 的基础上

  • 拦截的范围

    • 过滤器能够拦截到的最大范围是整个web应用

    • 拦截器能够拦截到的最大范围是整个SpringMVC 负责的请求

  • IOC 容器支持

    • 想得到过滤器ioc容器需要调用专门的工具方法,spring并没有支持

    • 拦截器就放在ioc容器中,可以直接从ioc容器中装配组件,可以直接得到ioc容器的支持

使用

  1. 创建一个类,实现 HandlerInterceptor 接口,重写三个方法

    • preHandler 在处理请求的目标Handler方法之前执行,返回true就是放行,返回false拦截

    • postHandler 在目标handler方法之后执行,如果handler报错则不执行

    • afterCompletion 渲染视图后执行(在最后)一定执行

  2. 将拦截器加入到 ioc容器中

    在配置类里重写 addInterceptor 方法,调用 参数 InterceptorRegistry的 registry方法,传入的参数是 new

    拦截器类

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
​
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
​
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

参数:request 请求对象、response 响应对象、handler 调用的对象方法、modelAndView 返回的视图和共享域对象、Exception 异常对象

 

@Configuration
@ComponentScan({"com.ztone.controller","com.ztone.error"})
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
​
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

必须继承 WebMvcConfigurer

上面这种方式是拦截了所有的请求,如果想要拦截指定请求可以追加调用 addPathPatterns

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/data");
}

也可以排除拦截某些请求,调用 excludePathPatterns

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/user/**").excludePathPatterns("/user/data");
}

 

如果有多个拦截器,那么先声明的拦截器优先级高,优先级高的在外层,也就是 优先级高的拦截器先执行 preHandler,后执行 postHandler 和 afterCompletion

 

4.参数校验注解

jsr303 是Java为Bean数据合法性校验提供的标准框架

注解 规则
@Null 标注值必须为null
@NotNull 标注值不可null
@AssertTrue 标注值必须为true
@AssertFalse 标注值必须为false
@Max(value) 标注值必须小于等于value
@Min(value) 标注值必须大于等于value
@DecimalMin(value) 标注值必须大于等于value
@DecimalMax(value) 标注值必须小于等于value
@Size(max,min) 标注值必须在max和min范围内
@Digits(integer,fratction) 标注值必须是数字,并且在可接受的范围内
@Past 标注值只能用于日期型,且必须是过去的日期
@Future 标注值只能用于日期型,且必须是未来的日期
@Pattern(value) 标注值必须符合指定的正则表达式
@Email 标注值必须是格式正确的Email
@Length 标注值字符串大小必须在指定的范围内
@NotEmpty 标注集合长度不为空
@Range 标注值必须在指定的范围内
@NotBlank 标注值字符串不为null,且不是空字符串

 

使用:

  1. 需要导入依赖

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>8.0.0.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>8.0.0.Final</version>
    </dependency>
  2. 在实体类的属性上使用注解

    @Data
    public class User {
    ​
        @NotBlank
        private String name;
    ​
        @Length(min = 6, max = 12)
        private String password;
    ​
        @Min(0)
        private int age;
    }
  3. 在接收参数的地方使用 @Validated

    @Controller
    public class UserController {
    
        @GetMapping("data")
        public String data(@Validated @RequestBody User user){
            return null;
        }
    }

当传来的参数没有通过校验,那么就会直接向前端报异常

如果想要自定义向前端的输出,可以在参数的后面紧挨着一个 参数 BindingResult

在handler中调用 该对象的 hasErrors方法,一旦报错就会返回 true

@Controller
public class UserController {

    @GetMapping("data")
    public String data(@Validated @RequestBody User user, BindingResult bindingResult){
        if (bindingResult.hasErrors()) {
            //处理向前端的返回数据
        }
        return null;
    }
}

标签:拦截器,请求,SpringMVC,扩展,value,handler,public,标注
From: https://www.cnblogs.com/wztblogs/p/18364593

相关文章

  • iPad作为扩展屏的最简单方式
    iPad作为扩展屏的最简单方式,主要取决于用户所使用的电脑操作系统(如macOS或Windows)以及iPad的型号和系统版本。以下将详细阐述在Mac和Windows环境下,将iPad作为扩展屏的最简单方法,并探讨其优势、应用场景及注意事项。一、Mac环境下使用iPad作为扩展屏的最简单方式对于Mac用......
  • 国产NVMe SSD扩展卡:驱动存储新纪元
    随着大数据、人工智能和云计算等技术的迅猛发展,对存储系统的性能要求日益提高。传统的SATASSD已难以满足现代高性能计算环境的需求,而NVMe(Non-VolatileMemoryExpress)SSD凭借其卓越的性能和灵活性,正成为存储扩展的新宠。本文将深入探讨NVMeSSD扩展的技术优势、应用场景及实现方......
  • iPad作为扩展屏的最简单方式研究
    本研究针对iPad作为扩展屏的应用,深入探讨了其技术基础、实现方式及实际应用效果。研究发现,通过无线连接技术和特定控制软件,iPad能够轻松实现与主设备的屏幕扩展功能,极大地提升了用户在工作和学习中的效率和灵活性。在实际应用中,iPad作为扩展屏在多个领域如设计、编程、在线教育......
  • 并查集扩展
    并查集扩展目录并查集扩展普通并查集例题:1.洛谷P1197星球大战2.洛谷P1955程序自动分析带权并查集例题:1.洛谷P2024食物链2.洛谷P1196银河英雄传说3.洛谷P5937ParityGame扩展域并查集例题:1.洛谷P1525关押罪犯普通并查集例题:1.洛谷P1197星球大战链接:[P1197JSOI20......
  • MBR 分区最多只能分四个区,那么扩展分区是如何突破限制的呢?
    众所周知:MBR分区最多只能分四个区MBR(主引导程序和硬盘分区表)位于硬盘第一个物理扇区处第一个扇区总共512字节,前446字节是主引导记录,分区表保存在扇区中的第447-512字节中。分区表有4个分区记录区,分区表为:64个字节,每个分区记录区占16字节(正是由于这个原因,理论上最多只能......
  • SpringMVC 接收数据
    SpringMVC接收数据1.设置访问路径@RequestMapping将handler注册到HandlerMapping中@RequestMapping可以用到方法上也可以用到类上用到方法上,访问某个路径就直接执行这个方法。如果方法上都有某一个路径字段,就可以把他提取出来放到类上。需要注意的是放在类上,方法上也必......
  • LongWriter: 基于LLM代理可以将输出窗口大小扩展到10,000+个单词
    LLM可以处理长达100,000个token的输入,但在生成超过2,000词的适度长度输出时仍然面临困难,因为模型的有效生成长度本质上受到其在监督微调(SFT)过程中所见样本的限制。为解决这个问题,本文的作者引入了AgentWrite,这是一个基于代理的流程,它将超长生成任务分解为子任务,使现成的L......
  • iPad作为扩展屏的最简单方式*
    iPad作为扩展屏的最简单方式在当今的数字化时代,多屏协作已经成为提高工作效率和优化用户体验的重要手段。对于许多用户而言,iPad作为一款轻便、功能强大的移动设备,不仅可以作为独立的计算工具,还可以作为其他设备的扩展屏幕,从而极大地增加工作区域和灵活性。本文将详细介绍iP......
  • 文件类型和文件扩展名
    linux中文件类型在linux中,可以说一切设备(包括目录,普通文件)。文件类型包含有普通文件,目录,字符设备文件,块设备文件,符号链接文件等等查看ls-al2-10字符描述ugo权限第一个字符表示文件属性: d:表示目录 -:表示普通文件 l:表示是一个符号链接文件 b,c:分别表示区块设备和......
  • Springmvc -- 使用`@RequestParam`接收数组类型参数
    在SpringMVC中,处理数组类型的请求参数是一个常见需求,尤其是在处理表单数据或查询参数时。SpringMVC提供了多种方式来接收数组类型的请求参数,包括使用@RequestParam注解、直接绑定到方法参数、以及使用@ModelAttribute注解。本文将深入探讨这些方式的用法、优缺点以及如何......