SpringMVC(二)@RequestMapping注解

news2024/11/15 19:28:08

我们先新建一个Module。

我们的依赖如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rgf</groupId>
    <artifactId>Spring_mvc_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>
        <!--SpringMVC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

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

        <!--Spring和Thymeleaf整合包-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.12.RELEASE</version>
        </dependency>
    </dependencies>


</project>

通过此处我们来进行导入web.xml:

导入的web.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--配置SpringMVC的前端控制器DispatcherServlet
    SpringMVC的配置文件默认的位置和名称:
    位置:WEB-INF下
    名称:<servlet-name>-servlet.xml,当前配置下的配置文件名为SpringMVC-servlet.xml
    url-pattern中/和/*的区别:
    /:匹配浏览器向服务器发送的所有请求(不包括.jsp)
    /*:匹配浏览器向服务器发送的所有请求(包括.jsp)

    -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--设置servlet的初始化参数-->
        <!--设置SpringMVC配置文件的位置和名称-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--将DispatcherServlet的初始化时间提前到服务器启动时。(默认为servlet在第一次访问时进行执行-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--  <url-pattern>/</url-pattern>可以写/*,也可以写*.do(为后缀匹配),/无法·匹配jsp的请求的,但是/*可以匹配任意请求-->
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--   The mappings for the JSP servlet
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
    在tomcat里面的的web.xml已经配置了servlet专门来处理.jsp的请求,即所有的.jsp的请求通过JspServlet来进行处理
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    -->
</web-app>

 之后我们来进行创建配置文件:springmvc-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--扫描控制层组件-->
    <context:component-scan base-package="com.rgf.controller"></context:component-scan>

    <!--配置Thymeleaf视图解析器-->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine"><!--模板引擎-->
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver"><!--模板解析器-->
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!--/WEB-INF/templates/index.html-->
                        <!--视图前缀+逻辑视图+视图后缀就是我们完整的物理视图,即访问index.html,不用完整路径,即index即可进行访问-->
                        <!--视图前缀-->
                       <property name="prefix" value="/WEB-INF/templates/"/>
                        <!--视图后缀-->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                     </bean>
                 </property>
            </bean>
        </property>
    </bean>
</beans>

我们创建的controller如下所示:

package com.rgf.controller;

import org.springframework.stereotype.Controller;

@Controller
public class TestRequestMappingController {

}
package com.rgf.controller;

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

@Controller
public class ProtalController {
    @RequestMapping("/")
    public  String  protal(){
        return  "index";
    }
}

之后根据web.xml的配置文件,我们将该目录创建出来:且该目录下的文件为index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
</body>
</html>

完成之后,我们来进行配置:

 3.1 @RequestMapping注解的功能

从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。

SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

3.2@RequestMapping注解的位置

@RequestMapping标识一个类:设置映射请求的请求路径的初始信息

@RequestMapping标识一个方法:设置映射请求请求路径的具体信息

@Target:当前注解能够标识的位置

当我们标记到方法的时候:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    @RequestMapping("/hello")
    public  String hello(){
        return  "success";
    }

}

 我们可以根据该具体方法,跳转到具体方法标识的具体页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
</body>
</html>

我们将该注解放到类里面的时候:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    @RequestMapping("/hello")
    public  String hello(){
        return  "success";
    }

}

此时我们再进行部署运行的时候,发现它无法进行跳转:

此时的路径为类里面的路径和方法里面的路径进行拼接起来的路径。

当我们在两个控制层下面没有在类的里面采用注解区分相同的路径的方法时则会直接报错

package com.rgf.controller;

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

/**
 * @RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping("/hello")
    public  String hello(){
        return  "success";
    }
}
package com.rgf.controller;

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

@Controller
public class ProtalController {
    @RequestMapping("/")
    public  String  protal(){
        return  "index";
    }

    @RequestMapping("/hello")
    public  String hello(){
        return  "success";
    }
}

此时就体现出用@RequestMapping在类里面进行注解的重要性。

 3.3@RequestMapping注解的value属性:

我们可以看到value属性是一个数组类型的。我们查看如下所示:

 @RequestMapping({"/hello","/abc"})
    public  String hello(){
        return  "success";
    }

此时即为该方法会被多个请求处理

servlet也可以被多个请求处理:

<servlet-mapping>
        <!--  <url-pattern>/</url-pattern>可以写/*,也可以写*.do(为后缀匹配),/无法·匹配jsp的请求的,但是/*可以匹配任意请求-->
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/aa</url-pattern>
        <url-pattern>/aaa</url-pattern>
    </servlet-mapping>

我们进行测试如下所示:

package com.rgf.controller;

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

/**
 * @RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping({"/hello","/abc"})
    public  String hello(){
        return  "success";
    }
}

我们定义该方法的页面为如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
</body>
</html>

我们重新部署之后我们点击两者不同的进行如下:

都会进入如下界面:

 3.4@RequestMapping注解的method属性:

 

method为请求方式(get请求和post请求) ,且他的类型为RequestMethod[ ]数组。

根据注释,可知他的枚举类型如下所示:

表单提交的时候将method设置为post,ajax里面将请求方式设置为post.

此时设置如下所示:

package com.rgf.controller;

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

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 1.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},method = RequestMethod.GET )
    public  String hello(){
        return  "success";
    }
}

此时完全匹配。

如果我们将方式改为post则不进行匹配。

package com.rgf.controller;

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

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 1.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},method = RequestMethod.POST )
    public  String hello(){
        return  "success";
    }
}

我们进行修改代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
</body>
</html>

我们进行点击之后则会直接报错显示405.

我们进行修改如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
</body>
</html>

直接复制网址进行访问为get请求方式,如果设置为post请求方式,进行利用复制网址进行访问,则会报错405.

通过service服务(控制台)也可以进行查看报错信息:

 我们进行设置如下所示,则会又可以匹配get方式,也可以匹配post方式。‘

package com.rgf.controller;

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

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},method ={RequestMethod.POST,RequestMethod.GET})
    public  String hello(){
        return  "success";
    }
}

 3.5@RequestMapping注解的params属性:

产生的派生注解:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},method ={RequestMethod.POST,RequestMethod.GET})
    public  String hello(){
        return  "success";
    }
    @GetMapping
    public  String helloR(){
        return  "success";
    }
    @PostMapping
    public  String helloE(){
        return  "success";
    }
    @DeleteMapping
    public  String hellof(){
        return  "success";
    }
    @PutMapping
    public  String helloD(){
        return  "success";
    }
}

我们进行测试第一种方式如下所示:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username"}
    )
    public  String hello(){
        return  "success";
    }
}

我们的index.html如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
</body>
</html>

重新运行之后如下所示:

我们进行点击之后会出现如下所示:

会进行跳转该界面。

我们继续进行测试第二种方式如下所示:
 

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password"}
    )
    public  String hello(){
        return  "index";
    }
}

我们利用此直接进行跳转的时候:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
</body>
</html>

本身未携带,所以不会报错。但是我们直接在网址上进行拼接的时候,如下所示:

拼接上去也会报400错误。!password即为不能携带password.

我们来测试第三种方式:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20"}
    )
    public  String hello(){
        return  "index";
    }
}

我们在网址里面进行拼接如下:

则会成功跳转。

我们测试第四种方法:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"}
    )
    public  String hello(){
        return  "index";
    }
}

我们继续进行拼接如下所示:

此时重要不进行拼接gender=“男”,则不会进行报错。

总结如下所示:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters; 
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"}
    )
    public  String hello(){
        return  "index";
    }
}

 3.6@RequestMapping注解的headers属性:

@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射

@RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系

“header":要求请求映射所匹配的请求必须携带header请求头信息

“!header":要求请求映射所匹配的请求必须不能携带header请求头信息

"header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value

"header!=value":要求请求映射所匹配的请求必须携带header请求头信息且header!=value

若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到。

请求头和响应头(他们的键)是不区分大小写的,但是他们的值是区分大小写的

我们进行测试如下所示:

我们发现任意一个页面,点击进去之后,点击network,查看他的请求头信息,即可发现里面有一个referer(即为该页面的来源页面)

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters; 
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-; 
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
}

3.7@RequestMapping注解使用ant风格的路径

?:表示任意的单个字符

*:表示任意的0个或多个字符(任意个数的任意字符)

**:表示任意层数的任意目录

注意:在使用**时,只能使用/**/xxx的方式

