Java开发 - Spring MVC框架初体验

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

上一篇Spring框架感觉写的偏向于理论知识所以从这篇开始转变此系列的写作思维更多的将从实操的角度来讲解Spring MVC框架的使用和相关知识点会尽量详细但这一系列课程针对的还是有Java基础的小伙伴精确到微小操作的部分还是会省略以节省篇幅不至于太啰嗦那么现在我们就开始吧。

创建一个基于Maven的项目

选择骨架

首先是maven工程骨架选择maven-archetype-webapp不要选错了接着next。

基础信息

next后直接finish即可。

项目环境检查

新的项目中没有Java目录需要自己创建创建时选择Directory会自动提示文件夹下面两个都创建就行分两次完成

 此时你还需要添加一个tomcat自己下载一个吧接着是添加topcat进来

选择Tomcat Serverlocal版本因为我们是在本地进行的。

啊这个过程太细了感觉没完没了所以过程再省略需要大家自己搞好Tomcat环境然后我们继续。

运行项目

启动Tomcat看看 能不能成功成功后有两个表示

第一日志输出大致如下

第二会在你选定的浏览器上弹出一个html页面

到这里恭喜你你的环境已经弄好了接着我们可以来学习了解Spring MVC框架了。

什么是Spring MVC框架

Spring MVC框架是基于Spring框架的所以我们在添加Spring MVC的依赖时Spring框架的依赖也会被添加将具备Spring的所有特点。

Spring框架主要解决了后端服务器接收客户端的请求并给予一定的响应。

Spring MVC的MVC = Model + View + Controller

  • Model数据模型由业务逻辑层和数据访问层共同构成
  • View视图我们刚刚看到弹出来的html就算是View
  • Controller控制器用来协调Model和View之间的数据传递

这样就划分了其职责。通常我们不需要关心V和C层的交互和M的关系我们认为没有关系这么说只是方便大家理解后续还需要大家自行理解再思考。

框架目的

Spring MVC框架的目的是接收客户端请求要完成这一过程我们还需要将项目部署到Tomcat服务器上在浏览器中输入指定的URL可以得到简单的响应这样一个最简单的Spring MVC框架的工程就完成了接下来看看具体该怎么做吧。

一个简单的Spring MVC框架项目

添加Spring MVC依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.14</version>
        </dependency>

添加好记得拉一下依赖如果后续运行时提示不可识别Servlet相关类则补充添加以下依赖项

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

关于依赖你需要知道<scope>provided</scope>表示此依赖不会参与测试或部署因为当Web项目部署到Tomcat中后Tomcat环境会包含此依赖项。但不排除有人会报不可识别Servlet相关类所以建议大家都添加下。

添加Spring配置类

package cn.codingfire.springmvc.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
}

这个我们应该很熟悉了上一篇也已经讲过了。 

添加Spring MVC配置类

package cn.codingfire.springmvc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ComponentScan("cn.codingfire.springmvc")
public class SpringMvcConfig implements WebMvcConfigurer {
    
}

目的是扫描对应包下的文件并引入了Spring MVC配置。 

创建初始化类

此类需要继承自AbstractAnnotationConfigDispatcherServletInitializer且必须重写父类三个抽象方法其实在继承后可以根据快捷键自动生成。

package cn.codingfire.springmvc;

import cn.codingfire.springmvc.config.SpringConfig;
import cn.codingfire.springmvc.config.SpringMvcConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        //返回自己配置的Spring相关的配置类
        return new Class[] {SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        //返回自己配置的Spring MVC相关的配置类
        return new Class[] {SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        //返回由Spring MVC框架处理的路径
        return new String[] {"*.page"};
    }
}

这里解释下为什么这么做俩字规定就像我们要按照语法写Java一样这里就是要按照这样的方式来写。 

*.page这里就是用了一个不正常的扩展名因为怕冲突我们可以随便配只要不冲突就行。

创建控制器类

package cn.codingfire.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    //http://localhost:8080/springmvc_war_exploded/login.page
    @RequestMapping("/login.page")
    @ResponseBody
    public String login() {
        return "login page";
    }
}

@RequestMapping("/login.page")注解通常添加在类上用于配置请求路径的前缀部分也使用produces属性配置此控制器类中所有处理请求的方法响应时的文档类型例如在类上配置为@RequestMapping(value="xxxxx", produces="application/json; charset=utf-8")。

