RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上
-
- 作用在类上:第一级的访问目录
-
- 作用在方法上:第二级的访问目录
-
- 细节:路径可以不编写 / ,表示应用的根目录开始
只要路径不重复,一级二级目录就可以按需添加
package com.qcby.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
@RequestMapping("/study")//二级目录
public String study(){
System.out.println("study");
//返回suc.html的界面
return "suc";
}
}
RequestMapping的属性
- path 指定请求路径的url
- value value属性和path属性是一样的
- mthod 指定该方法的请求方式
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
@RequestMapping(path = "/save",method = {RequestMethod.GET})
public String save(){
System.out.println("保存角色...");
//返回suc.html的界面
return "suc";
}
@RequestMapping(value = "/delete")
public String delete(){
System.out.println("删除角色...");
//返回suc.html的界面
return "suc";
}
}
RequestMapping的请求参数绑定
(1). 绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
方法一:通过方法形参来直接绑定前端传入的参数
- 把前端表单提交的请求参数,直接和控制器中方法的形参进行绑定
- 要求:提交表单的name和函数的参数的名称是相同的
方法二:通过实体类属性封装前端传入的数据
- 把前端表单提交的请求参数,和实体类的属性进行绑定
- 控制器的方法的参数是实体类
- 实体类的属性要和表单的name一致
方法三:在控制器内写servlet来操作前端的参数
(2). 支持的数据类型
-
- 基本数据类型和字符串类型
-
- 实体类型(JavaBean)
-
- 集合数据类型(List、map集合等)
基本数据类型和字符串类型
-
提交表单的name和参数的名称是相同的
-
区分大小写
实体类型(JavaBean)
-
提交表单的name和JavaBean中的属性名称需要一致
-
如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
给集合属性数据封装
- JSP页面编写方式:list[0].属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eA1yT7vy-1654949086953)(https://nyw-1300782054.cos.ap-nanjing.myqcloud.com/img/image-20220607154927164.png)]
举例:
前端界面
入门程序
入门入门程序
通过提交形参绑定前端参数
通过实体类的属性绑定前端参数
1.通过方法形参来绑定前端传入的参数
package com.qcby.controller;
import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
//以下为参数绑定
//1.通过函数形参直接绑定参数来进行请求,这里的形参和前台提交的参数要保持一致,否则无法识别
@RequestMapping(path ="/bindPara",method= {RequestMethod.GET})
public String bind(String name,String password){
System.out.println(name);
System.out.println(password);
return "suc";
}
//2.把前台的参数封装成一个实体类的属性,推荐使用
@RequestMapping(path ="/bindClass",method= {RequestMethod.GET})
public String bind(User user){
System.out.println(user.toString());
return "suc";
}
}
2.通过实体类属性封装前端传入的数据
建议使用,这样可以使用别的实体类的属性,以及方便和dao层(Mybatis)做数据交互
User类
package com.qcby.model;
public class User {
private String name;
private String password;
private Account account;
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", password='" + password + ''' +
", account=" + account +
'}';
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
public String getpassword() {
return password;
}
public void setpassword(String password) {
this.password = password;
}
}
Account类
package com.qcby.model;
public class Account {
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
private Double money;
@Override
public String toString() {
return "Account{" +
"money='" + money + ''' +
'}';
}
}
Controller层方法
package com.qcby.controller;
import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
//2.把前台的参数封装成一个实体类的属性,推荐使用
@RequestMapping(path ="/bindClass",method= {RequestMethod.GET})
public String bind(User user){
System.out.println(user.toString());
return "suc";
}
}
3.通过Servlet操作前端传入的数据
Controller中虽然承担servlet的作用,当也可以在控制器中使用servlet,只需要导入对应的包就好
package com.qcby.controller;
import com.qcby.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
//使用servlet
//第一必须导入servlet对应的jar包
@RequestMapping("/myServlet")
public String myServlet(HttpServletRequest request, HttpServletResponse response){
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name +" "+ age);
return "suc";
}
}
不常用的注解
1.RequestParam注解
作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性
- value:请求参数中的名称
- required:请求参数中是否必须提供此参数,默认值是true。true:表示这个值必须提供,false:表示这个值可以不提供
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/dept")
public class DeptController {
@RequestMapping("/save")
public String save(@RequestParam(value = "username",required = false) String name){
System.out.println(name);
return "suc";
}
}
2. RequestBody注解
作用:用于获取请求体的内容(注意:get方法不可以,请求体就是post方式提交的数据集合)
属性
- required:是否必须有请求体,默认值是true。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/dept")
public class DeptController {
@RequestMapping("/save")
public String save(@RequestParam(value = "username",required = false) String name){
System.out.println(name);
return "suc";
}
@RequestMapping("/save2")
public String save2(@RequestBody String body){
System.out.println(body);
return "suc";
}
}
RestFul风格
1.概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
传统的地址 http://baidu.com/key = value RestFul风格的地址 http://baidu.com/value
2.功能
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。
**传统方式操作资源:**通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
**使用RestFul操作资源:**可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
相比于传统方式使用链接来访问请求,Resful可以通过使用通过不同的请求方式来达到不同的效果
3.基本使用
①:传统的方式
controller
@Controller()
@RequestMapping("/rest")
public class RestFulController {
@RequestMapping("/test.do")
public String test(int a, int b, Model model){
int rust = a + b;
model.addAttribute("msg","结果="+rust);
// 配置了视图解析器后,写法
return "suc";
}
}
访问的url
http://localhost:8080/SpringMVC/rest/test.do?a=1&b=1
②:RestFul风格
controller
//映射访问路径
@RequestMapping("/commit.do/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){
String result = p1+p2;//p2是字符串会自动拼接
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "suc";
}
访问的url
http://localhost:8080/SpringMVC/rest/commit.do/1/1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0rG9i3S-1654949086961)(https://nyw-1300782054.cos.ap-nanjing.myqcloud.com/img/image-20220607165126034.png)]
4.使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
我们来测试一下:
//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
model.addAttribute("msg", "hello!");
return "test";
}
我们使用浏览器地址栏进行访问默认是Get请求,会报错405:如果将POST修改为GET则正常了
Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个:
@GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping
上面的注解都是组合注解的简写
@GetMapping 是一个组合注解,平时使用的会比较多! 它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。 @PostMapping是一个组合注解 它所扮演的是 @RequestMapping(method =RequestMethod.POST) 的一个快捷方式。



