SpringMVC框架基础知识(05)

简介: SpringMVC框架基础知识(05)

当然,一旦使用了通配符,就可能导致匹配的范围过大的问题!毕竟有相同前缀,但是后缀不同的若干个请求路径中,可能有些需要经过拦截器,而有些并不需要经过拦截器!例如:用户注册、用户登录都不必经过“登录拦截器”,但是修改资料、修改密码、修改头像、验证手机、验证邮箱等诸多操作都是需要经过“登录拦截器”,就会存在“如果不使用通配符,就必须一个个的配置拦截路径,工作量较大,如果使用通配符,可能将用户注册、用户登录也匹配进去,导致匹配过大”的问题!所以,SpringMVC还提供了配置“排除路径”的做法,也就是“在已经配置的路径范围中排除某些路径”,类似于“白名单”,其方法是:

public InterceptorRegistration excludePathPatterns(String... patterns) {
    return excludePathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration excludePathPatterns(List<String> patterns) {
    this.excludePatterns.addAll(patterns);
    return this;
}



例如,可以配置为:


registry.addInterceptor(new LoginInterceptor())
      .addPathPatterns("/user/**")
      .excludePathPatterns("/user/reg.do", "/user/login.do");


以上代码就表示“以/user/开头的路径都是需要被拦截的,但是,/user/reg.do和/user/login.do这2个路径是例外的,不需要被拦截器处理”。


5. 过滤器与拦截器的区别


相似之处:


都可以使得若干个请求路径都执行过滤器组件/拦截器组件中的代码片断,都可以在执行之后选择“阻止”或“放行”,都有“链”的概念。


区别:


过滤器Filter是Java EE中的组件,只要是Java Web项目都可以使用过滤器,包括在SpringMVC项目中也可以使用过滤器;拦截器Interceptor是SpringMVC框架中的组件,只有使用了SpringMVC框架的项目,才可以使用拦截器,并且,只有被SpringMVC框架处理的请求才可能被拦截器所处理,例如,将DispatcherServlet映射的路径(在SpringMvcInitializer中getServletMappings()方法的返回值)配置为*.do时,只有以.do为后缀的请求才可能被拦截器处理,而例如.jpg类似的请求将不会被拦截器处理,当然,如果有必要的话,也可以将DispatcherServlet映射的路径配置为/*,则任何请求都可能被拦截器处理。

过滤器Filter可以配置若干个映射路径,可以使用通配符,但是,却不能从中剔除部分请求路径,也就是“不能配置白名单”,在配置时可能比较麻烦;拦截器Interceptor在配置映射的请求路径时,既可以配置拦截路径(黑名单),又可以配置排除路径(白名单),配置更加简单、灵活。

过滤器Filter是执行在所有Servlet组件之前的;而拦截器Interceptor的第1次执行是在DispatcherServlet之后,且在Controller之前的。


小结:


在SpringMVC项目中,应该优先使用拦截器Interceptor组件,除非某些代码片断必须在Servlet之前执行!




1. 关于@RequestMapping注解


在控制器类中,在处理请求的方法之前使用@RequestMapping,可以绑定请求路径与处理请求的方法,以至于当客户端请求该路径时,对应的方法就会被调用!


其实,还可以在控制器类的声明之前也添加该注解!例如:


@Controller

@RequestMapping("user")

public class UserController {

}


则该控制器中所有请求路径的资源名(各处理请求的方法之前配置的值)左侧都需要添加类上配置的值!


假设在以上UserController中,没有为类配置@RequestMapping之前,存在以下请求路径:


http://localhost:8080/springmvc/reg.do

http://localhost:8080/springmvc/login.do


注:以上路径中的springmvc是Context Path值。

为类配置了@RequestMapping("user")之后,请求路径就需要改为:


http://localhost:8080/springmvc/user/reg.do

http://localhost:8080/springmvc/user/login.do


在实际开发项目时,推荐为每一个控制器类之前配置该注解!


在控制器类之前也配置了@RequestMapping后,其配置值会与方法之前的@RequestMapping的配置值组合起来,形成完整的路径,无论是将@RequestMapping配置在哪个位置,在配置注解属性时,框架会自动添加必要的/,并且两端多余的/都是会忽略的!例如,以下各种配置方式是完全等效的:

屏幕快照 2021-11-22 下午9.57.59.png


所以,在实际应用时,一般推荐使用以上表格中的第1种做法,或第4种做法,也就是“要么在注解参数的左侧都不添加/符号,要么都添加/符号”。


关于@RequestMapping注解,其源代码中存在:


@AliasFor("path")
String[] value() default {};


基于value是注解中的默认属性,所以,一直以来,使用@RequestMapping注解时配置的值,其实都是这个value属性的值,也就是说,以下2种配置方式是完全等效的:


@RequestMapping("reg.do")
@RequestMapping(value = "reg.do")


由于在注解中声明的value的类型是String[]数组,所以,以上2种配置与以下2种配置都是完全等效的:


@RequestMapping({ "reg.do" })
@RequestMapping(value = { "reg.do" })

当注解参数的类型是某种数组类型,且需要配置的值只有1个值时,将该属性直接配置为数组元素的值,或配置为数组类型的值,都是允许的,且是等效的!

同时,基本该属性是数组类型的,所以,其实是可以配置多个路径的,例如:


@RequestMapping({ "reg.do", "register.do" })


如果注解参数中为value属性配置了2个值,就表示“通过这2个配置的请求路径中的任何一个都可以使得映射的方法被调用”!


目录
相关文章
|
8天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
23 4
|
26天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
82 2
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
65 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
189 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查