目录
3、@RequestMapping注解的【method】属性
4、@RequestMapping注解的【params】属性(了解)
5、@RequestMapping注解的【headers】属性(了解)
环境搭建
pon.xml配置
<?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>org.example</groupId>
<artifactId>springmvc-thymeleaf002</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc-thymeleaf002 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provide</scope>
</dependency>
<!--logback日志框架依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!--spring整合thymeleaf的依赖-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.10.RELEASE</version>
</dependency>
</dependencies>
<build>
<!--指定资源文件的位置-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
在web.xml注册DispatcherServlet前端控制器
<?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框架-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springMVC位置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--将前端控制器DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在springmvc.xml中配置包扫描和thymeleaf的视图解析器
<?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/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置包扫描-->
<context:component-scan base-package="com.zl.controller"/>
<!-- 配置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">
<!-- 视图前缀 -->
<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>
@Request注解的功能
1. @RequestMapping注解的位置
(1)只出现在方法上
package com.zl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ControllerTest {
@RequestMapping("/")
public String demo(){
return "index";
}
}
此时的访问路径就是:http://localhost:8080/springmvc/WEB-INF/templates/index.html,其中springmvc是上下文路径!
(2)出现在类上
package com.zl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/action")
public class ControllerTest {
@RequestMapping("/")
public String demo(){
return "index";
}
}
此时的访问路径就是:http://localhost:8080/springmvc/action/WEB-INF/templates/index.html,其中springmvc是上下文路径!
2、@RequestMapping注解的【value】属性
注:【value属性】是通过请求的【请求地址】来匹配请求
注:前面就是使用了value属性,只不过只有一个值就省略了value属性的名。实际上vlaue属性是一个字符串数组,可以有多个值!
@AliasFor("path")
String[] value() default {};
需求:多个请求地址访问同一个资源!
在index.html中配置两个请求地址
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a th:href="@{/test1}">请求方式1</a>
<a th:href="@{/test2}">请求方式2</a>
</body>
</html>
@RequestMapping注解的value属性指定多个值
package com.zl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ControllerTest {
@RequestMapping("/")
public String demo(){
return "index";
}
@RequestMapping(value = {"/test1","/test2"})
public String toSuccess(){
return "success";
}
}
测试:此时无论是/test1请求还是/test2请求都能访问到success资源
3、@RequestMapping注解的【method】属性
注:【method属性】是通过请求的【请求方式】来匹配请求(不仅要满足请求的地址相同,请求的方式也要相同)
RequestMethod[] method() default {};
RequestMethod实际上实际上一个枚举类型
package org.springframework.web.bind.annotation;
public enum RequestMethod {
GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;
private RequestMethod() {
}
}
注:如果在@RequestMappring注解中没有使用method去指定请求的方式,那么无论前端发过来get还是post都可以进行匹配;因为此时不是以method顺序ing来匹配请求了!
例:前端分别使用get(默认就是get)和post发送请求
在index.html中配置两个请求地址get和post
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--默认就是get请求方式提交-->
<a th:href="@{/test1}">get请求方式</a><br>
<!--post请求方式-->
<form th:action="@{/test2}" method="post">
<input type="submit" value="post请求方式">
</form>
</body>
</html>
@RequestMapping注解的value属性指定多个值,并且不指定请求方式
@RequestMapping(value = {"/test1","/test2"})
public String toSuccess(){
return "success";
}
测试:此时无论是get请求发送的/test1请求还是post请求发送的/test2请求都能访问到success资源;此时实际上就不以请求方式来进行匹配了,就是单纯的通过地址进行匹配!
例:如果此时在@RequestMapping中使用method属性设置了请求方式;此时如果地址路径匹配上了,但是请求方式没有匹配上会报405错误
@RequestMapping注解的value属性指定多个值,并且设置的请求方式为get
@RequestMapping(value = {"/test1","/test2"},method = RequestMethod.GET)
public String toSuccess(){
return "success";
}
测试:此时对于test2发送的时候使用的是post请求,接收的时候使用get请求,会报405错误
例:如果让请求映射既支持get请求又支持post请求,怎么办?
@RequestMapping(value = {"/test1","/test2"},
method = {RequestMethod.GET,RequestMethod.POST})
public String toSuccess(){
return "success";
}
注:
(1)对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
前端发送post请求
<!--发送post请求,为了测试PostMapping注解-->
<form th:action="@{/postmapping}" method="post">
<input type="submit" value="post请求方式">
</form>
后端使用@PostMapping注解接收
@PostMapping("/postmapping")
public String testPostMapping(){
return "success";
}
(2)常用的请求方式有get,post,put,delete
4、@RequestMapping注解的【params】属性(了解)
注:【params属性】是通过请求的【请求参数】来匹配请求
String[] params() default {};
后端使用param属性
@RequestMapping(value = "/param",
params = {"username","password=123"})
public String toParam(){
return "success";
}
前端请求
<!--方式一-->
<a th:href="@{/param?username='root'&password=123}">param属性的方式</a>
<!--方式二-->
<a th:href="@{/param(username='root',password=123)}">param属性的方式</a>
5、@RequestMapping注解的【headers】属性(了解)
注:【headers属性】是通过请求的【请求头信息】来匹配请求
①"header":要求请求映射所匹配的请求必须携带header请求头信息
②"!header":要求请求映射所匹配的请求必须不能携带header请求头信息
③"header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value
④"header!=value":要求请求映射所匹配的请求必须携带header请求头信息且header!=value
6、SpringMVC支持ant风格的路径
注:这种风格的请求,实际上就是支持模糊匹配!
(1)?:表示任意的单个字符;
后端代码
@RequestMapping("/a?b/testAnt1")
public String test1(){
return "success";
}
前端代码
<!--中间匹配一个字符-->
<a th:href="@{/a1b/testAnt1}">测试1</a>
<a th:href="@{/acb/testAnt1}">测试2</a>
(2)*:表示任意的0个或多个字符;
后端代码
@RequestMapping("/a*b/testAnt1")
public String test2(){
return "success";
}
前端代码
<!--中间不匹配字符、匹配一个字符、匹配多个字符都可以-->
<a th:href="@{/cb/testAnt2}">测试3</a><br>
<a th:href="@{/c1b/testAnt2}">测试4</a><br>
<a th:href="@{/cccb/testAnt2}">测试5</a><br>
(3)**:表示任意的一层或多层目录;
注意:在使用**时,只能使用/**/xxx的方式!
后端代码
@RequestMapping("/**/testAnt3")
public String test3(){
return "success";
}
前端代码
<!--任意一个路径、多层路径、省略不写都是可以的-->
<a th:href="@{/abc/testAnt3}">测试6</a><br>
<a th:href="@{/ab/c/testAnt3}">测试7</a><br>
<a th:href="@{/testAnt3}">测试8</a><br>
7、SpringMVC支持路径中的占位符(重点)
注:仅限于超链接或地址栏提交数据,它是一杠一值(前端传数据)、一杠一大括号(后端接收数据),使用注解@PathVariable(路径变量)来解析。
前端代码:一杠一值
<a th:href="@{/testRest/jack/12}">测试路径中的占位符-->/testRest</a><br>
后端代码:一杠一大括号
@RequestMapping("/testRest/{name}/{age}")
public String toRest(@PathVariable String name, @PathVariable int age){
System.out.println("name:"+name+", age:"+age);
return "success";
}
执行结果:成功获取到前端提交的数据