我们进行测试如下所示:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"}
    )
    public  String hello(){
        return  "index";
    }
     @RequestMapping("/a?a/test/ant")
    public  String testAnt(){
        return  "success";
    }
}

我们在该index.html里面进行匹配:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性(第一种)</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性(第二种)</a><br>
<a th:href="@{/aaa/test/ant(username='admin')}">测试@RequestMapping注解支持ant风格的路径</a><br>
</body>
</html>

我们进行访问如下所示:

该网址可成功访问到我们的success.html画面。

?代替的是任意字符(不包括其本身)

在一个请求路径中,?是一个路径和我们的请求参数的分割符,?前面是路径,?后面是请求参数。

再测试如下:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;
 * 6.SpringMVC支持ant风格的路径
 * 在@RequestMapping注解的value属性值中设置一些特殊字符
 * ?:表示任意的单个字符(不包括?)
 * 
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
    @RequestMapping("/a?a/test/ant")
    public  String testAnt(){
        return  "success";
    }
    @RequestMapping( "/a*a/test/ant")
    public  String testAnttwo(){
        return  "success";
    }

}

我们的访问路径如下所示:

 但是?仍然不可以,同时/(路径分隔符)也不可以

我们继续进行如下测试:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;
 * 6.SpringMVC支持ant风格的路径
 * 在@RequestMapping注解的value属性值中设置一些特殊字符
 * ?:表示任意的单个字符(不包括?)
 * *:任意个数的任意字符(不包括?和/)
 * **:任意层数的任意目录,注意使用方式只能将**写在双斜线中,前后不能有任何的其他字符
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
    @RequestMapping("/a?a/test/ant")
    public  String testAnt(){
        return  "success";
    }
    @RequestMapping( "/a*a/test/ant")
    public  String testAnttwo(){
        return  "success";
    }
    @RequestMapping( "/**/test/ant")
    public  String testAntthree(){
        return  "success";
    }

}

