@RequestMapping
- 💞基本使用
- 💞@RequestMapping注解其它使用方式
- 可以修饰类和方法
- 可以指定请求方式
- 可以指定params和headers支持简单表达式
- 支持Ant 风格资源地址
- 配合@PathVariable 映射 URL 绑定的占位符
- 注意事项和使用细节
- 课后作业
上一讲, 我们学习的是SpringMVC系列一: 初识SpringMVC
现在打开springmvc项目
💞基本使用
●RequestMapping
注解可以指定控制器/处理器的某个方法的请求的url.
💞@RequestMapping注解其它使用方式
可以修饰类和方法
1.说明: @RequestMapping
注解可以修饰方法, 还可以修饰类. 当同时修饰类和方法时, 请求的url 就是组合 /类请求值/方法请求值
案例
1.com.zzw.web
包下 新建UserHandler
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
/**
* 1.method=RequestMethod.POST: 表示请求buy目标方法必须是 post
* 2.RequestMethod 四个常用选项 POST, GET, PUT, DELETE[后面会详解]
* 3.SpringMVC 控制器默认支持GET和POST两种方式
*
* buy()方法请求的url: http://ip:port/工程路径/user/buy
* @return
*/
@RequestMapping(value = "/buy", method = RequestMethod.POST)
public String buy() {
System.out.println("购买.");
return "success";
}
}
2.web路径/WEB-INF/pages目录
新建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>操作成功</title>
</head>
<body>
<h1>恭喜, 操作成功~</h1>
</body>
</html>
3.web路径
下 新建request.jsp
, 测试
<body>
<%--解读
1. action="user/buy" 对应 url http://localhost:8080/工程路径/user/buy
--%>
<form action="user/buy" method="post">
购买人: <input type="text" name="username"/><br/>
购买量: <input type="password" name="nums"/><br/>
<input type="submit" value="购买">
</form>
</body>
4.访问成功
可以指定请求方式
1.说明: @RequestMapping
可以指定请求方式(post/get/put/delete..
), 请求的方式要和指定的一样, 否则报错.
2.SpringMVC
控制器默认支持GET
和POST
两种方式, 也就是你不指定method
, 可以接收GET
和POST
请求
3.应用案例
4.当你明确指定了method
, 则需要按指定方式请求, 否则会报错.
可以指定params和headers支持简单表达式
1.param1:
表示请求必须包含名为param1
的请求参数. 比如 params = "bookId"
2.!param1:
表示请求不能包含名为param1
的请求参数. 比如 params = "!bookId"
3.param1 = value1:
表示请求包含名为param1
的请求参数, 且其值必须为value1
. 比如 params = "bookId=100"
4.param1 != value1:
表示请求包含名为param1
的请求参数, 但其值不能为value1
. 比如 params = "bookId!=100"
5.{"param1=value1", "param2"}:
请求必须包含名为param1
, param2
的两个请求参数, 且param1
参数的值必须为value1
. 比如params = {"bookId=100", "price"}
案例
1.修改UserHandler.java
增加方法search
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
/**
* 解读
* 1. params="bookId" 表示请求该目标方法时, 必须给一个bookId参数, 值没有限定
* 2. search(String bookId) 表示请求目标方法时, 携带的bookId=100, 就会将请求携带的 bookId
* 对应的值, 赋给 String bookId
* @param bookId
* @return
*/
@RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId=" + bookId);
return "success";
}
}
2.修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
3.操作成功
如果bookId
改为bookIdx
, 报错
细节1:
如果需要有bookId
参数, 并且值为100
. 否则报错.
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=200">查询书籍</a>
</body>
报错
细节2:
需要有bookId参数, 并且值不为100. 否则报错.
@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)
修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
报错
支持Ant 风格资源地址
1.?: 匹配文件名中的一个字符
2.*: 匹配文件名中的任意字符
3.**: 匹配多层路径
4.举例
/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
案例
1.修改UserHandler.java
增加方法im
@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";
}
}
2.修改request.jsp
<body>
<hr><h1>演示Ant风格的请求资源方式</h1>
<a href="user/message/aa">发送消息1</a>
<a href="user/message/aa/bb/cc">发送消息2</a>
</body>
3.测试成功…
配合@PathVariable 映射 URL 绑定的占位符
1.@RequestMapping
可以配合@PathVariable
映射URL
绑定的占位符
2.这样就不需要在url
地址上带参数名了, 更加的简洁明了.
案例
1.修改UserHandler.java
增加方法register
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
/**
* 前端页面: <a href="user/reg/Kristina/300">占位符的演示</a>
* (value="/reg/{username}/{userId}"): 表示Kristina=>{username} 300=>{userId}
*
* @return
*/
@RequestMapping(value = "/reg/{username}/{userId}")
public String register(@PathVariable("username") String name,
@PathVariable("userId") int id) {
System.out.println("接收到参数--" + "username=" + name + "--" + "userId=" + id);
return "success";
}
}
2.修改request.jsp
<body>
<hr/><h1>占位符的演示</h1>
<a href="user/reg/Kristina/300">占位符的演示</a>
</body>
3.测试成功…
注意事项和使用细节
1.映射的URL
, 不能重复
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
@RequestMapping(value = "/hi")
public String hi() {
System.out.println("hi");
return "success";
}
@RequestMapping(value = "/hi")
public String hi2() {
System.out.println("hi");
return "success";
}
}
启动或重新发布时, 会报错. to { [/user/hi]}: There is already 'userHandler' bean method
2.各种简写的方式
@RequestMapping(value=“/buy”,method=RequestMethod.POST) 等价 @PostMapping(value=“/buy”)
简写方式一览: @GetMapping @PostMapping @PutMapping @DeleteMapping
案例
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
/**
* 5.@PostMapping(value="/buy") 等价 @Request(value="/buy", method=RequestMapping.POST)
* @return
*/
//@RequestMapping(value = "/buy", method = RequestMethod.POST)
@PostMapping(value = "/buy")
public String buy() {
System.out.println("购买.");
return "success";
}
}
测试request.jsp
<body>
<form action="user/buy" method="get">
购买人: <input type="text" name="username"/><br/>
购买量: <input type="password" name="nums"/><br/>
<input type="submit" value="购买">
</form>
</body>
报错
3.如果我们确定表单或者超链接会提交某个字段数据比如email
, 要求提交的参数名和目标方法的参数名保持一致.
案例
1.修改UserHandler.java
增加方法hello3
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
/**
* hello3(String email) 表示如果我们的请求参数有 email=xx, 就会将传递的值, 赋给String email
* , 要求名称保持一致, 如果不一致, 那么接收不到数据, 而是null
* @param email
* @return
*/
@RequestMapping(value = "/hello3")
public String hello3(String email) {
System.out.println("email=" + email);
return "success";
}
}
2.测试 浏览器地址栏 输入http://localhost:8080/springmvc/user/hello3?email=978964140@qq.com
, 一定要注意提交参数名和后台方法的形参名保持一致, 否则后端接收不到参数
3.如果输入一个错误的参数名, 那么后端接收不到数据
课后作业
1.熟悉SpringMVC
的执行流程图
2.熟悉@RequestMapping
注解的使用方式
3.编写一个表单, 以Post
的方式提交Computer
信息, 后端编写ComputerHandler
, 可以接收到信息.
代码实现
1.修改request.jsp
<body>
<h1>电脑信息</h1>
<form action="?" 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>
</body>
2.com.zzw.web
包下 新建ComputerHandler
@RequestMapping(value = "/computer")
@Controller
public class ComputerHandler {
//这里一定要注意, info方法的形参名需要和请求的参数名保持一致
@PostMapping(value = "/info", params = {"brand", "price", "nums"})
public String info(String brand, String price, String nums) {
System.out.println("电脑信息--brand=" + brand
+ "--price=" + price + "--nums" + nums);
return "success";
}
}
3.配置页面访问路径
<form action="computer/info" method="post">
4.测试成功…
下一讲, 我们学习SpringMVC系列三: Postman(接口测试工具)