@ResponseBody 注解用于响应正文可添加在处理请求/处理异常的方法之前将作用于对应的方法或添加在类之前将作用于类中所有处理请求/处理异常的方法。

@Controller注解组件注解添加在类的声明之前表示此类是组件类应该添加在控制器类上。

从这里开始我们真正接触接口的开发了只不错这里还不是我们传统意义的接口只因为返回不是json格式这个不急我们后面会讲。

开始进行测试

以上几步做完之后我们就可以在浏览器输入链接看看页面请求服务器后能不能返回给我们一个显示login page的页面经测试完全无误。

这里又个很有意思的东西如果返回中文则会在浏览器中出现乱码这是因为某些版本的Spring MVC默认的字符编码是ISO-8859-1只支持ASCII字符后续会解决这个问题大家稍安勿躁。

Spring MVC框架的功能

@RequestMapping注解 

上面已经简单对@RequestMapping注解做过说明但@RequestMapping注解远不止此在以后的开发生涯你将无法甩开@RequestMapping注解因为它真的很重要。下面我们就来说说@RequestMapping注解可以做什么。

@RequestMapping注解的主要作用是配置请求路径和相应方法的映射关系在上例中大家已经看到了它的基础用法。除了配置在方法前还可以配置在类之前表示给当前路径额外增加一小段路径举例说明

@Controller
@RequestMapping("/user")
public class UserController {
    //http://localhost:8080/springmvc_war_exploded/login.page
    @RequestMapping("/login.page")
    @ResponseBody
    public String login() {
        return "login page";
    }
}

添加了“/user”后我们的请求路径就要变了

原来的路径http://localhost:8080/springmvc_war_exploded/login.page

新的路径http://localhost:8080/springmvc_war_exploded/login.pagehttp://localhost:8080/springmvc_war_exploded/user/login.pagehttp://localhost:8080/springmvc_war_exploded/login.page

"/user"你当然可以写的更长一些比如"/user/header"只要有利于你的开发。“/”可以不加系统会自动补上但是有个“/”时中间分隔的不能省略若是写了“//”只会有一个生效。

一般在项目中我们会针对不同的模块给出不同的模块名字以方便开发者区分接口的所属部分。

RequestMapping还可以设置其他的一些参数

  • method请求方式
@RequestMapping(value = "/login.page", method = RequestMethod.POST)

可以指定请求的方式是get还是post抑或是其他的类型一般来说实际开发中我们很少在方法上直接使用@RequestMapping再来指定请求的类型因为有更简便的方式比如@PostMapping等。只有同时允许多种请求方式我们才会这么用但开发者一般不会这么做这种用法多年来我也见过但确实不多。

关于请求方式共有GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE几种。里面大多我们是不常用的。

一旦指定了类型使用错误的请求方式将会报405错误。 

  • headers请求头
  • params请求参数
  • consumes请求文档类型
  • produces响应文档类型
@RequestMapping(value = "/login.page", produces="text/html; charset=utf-8")

produces我们用来显示的指定响应文档的类型它直接决定返回的数据是json类型还是我们目前的字符串类型。值得一提的是这个添加解决了我们上面返回中文乱码的问题因为我们指定了utf-8格式。

@ResponseBody注解

@ResponseBody是响应正文它响应的内容将直接展示在客户端没有配置的时候将直接显示为视图组件的名称也就是我们常说的jsp文件但这并不是前后端分离的思想早起用的很多如今jsp几乎已经没有公司在使用了。我们现在多采用前后端分离的做法。

@ResponseBody注解可以添加在方法上也可以 添加在类上在类上则作用于全部的方法。

前后端分离好处是一个接口多端使用而不需要后端写好几套接口供给不同的端来使用大家应该是比较熟悉的。所以Spring MVC内置了转换器将方法的返回值转换为响应到客户端的数据并补充其它必要数据返回值不同则使用的转换器也不同。比如我们刚刚提到的中文乱码问题。

这里我们采用String类型作为返回值实际开发中我们绝对不会这么做因为一个接口不仅仅是返回一个数据还包括是否成功成功失败的message相应的数据这时String类型已经无能为力你说String可以吗也可以但是会出现后端转换String难客户端String转换json难的问题这就浪费了时间完全没必要。