我们的访问路径如下所示:

是可以访问成功的。

所以:

?:表示任意的单个字符(不包括?和/)

*:任意个数的任意字符(不包括?和/)

 **:任意层数的任意目录,注意使用方式只能将**写在双斜线中,前后不能有任何的其他字符(不包括?)

 3.8SpringMVC支持路径中的占位符

原始方式:/deleteUser?id=1

rest方式:/user/delete/1

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符(xxx)表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/test/rest/1}">测试@RequestMapping注解的value属性中的占位符</a>
</body>
</html>
package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
    @RequestMapping("/test/rest/1")
    public  String testRest(){
        return  "index";
    }
}

我们可以通过以上所述进行访问。但是这样子则无法获取传输过去的请求参数。

我们可以这样子进行传输:

package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
    @RequestMapping("/test/rest/{id}")
    public  String testRest(@PathVariable("id") Integer id){
        System.out.println("id:"+id);
        return  "index";
    }
}

我们进行访问如下

 我们点击进行访问之后:

访问成功之后会在控制台看到输出id:1

我们进行添加参数:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>success.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a>
<form th:action="@{/hello}" method="post">
    <input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符</a>
</body>
</html>
package com.rgf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 1.@RequestMapping注解的位置
 * @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
 * @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
 * 2.@RequestMapping注解的value属性
 * 作用:通过请求的请求路径匹配请求
 * value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 3.@RequestMapping注解的method属性
 * 作用:通过请求的请求方式匹配请求
 * method属性是RequestMethod类型的数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一种请求方式
 *则当前请求就会被注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求方式不匹配,此时页面报错:405-Request  method 'XXX' not supported
 * 在@RequestMapping的基础上,结合请求方式的派生注解:
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 派生注解没有method属性,仍然有value属性。
 * 4.@RequestMapping注解的params属性(value和method匹配其中一个就可以,但是params必须携带且匹配,若为携带,则会报错400,
 * 意为当前请求的参数与真实的参数不匹配)
 * 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置
 * params可以使用四种表达式:
 * "param":表示当前所匹配请求的请求参数中必须携带param参数
 * "!param":表示当前所匹配请求的请求参数中一定不能携带param参数
 * "param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
 * "param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,若携带值一定不能为value
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,此时页面报错:
 * 400-Parameter  conditions "username" not met for actual request parameters;
 * 5.@RequestMapping注解的headers属性
 * 作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息满足headers属性的设置
 * 若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,此时页面报错:404-;
 * 7.@RequestMapping注解使用路径中的占位符
 * 传统:/deleteUser?id=1
 * rest:user/delete/1
 * 需要在@RequestMapping注解的value属性中所设置的路径中,使用{xxx}的方式表示路径中的数据
 * 在通过@PathVariable注解,将占位符所表示的值和控制器方法的形参进行绑定
 */
