Spring MVC接受请求
● @RequestMapping 它的作用就是与请求相匹配,如果匹配上了,所修饰的方法才会被执行。
例如:
@RequestMapping(path = “/admin”)发过来的请求就要找这个admin的路径。
● 在日常的使用过程中,我们只要关注两个属性就可以了:
◆ value :(它是 path 的别名)意为请求的路径,这个路径相对于应用的上下文。类型是 一个 String[] ,可以理解为数组。也就是说它可以匹配多个请求路径。
例如: @RequestMapping(value = {"/test","/test2"}),通过test和test2都是可以访问到的。
◆ method: 请求的方法。我们知道 HTTP 协议的请求方式是有 GET 和 POST。或者使用
@GetMapping, @PostMapping
这个两个标签替换@RequestMapping标签,他们就分别表示了GET和POST的请求。
当前的请求只有与@RequestMapping 上指定的属性都匹配的时候,才会执行它所标注的方法。
下面分析几个例子:
①:@RequestMapping(value = “/admin”)请求的方式是没有限制的。即可以是 GET 也可以是 POST,还能是其它的几个。
②:@RequestMapping(value = “/admin”, method = RequestMethod.GET) method给出了请求路径。请求方式只能是 GET。
③:@RequestMapping(value="/admin", method={ RequestMethod.GET , RequestMethod.POST}) method是String[]型的,所以也可以定义多个,这定义的请求方式就只能是 GET 或者 POST。
④:@GetMapping(value = “/test”)接受的都是GET的请求
⑤:@PostMapping(value = “/test”)接受的都是POST的请求
获取请求数据
我们编写处理器方法的目的,就是为了处理客户端提交的数据,而客户端的提交是按照 HTTP 协议报文格式来提交的,下面我们分析一段常见的 HTTP 提交的报文来理解报文的各个部分与处理器方法参数的对应关系:
先大概写个页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="admin/getAdmin?id=1&name='张三'">admin</a>
<form method="post" action="admin/getAdmin">
<input type="text" name="id">
<input type="text" name="account">
<input type="text" name="password">
<input type="text" name="birthday">
<input type="submit">
</form>
</body>
</html>
GET请求:
- 最老式的获取请求数据的方式:(不用了)
参数列表中就直接内置HttpServletRequest,HttpSession,HttpServletResponse 等对象. 使用 request 对象也可以接收
package com.wang.ssm.controller;
import com.wang.ssm.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象
@RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址
// 在类上标记映射地址时,整个应用程序中不能重复
//这两个标签是输入Spring MVC的标签内容
public class AdminController {
@Autowired//Spring的标签,表示将对象注入进来
AdminService adminService;
//SpringMVC可以将HttpServletRequest,HttpServletResponse直接注入到我们的方法当中
@GetMapping(value = "/getAdmin")
public void getAdmin(HttpServletRequest request, HttpServletResponse response){
System.out.println(request.getParameter("id"));
System.out.println(request.getParameter("name"))
}
}
点击超链接就可以获得选中这个get请求的发过来的数据:
使用SpringMVC框架中提供的方法使用
- 如果请求的数据和后端接受的名字不一样,可以用
● @RequestParam(“id”) Integer adminId
RequestParam中的是前端发来请求的键名,adminId是后端接受的命名
● @RequestHeader(“User-Agent”) String userAgent接受的请求头中的数据
package com.wang.ssm.controller;
import com.wang.ssm.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象
@RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址
// 在类上标记映射地址时,整个应用程序中不能重复
//这两个标签是输入Spring MVC的标签内容
public class AdminController {
@Autowired//Spring的标签,表示将对象注入进来
AdminService adminService;
@GetMapping(value = "/getAdmin")
public void getAdmin(@RequestParam("id") Integer adminId,
@RequestParam("name") String adminName,
@RequestHeader("User-Agent") String userAgent){
System.out.println(adminId);
System.out.println(adminName);
System.out.println(userAgent);
}
}
结果:
如果请求参的名与处理器方法的参数名称相同,那么在使用 @RequestParam 绑定的时候,可以省略参数,甚至连@RequestParam 都可 以省略:
@GetMapping(value = "/getAdmin")
public void getAdmin(Integer id, String name){
System.out.println(id);
System.out.println(name);
}
- 参数绑定与类型转换(这里采用post请求)
当请求参数比较多,通常是将这些参数放到一个实体中,然后只需要在处理器 方法上定义这个实体作为参数。HandlerAdapter 会将这个对象的实例创建出来,然后从请求参数中取出这些参数然后放到实体对象中,需要注意的是请求参数的名字需要与实体类中的属性一对一对应,只有对应的属性才会提取参数的值。
package com.wang.ssm.controller;
import com.wang.ssm.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller//表示这个类是一个控制层的类,只能在类上添加,表示Spring生成此类的对象
@RequestMapping(path = "/admin")//请求映射,表示路径,也可以添加到方法上面去,提供的是一个映射地址
// 在类上标记映射地址时,整个应用程序中不能重复
//这两个标签是输入Spring MVC的标签内容
public class AdminController {
@Autowired//Spring的标签,表示将对象注入进来
AdminService adminService;
@PostMapping(value = "/getAdmin")
public void getAdmin(Admin admin){
System.out.println(admin);
}
}
定义好封装的类:
package com.wang.ssm.model;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component(value = "admin")
public class Admin {
private Integer id;
private String account;
private String password;
@DateTimeFormat(pattern = "YYYY-MM-dd")
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Admin{" +
"id=" + id +
", account='" + account + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
'}';
}
}
也是可以从前端接受到数据的:
在这里要注意一下对时间的传递
是要在封装类中对时间定义一下格式的
@DateTimeFormat(pattern = "YYYY-MM-dd")
private Date birthday;
封装后应该就不会在日期上出现什么影响。
页面打不开或者书籍传输乱码的问题,请看这一篇: