RequestMapping
基本使用
@RequestMapping 注解可以指定控制器/处理器的某个方法的请求的 url,RequestMapping : 请求映射

@RequestMapping 注解其它使用方式
@RequestMapping 可以修饰方法和类
说明
@RequestMapping 注解可以修饰方法,还可以修饰类,当同时修饰类和方法时, 请求的 url 就是组合 /类请求值/方法请求值。
应用实例
创建 UserHandler.java
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author LiAng
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器
public class UserHandler {
/**
* 1. method=RequestMethod.POST: 表示请求 buy 目标方法必须是 post
* 2. RequestMethod 四个常用选项 POST, GET, PUT, DELETE
* 3. SpringMVC 控制器默认支持 GET 和 POST 两种方式
* 4. buy() 方法请求的url:http://localhost:8080/工程路径/user/buy
* @return
*/
@RequestMapping(value = "/buy", method = RequestMethod.POST)
public String buy() {
System.out.println("购买商品");
return "success";
}
}
创建 web\WEB-INF\pages\success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>操作成功!</h1>
</body>
</html>
创建 web\request
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>购买商品</title>
</head>
<body>
<h1>购买商品</h1>
<%--
action="user/buy" 对应url:http://localhost:8080/工程路径/user/buy
--%>
<form action="user/buy" method="post">
购买人:<input type="text" name="username"><br>
够买量:<input type="text" name="nums"><br>
<input type="submit" value="购买">
</form>
</body>
</html>
完成测试
@RequestMapping 可以指定请求方式
说明
@RequestMapping 还可以指定请求的方式(post/get/put/delete..),请求的方式需要和指定的一样,否则报错。
SpringMVC 控制器默认支持GET和POST两种方式,也就是你不指定 method,可以接收 GET 和 POST 请求。
应用实例

当明确指定了 method,则需要按指定方式请求,否则会报错,比如:

@RequestMapping 可指定 params 和 headers 支持简单表达式
说明
- param1:表示请求必须包含名为 param1 的请求参数
- !=param1:表示请求不能包含名为 param1 的请求参数
- param1 != value1:表示请求包含名为 param1 的请求参数,但其值不能为 value1
- {"param1=value1", "param2"}:请求必须包含名为 param1 和 param2 的两个请求参数, 且 param1 参数的值必须为 value1
应用实例
修改 UserHandler.java
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author LiAng
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器
public class UserHandler {
/**
* 1. params="bookId" 表示请求该目标方法时,必须给一个 bookId参数,值没有限定
* 2. search(String bookId):表示请求目标方法时,携带的 bookId=100,就会将请求携带的 bookId对应的
* 值100 赋给 String bookId
*/
@RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId= " + bookId);
return "success";
}
}
修改 request.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>购买商品</title>
</head>
<body>
<h1>购买商品</h1>
<%--
action="user/buy" 对应url:http://localhost:8080/工程路径/user/buy
--%>
<form action="user/buy" method="post">
购买人:<input type="text" name="username"><br>
够买量:<input type="text" name="nums"><br>
<input type="submit" value="购买">
</form>
<hr><h1>演示 params 的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
</html>
完成测试
小细节说明
需要有 bookId 参数,并且值为 100,否则报错
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author LiAng
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器
public class UserHandler {
/**
*
* 1. params="bookId" 表示请求该目标方法时,必须给一个 bookId参数,值没有限定
* 2. search(String bookId):表示请求目标方法时,携带的 bookId=100,就会将请求携带的 bookId对应的
* 值100 赋给 String bookId
* 3. params = "bookId=100" 表示必须给一个bookId参数, 而且值必须是100
* @return
*/
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId= " + bookId);
return "success";
}
}

需要有 bookId 参数,并且值不为 100,否则报错
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author LiAng
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器
public class UserHandler {
/**
*
* 1. params="bookId" 表示请求该目标方法时,必须给一个 bookId参数,值没有限定
* 2. search(String bookId):表示请求目标方法时,携带的 bookId=100,就会将请求携带的 bookId对应的
* 值100 赋给 String bookId
* 3. params = "bookId!=100" 表示必须给一个bookId参数, 而且值必须不为100
* @return
*/
@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId= " + bookId);
return "success";
}
}