//@RequestMapping("/test")
@Controller
public class TestRequestMappingController {
    //此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping(value = {"/hello","/abc"},
            method ={RequestMethod.POST,RequestMethod.GET},
            params = {"username","!password","age=20","gender!=男"},
            headers={"referer"}
    )
    public  String hello(){
        return  "index";
    }
    @RequestMapping("/test/rest/{username}/{id}")
    public  String testRest(@PathVariable("id") Integer id,@PathVariable("username") String username){
        System.out.println("id:"+id+"username:"+username);
        return  "index";
    }
}

访问成功之后会在控制台看到输出id:1,username:admin.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAA的VS Studio安装

文章目录 一、官网下载VS Studio二、勾选如下安装信息三、更改软件安装位置四、17专业版密钥 一、官网下载VS Studio 官网下载地址&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/ 下载对应版本后&#xff0c;以VS Studio2017为例&#xff1a; 二、勾…

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…

OpenMMLab【超级视客营】——支持InverseForm Loss(MMSegmentation的第三个PR)

文章目录 1. 任务目标1.1 issue1.2 原理相关资料&#xff08;论文讲解&#xff09;InverseFormSTN(Spatial Transformer Networks) 1.3 实现相关资料&#xff08;相关PR&#xff09; 2. 理解原理3. 代码实现3.X checklist3.0 Issue中的有效内容3.1 MMSegmentation支持multiple …

计算机网络(第8版)-第4章 网络层

4.1 网络层的几个重要概念 4.1.1 网络层提供的两种服务 如果主机&#xff08;即端系统&#xff09;进程之间需要进行可靠的通信&#xff0c;那么就由主机中的运输层负责&#xff08;包括差错处理、流量控制等&#xff09;。 4.1.2 网络层的两个层面 4.2 网际协议 IP 图4-4 网…

(四)正点原子STM32MP135移植——u-boot移植

一、概述 u-boot概述就不概述了&#xff0c;u-boot、kernel、dtb三件套&#xff0c;dddd 经过国庆艰苦奋战&#xff0c;已经成功把所有功能移植好了 二、编译官方代码 进入u-boot的目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf u-boot-stm32mp-v2022.10-stm32mp-r1-r0.…

zookeeper选举机制

全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊&#xff0c;仔细思考了一下&#xff0c;应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关&#xff0c;下面以3个举例 选举过程如下 server…

【Vue组件化编程】

