5. 映射请求
使用@RequestMapping注解用于在类或者方法上进行声明,类上面可以没有。如果没有那么我们请求路径:url的值即为@RequestMapping注解中的路径
http://ip:port/context/url
5.1. 使用
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* 项目 : spring-mvc-java1
* 创建时间 :2020/3/26 15:37 26
* author :jshand-root
* site : http://314649444.iteye.com
* 描述 : 测试@RequestMapping注解
*/
@Controller //让IOC容器管理组件
public class RequestController {
//http://localhost:8080/springmvc/req1
//http://192.168.81.3:8080/springmvc/req1
@RequestMapping("/req1")
public void req1(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("测试在方法中定义@RequestMapping注解");
PrintWriter out = response.getWriter();
out.println("req1:"+new Date().getTime());
out.flush();
out.close();
}
5.2. 在类和方法中同时存在@RequestMapping注解
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* 项目 : spring-mvc-java1
* 创建时间 :2020/3/26 15:47 26
* author :jshand-root
* site : http://314649444.iteye.com
* 描述 : 账户的控制器
*/
@Controller
@RequestMapping("/account")
public class AccountController {
// http://localhost:8080/springmvc/account/insert
@RequestMapping("/insert")
public void insert(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("账户的插入");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("账户的插入:"+new Date().getTime());
out.flush();
out.close();
}
//http://localhost:8080/springmvc/account/update
@RequestMapping("/update")
public void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("账户的修改");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("账户的修改:"+new Date().getTime());
out.flush();
out.close();
}
}
5.3. @RequestMapping的其他属性
通过value匹配url,还可以配合着method、params、headers属性一起精细化的匹配
5.3.1. value
5.3.2. Method
用于匹配不同的http请求方法(POST、GET、DELETE、PUSH...7)
java
//http://localhost:8080/springmvc/req2 方法是 POST
//http://localhost:8080/springmvc/index.jsp 上的按钮触发此次请求 方法是 POST
@RequestMapping(value = "/req2",method ={RequestMethod.POST})
// @RequestMapping(value = "/req2",method ={RequestMethod.POST, RequestMethod.GET})
public void req2(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("用于支持post请求");
PrintWriter out = response.getWriter();
out.println("POST request :"+new Date().getTime());
out.flush();
out.close();
}
html
<form method="post" action="req2">
<input type="submit" value="请求后端的post方法"/>
</form>
出现如下问题需要考虑方法上的RequestMapping注解是否指定了method属性
5.3.3. params
用于区分是否携带对应参数,对参数名字、值的匹配
param1: 表示请求必须包含名为 param1 的请求参数
!param1: 表示请求不能包含名为 param1 的请求参数
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
5.3.3.1. param1: 表示请求必须包含名为 param1 的请求参数
java
//请求路径中必须包含参数名:name
//http://127.0.0.1:8080/springmvc/req3?name=jshand
@RequestMapping(value = "/req3",params ={"name"} )
public void req3(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name = request.getParameter("name");
System.out.println("用于支持post请求"+name);
PrintWriter out = response.getWriter();
out.println("name request :"+new Date().getTime()+" "+name);
out.flush();
out.close();
}
正确的情况:
如果不包含name参数:HTTP 400(参数、请求的问题):
5.3.3.2. !param1: 表示请求不能包含名为 param1 的请求参数
java
//请求路径中不能出现name参数
//http://127.0.0.1:8080/springmvc/req4?name=jshand 错误
//http://127.0.0.1:8080/springmvc/req4?p1=va1 √
@RequestMapping(value = "/req4",params ={"!name"} )
public void req4(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("用于支持post请求");
PrintWriter out = response.getWriter();
out.println("name request :"+new Date().getTime());
out.flush();
out.close();
}
5.3.3.3. param1=value1: 表示请求包含名为 param1 的请求参数且值等于value1;参数必须传
java
//请求路径中必须传递参数name并且值需要跟jshand一直
//http://127.0.0.1:8080/springmvc/req5?name=jshand
@RequestMapping(value = "/req5",params ={"name=jshand"} )
public void req5(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("用于支持post请求");
PrintWriter out = response.getWriter();
out.println("name request :"+new Date().getTime());
out.flush();
out.close();
}
5.3.3.4. param1!=value1: 表示请求如果包含名为 param1 的请求参数且值不能等于value1;参数可以不传
java
//请求路径中如果传递参数name并且值不等于jshand,可以不传name参数
//http://127.0.0.1:8080/springmvc/req6?name=jshand 错误
//http://127.0.0.1:8080/springmvc/req6?name=jshand112 正确
//http://127.0.0.1:8080/springmvc/req6? 正确
@RequestMapping(value = "/req6",params ={"name!=jshand"} )
public void req6(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("用于支持post请求");
PrintWriter out = response.getWriter();
out.println("name request :"+new Date().getTime());
out.flush();
out.close();
}
5.3.4. headers
java
//http://127.0.0.1:8080/springmvc/req7 火狐浏览器(演示机器)
// @RequestMapping(value = "/req7" )
@RequestMapping(value = "/req7",headers ={"User-Agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/73.0" } )
public void req7(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("用于支持火狐请求");
PrintWriter out = response.getWriter();
out.println("FireFox request :"+new Date().getTime());
out.flush();
out.close();
}
5.4. RequestMapping的变种
@PostMapping 相当于是 @RequestMapping(method = {RequestMethod.POST})
@GetMapping 相当于是 @RequestMapping(method = {RequestMethod.GET})
java
@GetMapping(value = "/get_mapping" )
public void getMapping(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("doGet 请求成功 ");
PrintWriter out = response.getWriter();
out.println("Get request :"+new Date().getTime());
out.flush();
out.close();
}
@PostMapping(value = "/post_mapping" )
public void postMapping(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("doPost 请求成功 ");
PrintWriter out = response.getWriter();
out.println("Post request :"+new Date().getTime());
out.flush();
out.close();
}