这里我们推荐一个依赖来解决这个问题

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>

添加到pom文件中记得拉一下依赖下载下来。

jackson-databind依赖项中有个转换器当Spring MVC调用的处理请求的方法的返回值是Spring MVC没有匹配的默认转换器时会自动使用jackson-databind的转换器而jackson-databind转换器会解析方法的返回值并将其处理为JSON格式的字符串在响应头中将 Content-Type设置为application/json。这里用到了RequestMapping中的header属性。

注意啦Spring MVC项目中还需要在Spring MVC的配置类上添加 @EnableWebMvc注解否则响应时将导致406错误。

Json格式的响应正文

我们创建一个数据类根据阿里命名规范我们也学习下数据类型的命名有一定规范数据我们统一放在POJO包下然后再分为VODTO等等后面有时间再给大家详细说说也可自行查找了解这里我们创建一个VO类用于响应客户端

package cn.codingfire.springmvc.vo;

public class UserVO {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

实现setter&getter方法后面会有一个依赖帮我们来做不需要我们显示的声明后面再说。jackson-databind会自动调用属性的Setter / Getter方法。

在controller中添加一个新的方法

package cn.codingfire.springmvc.controller;

import cn.codingfire.springmvc.vo.UserVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/user")
@ResponseBody
public class UserController {
    //http://localhost:8080/springmvc_war_exploded/user/login.page
    @RequestMapping("/login.page")
    public String login() {
        return "login page";
    }

    //http://localhost:8080/springmvc_war_exploded/user/info.page
    @GetMapping("/info.page")
    public UserVO userInfo() {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }
}

重启Tomcat在浏览器输入新的路径可以在浏览器看到json格式的数据

到这里正常的接口你已经会写了。但这还没完我们还要去接受 客户端传递的参数param属性即将登场。

接收请求的参数

我们新增一个注册方法

    //http://localhost:8080/springmvc_war_exploded/user/register.page
    @GetMapping("/register.page")
    public UserVO register(String username, String password) {
        UserVO userVO = new UserVO();
        userVO.setUsername(username);
        userVO.setPassword(password);
        return userVO;
    }

重启Tomcat然后在浏览器输入URL这里要注意有参数get方法的参数你应该是了解的

 回车之后发起请求我们在浏览器看看返回的json数据是不是我们自己传入的

非常好达到了我们的预期。这里要注意 几点

参数要声明为我们想要的类型在整个过程中Spring会尝试去转换参数类型为目标类型如果转换失败则会抛出异常。

参数名称也要和后端声明的一致若是不一致后端将无法得到请求中传入的参数值将为null。这些值都由服务器决定客户端需要严格遵守服务端定下的规则。

如果有必要可在参数前声明@RequestParam注解指定新的请求参数名而不再使用声明的参数名。还可以在此注解中配置required属性默认true则客户端必传此参数false时可不传。还可配置置defaultValue属性设置默认值。

若是客户端提交参数较多就需要将参数封装为对象的形式如

    @GetMapping("/register.page")
    public UserVO register(UserVO user) {
        UserVO userVO = new UserVO();
        userVO.setUsername(user.getUsername());
        userVO.setPassword(user.getPassword());
        return userVO;
    }

这样可以使代码更加简洁我们在实际开发中也多会使用此模式。但并不是所有情况都需要封装为对象如果参数较少只有几个则用显示的声明的形式更为直观和方便。可自行斟酌。

关于POJO和Model的命名

POJO即Plain Ordinary Java Object是普通Java对象的意思所有封装属性的对象的类统称POJO所有POJO类都需要遵守一定的规则