Vue组件化编程 1 对组件的理解2 非单文件组件2.1 基本使用2.2 几个注意点2.3 组件的嵌套2.4 VueComponent构造函数2.5 一个重要的内置关系 3 单文件组件 1 对组件的理解 组件&#xff1a;实现应用中局部功能代码和资源的集合。优点&#xff1a;文件好维护&#xff1b;依赖关系不…

力扣 -- 96. 不同的二叉搜索树

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int numTrees(int n) {vector<int> dp(n1);//初始化dp[0]1;//填表for(int i1;i<n;i){for(int j1;j<i;j){//状态转移方程dp[i](dp[j-1]*dp[i-j]);}}//返回值return dp[n];} }; 你学会了吗&…

SpringBoot美食网站系统

采用技术:springbootvue 项目亲测可以完美运行

typscript开发环境搭建

typescript是基于javascript的强类型标记性语言&#xff0c;使用typescript语言可开发出不同规模的、易于扩展的web页面应用&#xff0c;本文主要描述typescript的开发环境搭建。 npm install -g typescript 如上所示&#xff0c;在本地开发环境中&#xff0c;使用nodejs运行…

苹果ios应用ipa文件签名为什么需要签名才能上架?有没有别的方式替代苹果签名?

近年来&#xff0c;苹果设备的普及程度逐渐加深&#xff0c;随之而来的是越来越多的应用程序涌入了苹果的应用商店。为了保障用户设备和数据的安全&#xff0c;以及减少恶意程序和恶意软件的传播&#xff0c;苹果公司实行了一套严格的应用安全机制&#xff0c;其中就包括应用程…

【现代机器人学】学习笔记十四:中文版印刷/翻译勘误

首先声明&#xff0c;这个印刷/勘误并非经过官方的认可&#xff0c;只是我个人的粗浅的理解。如果内容有误&#xff0c;恳请大家谅解指正。 其实有的并不算错&#xff0c;只是我个人认为不太准确&#xff0c;在我学习过程中产生了一些小疑惑和误解。 都是一些小毛病&#xff…

2024级199管理类联考之数学基础(下篇)

平面几何(平均2题) 三角形(性质、特殊三角形、全等与相似) 性质 由不在同一直线的三条线段首尾依次连接所组成的图形三条边、三个内角、三个定点三角形内角和为180度,外角和为360度,多边形的外角和为360度,n多边形的内角和为(n-2)*180度一个外角等于不相邻的两个内角之和任意…

NXP公司K60N512+PWM控制BLDC电机

本篇文章介绍了使用NXP公司提供的塔式快速原型系统来驱动控制带霍尔传感器的无刷直流电机。文章涉及的塔式快速原型系统主要包括以下四个独立板卡&#xff1a;1.塔式系统支撑模块&#xff08;TWR-Elevator&#xff09;&#xff0c;用以连接微控制器以及周边模块&#xff1b;2.低…

雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标&#xff0c;它代表了雷达探测识别的速度&#xff0c;速度越快&#xff0c;后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度&#xff0c;提供了一种合理利用片上资源提高探测识别速度的常用方法&#xff0c;然…

qt 5.15.2 安卓 macos

macos环境安卓配置 我的系统是monterey12.5.1 打开qt的配置界面 这里版本是java1.8&#xff0c;注意修改这个json文件&#xff0c;显示包内容 {"common": {"sdk_tools_url": {"linux": "https://dl.google.com/android/repository/comm…

Boost程序库完全开发指南:1-开发环境和构建工具

Boost官方于2019年12月发布的1.72版编写&#xff0c;共包含160余个库/组件&#xff0c;涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域&#xff0c;使用Boost&#xff0c;将大大增强C的功能和表现力。环境&#xff1a;Windows 10&#x…

JAVA学习(4)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

vertx的学习总结6

Beyond the event bus 一、章节覆盖&#xff1a; 如何在事件总线之上公开服务 verticles和事件总线服务的异步测试 动态代理&#xff1a; MyService 接口 package porxy.test;import io.vertx.codegen.annotations.ProxyGen;ProxyGen public interface MyService {void he…