@RequestMapping 支持 Ant 风格资源地址
说明
- ?:匹配文件名中的一个字符
- *:匹配文件名中的任意字符
- **:匹配多层路径
- Ant 风格的 url 地址举例
/user/*/createUser:匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL
/user/**/createUser:匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL
/user/createUser??:匹配 /user/createUseraa、/user/createUserbb 等 URL
应用实例
修改 UserHandler.java
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author LiAng
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器
public class UserHandler {
/**
* 要求: 可以配置 /user/message/aa, /user/message/aa/bb/cc
* @RequestMapping(value = "/message/**") /** 可以匹配多层路径
*/
@RequestMapping(value = "/message/**")
public String im() {
System.out.println("发送消息");
return "success";
}
}
修改 request.jsp
<hr><h1>演示 Ant 风格的请求资源方式 </h1>
<a href="user/message/aa">发送消息 1</a><br>
<a href="user/message/aa/bb/cc">发送消息 2</a><br>
完成测试
@RequestMapping 可配合 @PathVariable 映射 URL 绑定的占位符
说明
- @RequestMapping 还可以配合 @PathVariable 映射 URL 绑定的占位符。
- 这样就不需要在 url 地址上带参数名了,更加的简洁明了。
比如:我们的前端页面是 这样的,kristina 和 300 是参数值
<hr><h1>占位符的演示</h1>
<a href="user/reg/kristina/300">占位符的演示</a>
应用实例
修改 UserHandler.java
//要求: 我们希望目标方法获取到 username 和 userid, value="/xx/{username}" - @PathVariable("username")..
//前端页面: <a href="user/reg/kristina/300">占位符的演示</a>
//(value = "/reg/{username}/{userid}"): 表示kristina->{username} 300=>{userid}
@RequestMapping(value = "/reg/{username}/{userid}")
public String register(@PathVariable("username") String name, @PathVariable("userid") String id) {
System.out.println("接收到参数--" + "username= " + name + "--" + "usreid= " + id);
return "success";
}
修改 request.jsp
<hr><h1>占位符的演示</h1>
<a href="user/reg/kristina/300">占位符的演示</a>
完成测试
注意事项和细节
1.映射的 URL,不能重复,否则发布项目时会报错
@RequestMapping(value = "/hi")
public String hi() {
System.out.println("hi");
return "success";
}
@RequestMapping(value = "/hi")
public String hi2() {
System.out.println("hi");
return "success";
}

2.各种请求的简写形式
@RequestMapping(value = "/buy",method = RequestMethod.POST) 等价 @PostMapping(value = "/buy")
简写方式一览: @GetMapping @PostMapping @PutMapping @DeleteMapping
//@RequestMapping(value = "/buy", method = RequestMethod.POST)
@PostMapping(value = "/buy")
public String buy() {
System.out.println("购买商品");
return "success";
}
3.如果我们确定表单或者超链接会提交某个字段数据比如(email),要求提交的参数名和目标方法的参数名保持一致,否则是null*
/**
* hello3(String email): 如果我们的请求参数有 email=xx, 就会将传递的值,赋给String email
* ,要求名称保持一致, 如果不一致,那么接收不到数据, 而是null
* @param email
* @return
*/
@GetMapping(value = "/hello3")
public String hello3(String email) {
System.out.println("hello3 " + email);
return "success";
}
作业
编写一个表单,以 Post 提交 Computer 信息,后端编写 ComputerHandler,可以接收到信息。

<h1>电脑信息</h1>
<form action="computer/info" method="post">
品牌:<input type="text" name="brand"><br>
价格:<input type="text" name="price"><br>
数量:<input type="text" name="nums"><br>
<input type="submit" value="提交">
</form>
package com.lzw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author LiAng
*/
@RequestMapping("/computer")
@Controller
public class ComputerHandler {
//这里一定要注意,info方法的形参名需要和请求的参数名一致
@PostMapping("/info")
public String info(String brand, String price, String nums){
System.out.println("电脑信息 brand = " + brand + ",price = " + price + ",nums = " + nums);
return "success";
}
}
