当前位置: 首页 > news >正文

SpringMVC(二)@RequestMapping注解

我们先新建一个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的前端控制器DispatcherServletSpringMVC的配置文件默认的位置和名称:位置:WEB-INF下名称:<servlet-name>-servlet.xml,当前配置下的配置文件名为SpringMVC-servlet.xmlurl-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";}@GetMappingpublic  String helloR(){return  "success";}@PostMappingpublic  String helloE(){return  "success";}@DeleteMappingpublic  String hellof(){return  "success";}@PutMappingpublic  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.

相关文章:

SpringMVC(二)@RequestMapping注解

我们先新建一个Module。 我们的依赖如下所示&#xff1a; <?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:schemaL…...

NXP公司K60N512+PWM控制BLDC电机

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

CAA的VS Studio安装

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

条件查询和数据查询

一、后端 1.controller层 package com.like.controller;import com.like.common.CommonDto; import com.like.entity.User; import com.like.service.UserService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import …...

JSP旅游平台管理

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA、JSP等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…...

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…...

10.3作业

#include <myhead.h> int main(int argc, const char *argv[]) { mkfifo(“./f1”,0777); mkfifo(“./f2”,0777); pid_t cpid fork(); if(0 < cpid) { int fdw open(“./f1”,O_WRONLY); int fdr open(“./f2”,O_RDONLY); char buf[128] “”; while(1) { bzero…...

Springboot中的@Import注解~

Import注解是Spring框架中的注解之一&#xff0c;用于导入其他配置类或者组件 Import注解的作用有以下几点&#xff1a; 导入其他配置类&#xff1a;可以使用Import注解导入其他的配置类&#xff0c;将其加入到当前配置类中&#xff0c;从而可以共享配置信息 导入其他组件&am…...

Linux 安全 - SUID机制

文章目录 一、文件权限位二、SUID简介 一、文件权限位 &#xff08;1&#xff09; $ ls -l text.txt -rw-rw-r-- 1 yl yl 0 Sep 28 16:25 text.txt其中第一个字段-rw-rw-r–&#xff0c;我们可以把它分为四部分看&#xff1a; -rw-rw-r--&#xff08;1&#xff09;- &a…...

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录 前言502和504区别---都是Nginx返回的access.log和error.log介绍SpringBoot结合Nginx实战502 and 504准备工作Nginx配置host配置SpringBoot 502模拟access.logerror.log 504模拟access.logerror.log 500模拟access.logerror.log 总结 前言 刚工作那会&#xff0c;最常…...

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…...

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

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