  • 实现Serializable接口
  • 属性私有
  • 实现setter&getter方法由开发工具生成后面我们可以通过依赖自动非显示的生成
  • 重写hashCode方法equals方法toString方法这个也和前一条一样由开发工具完成不需要开发者操心

关于命名后缀需要添加对应的业务领域的名字如xxxVOXXXDTO且后缀需要大写。

了解RESTful

RESTFUL是一种网络应用程序的设计风格和开发方式基于HTTP可以 使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景实现第三方OTT调用移动网络资源的功能动作类型为新增、变更、删除所调用资源。

RESTful的设计风格表现为将某些唯一的请求参数的值放在 URL中使之成为URL的一部分比如http://localhost:8080/springmvc_war_exploded/user/100021

URL后面的一串数字就是RESTful的表现这里的数字可以根据用户ID替换为其他的用户ID 。RESTful只是一种设计风格并不是一种规定所以没有明确的执行方式实际开发中我们多会这么设计

http://localhost:8080/springmvc_war_exploded/user/100021 查询ID为100021的用户信息

http://localhost:8080/springmvc_war_exploded/user/100021/delete 删除ID为100021的用户信息

RESTful建议根据希望获取数据的方式来选择请求方式比如增加用post删除用delete修改用put查询用get。而在实际开发中我们多数只使用get和post以查询为目的的URL用get否则都用post。

在服务端当涉及这样的URL时需要使用占位参数{参数}使用@PathVariable注解请求参数 可以将占位符的实际值注入到请求参数中

    @GetMapping("/{id}/info.page")
    public UserVO userInfo(@PathVariable Long id) {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }

有时候我不想把id这个参数暴漏给客户端那么我就可以通过此注解来指定一个名字给客户端用而我这里还是使用id。

    @GetMapping("/{id}/info.page")
    public UserVO userInfo(@PathVariable("userID") Long id) {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }

上传id的时候这个占位符我希望必须时数字数字之外的我就不处理这种时候可以通过正则表达式来进行处理

    @GetMapping("/{id:[0-9]+}/info.page")
    public UserVO userInfo(@PathVariable Long id) {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }

还有一种情况多种不冲突的正则表达式用在同一个URL上也是允许的只要参数不一致就可以看下怎么做

    @GetMapping("/{id:[0-9]+}/info.page")
    public UserVO userInfo(@PathVariable Long id) {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }


    @GetMapping("/{username:[a-zA-Z]+}/info.page")
    public UserVO userInfo(@PathVariable String username) {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");
        return userVO;
    }

以上我们都是用了正则表达式如果我不使用正则会怎么样呢先看看怎么写

    @GetMapping("/list/info.page")
    public UserVO userList() {
        ...
    }

当我们使用这个URL/list/info.page时就不会因为匹配到了/{id:[0-9]+}/info.page而不执行这个URL这里明确是没有使用正则的所以使用正则并不会影响到精确的URL匹配。

关于响应正文

先前我们已经说过了响应正文可以是String类型也可以是json类型但在实际开发中我们看到的响应正文都是比较规范的比如响应码响应信息响应数据我们可以通过抓包来看其他应用的响应格式会发现不同的公司他们的响应格式几乎是一样的这就是行业内不成文的规定大家默认的一种通用方式。

下面我们来写下这个通用数据格式的类

package cn.codingfire.springmvc.web;

public class JsonResult<T> {
    //状态码
    private Integer state;
    //消息包括成功信息和失败信息
    private String message;
    //返回数据我们希望它可以转化为任何类型所以一般会使用泛型
    private T data;

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

通用返回的类写好后我们来用一下

    @GetMapping("/codingFireInfo.page")
    public JsonResult<UserVO> codingFireInfo() {
        UserVO userVO = new UserVO();
        userVO.setUsername("codingfire");
        userVO.setPassword("123456");

        JsonResult jsonResult = new JsonResult();
        jsonResult.setState(200);
        jsonResult.setMessage("请求成功");
        jsonResult.setData(userVO);
        return jsonResult;
    }

接着直接重启Tomcat在浏览器输入我们的URL来来返回的结果注意乱码问题上面已经给出解决方案 

http://localhost:8080/springmvc_war_exploded/user/codingFireInfo.page

我们发现这么做是OK的。我们再来仔细看我们的代码封装度其实并不高我们希望状态码是枚举类型的且我们可以直接使用成功失败的方法不需要我们手写状态码和状态因为这样很容易出错这些值我们称之为魔法值在阿里开发手册中这种情况是严厉禁止的因为会代码的可读性降低所以还需要对这个类进行高度封装这并不难博主就不再给出封装部分的代码大家可以自己手写一下做个练习。 

统一处理异常

异常在代码中还是比较经常出现的基于面向对象语言的特点我们希望异常可以统一处理统一管理Spring MVC恰好提供了这种方式使我们在任何地方都可以直接抛出异常交由统一的异常处理机制来处理前提是你没有显示使用try...catch来捕获并处理异常。

处理异常有一种在当前类处理当前类异常的方式直接添加方法如下

    @ExceptionHandler
    public String handleException(NullPointerException e) {
        return "NullPointerException!";
    }

缺点是只能处理本类的异常对于其他类的异常则鞭长莫及这样就会造成重复写代码的情况所以我们多会使用统一的异常处理机制这种方式只做说明知道就可以。 

关于统一异常处理需要自定义类来统一处理我们来看看这个自定义类该怎么写

package cn.codingfire.springmvc.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public String handleException(NullPointerException e) {
        return "NullPointerException";
    }

    @ExceptionHandler
    public String handleNumberFormatException(NumberFormatException e) {
        return "NumberFormatException";
    }

    @ExceptionHandler
    public String handleThrowable(Throwable e) {
        e.printStackTrace();
        return "Throwable";
    }
}

这样处理异常的代码就可以放在专门的类中在类上添加@ControllerAdvice注解由于目前主流的响应方式都是“响应正文”的所以可将@ControllerAdvice替换为 @RestControllerAdvice 。

不同的异常类型可以使用不同的方法来单独处理就像上面写的方式那样。一般我们会将异常的相关信息进行输出这样可以方便开发者观察和分析问题。

了解这部分内容的同学会知道@ExceptionHandler注解指定的异常类型优先级高于通过参数指定的异常类型的方式而且此注解指定异常类型时同一个方法也可以处理多种异常的情况所以我们处理如下

package cn.codingfire.springmvc.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler({NullPointerException.class, NullPointerException.class})
    public String handleException(Throwable e) {
        return "Throwable";
    }

    @ExceptionHandler(NumberFormatException.class)
    public String handleNumberFormatException(Throwable e) {
        return "NumberFormatException";
    }

    @ExceptionHandler(Throwable.class)
    public String handleThrowable(Throwable e) {
        return "Throwable";
    }
}

Interceptor拦截器

Interceptor是拦截器在Spring MVC框架中拦截器可以在请求处理前后执行一些额外的代码比如在请求用户信息之前判断用户登录状态来决定是否拒绝访问或者放行。虽然可以这么做但拦截器的目的并不是拦截并阻止运行其目的是处理多种不同请求的处理过程。多发生在不同的请求需要执行高度相似的代码比如验证用户的登录状态。

使用拦截器和使用统一异常处理一样需要使用自定义的类并实现HandlerInterceptor接口重写里面的三个方法我们来看看这个类怎么写

package cn.codingfire.springmvc.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //根据用户登录状态选择是否放行不放行选择false
        return true;
    }

    @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 {
        //在请求执行结束后再统一执行某些操作
    }
}

拦截器写好了但是却不能自动生效因为拦截器都需要被注册才能生效注册过程通过重写 WebMvcConfigure接口中的addInterceptors()方法即可我们会到Spring MVC的配置类中看看该怎么注册

package cn.codingfire.springmvc.config;

import cn.codingfire.springmvc.Interceptor.LoginInterceptor;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ComponentScan("cn.codingfire.springmvc")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/codingFireInfo.page");
    }
}

以上是匹配单个接口但一般不会这么用前面讲过匹配的是某一类接口。

匹配用户模块所有接口

//匹配user下所有接口
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/*");

通配符的运用可以匹配user下所有接口addPathPatterns的参数也可以传数组可以把要添加的URL放在数组中。

匹配多层级

//匹配user下所有接口
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");

匹配多层级需要两个通配符。

不能匹配的情况

//匹配user下所有接口
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/10021/info.page");

是不是刚刚讲过的RESTful风格这里的数字是变化的所以没法匹配。

能匹配路径也能排除某些路径

registry.addInterceptor(new LoginInterceptor())
        .addPathPatterns("/user/codingFireInfo.page")
        .excludePathPatterns("/user/register.page", "/user/login.page");

通过excludePathPatterns方法排除路径路径可以是多个也可以使用通配符也可以给数组和添加路径的用法一样。

结语

写到这里Spring MVC框架就跟大家分享完了看到这里没你已经可以写一个简单的Spring MVC框架的项目了。甚至一些小的项目使用这个框架也完全够了只要有一台服务器它就可以正常工作给客户端提供服务。下一篇咱们SSM框架见。觉得不错就点个赞再走吧

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: SpringJava