HTML之如何下载网页中的音频(二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

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

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

[架构之路-229]:计算机体硬件与系结构 - 计算机系统的矩阵知识体系结构

目录 一、纵向&#xff1a;目标系统的分层结构 1.1 目标系统的架构 1.2 网络协议栈 1.3 计算机程序语言分层 二、横向&#xff08;构建目标系统的时间、开发阶段&#xff09;&#xff1a;软件工程 三、二维矩阵知识体系结构 一、纵向&#xff1a;目标系统的分层结构 1.1…...

第一章 visual studio下载安装

一、官网下载 地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 点击免费visual studio 二、安装 运行下载好的exe文件&#xff0c;自定义安装目录 三、选择需要的组件安装 只需要选择标记组件&#xff0c;然后点击安装 等待安装完成就行 四、重启电脑 安装完之后…...

【服务器】在 Linux CLI 下安装 Anaconda

【服务器】在 Linux CLI 下安装 Anaconda 1 系统环境2 下载安装包3 安装 1 系统环境 查看系统信息 cat /etc/os-release2. 查看架构 uname -a # output # Linux localhost.localdomain 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86…...

Python中Lambda用法

在Python中&#xff0c;lambda函数是一种形式较短的函数&#xff0c;又称为匿名函数。与正常的函数不同&#xff0c;lambda函数没有名称&#xff0c;因此只能在定义时直接传递给其他函数或变量使用&#xff0c;而不能单独调用。 lambda函数的语法非常简单&#xff0c;格式如下…...

nodejs+vue养老人员活体鉴权服务系统elementui

系统 统计数据&#xff1a;统计报表、人员台账、机构数据、上报数据、核验报表等&#xff0c;养老人员活体鉴权服务是目前国家养老人员管理的重要环节&#xff0c;主要为以养老机构中养老人员信息为基础&#xff0c;每月进行活体鉴权识别并统计数据为养老补助等管理。前端功能&…...

解决caffe中的python环境安装的问题(补充)

上一篇&#xff08;解决caffe中的python环境安装的问题_qiuchangyong的博客-CSDN博客&#xff09;说到了安装过程中遇到的常见问题&#xff0c;其实还有一个忘了补充&#xff0c;就是在执行命令"sudo python -m pip install -r requirements.txt"后&#xff0c;出现p…...

面试常用排序查找算法

文章目录 1 二分查找2 冒泡排序3 堆排序4 插入排序5 快速排序6 选择排序7 希尔排序 1 二分查找 定义两个变量left和right&#xff0c;分别表示数组的左边界和右边界&#xff0c;初始值分别为0和len - 1&#xff0c;其中len是数组的长度。计算数组的中间位置mid&#xff0c;公式…...

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.CUDA 解析&#xff1a;2007年&#xff0c;NVIDIA推出CUDA&#xff08…...

讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件

讲讲两个经典布局组件的实现 ① 布局容器组件 配置面板是给用户配置布局容器背景颜色等属性。这里我们不需要关注 定义文件 规定了组件类的类型、标签、图标、默认布局属性、主文件等等。 // index.js import Container from ./container.vue; class ContainerControl extends…...

Qt模块、Qt开发应用程序类型、Qt未来主要市场、Qt6功能普及

Qt模块、Qt开发应用程序类型、Qt未来主要市场、Qt6功能普及 文章目录 1.Qt核心模块2.Qt的功能拓展3.Qt未来主要市场4.Qt6功能普及5.弃用的功能&#xff1a; Qt是一个跨平台的应用程序开发框架&#xff0c;提供了丰富的模块和工具来开发各种类型的应用程序。以下是Qt目前已有的…...

nodejs+vue高校校图书馆elementui

管理员输入书籍所在的书架位置&#xff0c;借阅提醒系统&#xff1a;可以查看个人借阅信息和图书到期提醒、挂失、检索、虚拟借书证不仅为群众提供了服务&#xff0c;而且也推广了自己&#xff0c;让更多的群众了解自己。 管理员页面&#xff1a; 第三章 系统分析 10 3.1需求分…...

CUDA C编程权威指南:1.2-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.闭扫描和开扫描   对于一个二元运算符 ⊕ \oplus ⊕和一个 n n n元…...

C语言—位运算符

目录 &&#xff08;位与&#xff0c;AND&#xff09;&#xff1a; |&#xff08;位或&#xff0c;OR&#xff09;&#xff1a; 位取反(~)&#xff1a; 左移(<<)&#xff1a; 右移(>>)&#xff1a; &&#xff08;位与&#xff0c;AND&#xff09;&…...

怎么才能实现一个链接自动识别安卓.apk苹果.ipa手机和win电脑wac电脑

您想要实现的功能是通过检测用户代理&#xff08;User Agent&#xff09;来识别访问设备类型并根据设备类型展示相应的页面。您可以根据以下步骤进行实现&#xff1a; 选择后端语言和框架&#xff0c;例如&#xff1a;Node.js、Express。 创建一个新的Express项目。 编写一个…...

zookeeper选举机制

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

vcpkg切换 Visual Studio 版本

vcpkg切换 Visual Studio 版本 在使用vcpkg作为项目的包管理工具时&#xff0c;可能会遇到需要切换Visual Studio版本的情况。下面是一种简单的方法来实现这个目标&#xff0c;通过修改triplet文件来指定使用的Visual Studio版本。 步骤1: 创建或修改Triplet文件 首先&#…...

关键词是在网站后台做的吗/深圳市住房和建设局

北京各街头的情愿 今天是2016年10月24日&#xff0c;也是1024程序员节&#xff0c;就在前几天&#xff0c;作为IT人群高密度聚集的北京地区&#xff0c;在北京各个街头出现了大量参与“程序员不加班”的请愿行动的人群&#xff0c;受北京“1024程序员节”请愿活动影响&#xff…...

b2b网站建设费用/国内专业的seo机构

目录 简介 算法详解 1.1 对齐 1.2 损失函数 1.3 预测 1.3.1 Greedy Search 1.3.2 Beam Search CTC的特征 参考知识 简介 在语音识别中&#xff0c;我们的数据集是音频文件和其对应的文本&#xff0c;不幸的是&#xff0c;音频文件和文本很难再单词的单位上对齐。除了语…...

平江高端网站建设/西安seo推广公司

1、react中文网 2、ECMAScript 6 入门-阮一峰 3、从零学习 React 技术栈系列教程 4、react在线编辑器-codepen 5、react在线编辑器-codepan 6、react native中文文档 基础语法部分 jsx语法 Eslint 代码规范 react全家桶系列 Redux 数据管理库 React-router 路由 I…...

高端网站有哪些/企业推广网络营销

理清这4个问题&#xff0c;让RPA带你起飞 应用RPA前必须要知道的4个问题 当前&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;技术已经得到很多行业的认可与称赞&#xff0c;它可将工作流程模块化&#xff0c;能够在一连串的流程上起到替代人工、自动执行的作用&…...

网站开发毕设文献/百度推广视频

//01 头文件 #include<algorithm> 02 第四个参数注意 "::" 且不带 "()" 03 非字母字符不变 字母字符按要求转换 04 无法在 函数内部 将转换后的字符串 拷贝 至另一个字符串 // #include<bits/stdc.h> using namespace std;int main() {string …...

wordpress 2m附件/百度竞价推广点击软件奔奔

CACTI测试OK安装环境&#xff1a;CENTOS5.4提前需要安装的组件&#xff1a;1. mysql2。APACHE3。PHP步骤&#xff1a;一。安装 net-snmpyum install net-snmp*注意加个*&#xff0c;把所有的咚咚都装上&#xff0c;否则没有cacti需要的命令.二。安装 php-snmpyum install php-s…...