SpringMVC 获得请求数据
1.1 获得请求参数
客户端请求参数的格式是:name=value&name=value… …
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
(1)基本类型参数
(2)POJO类型参数
(3)数组类型参数
(4)集合类型参数
1.2 获得基本类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
例:http://localhost:8080/quick?username=zhangsan&age=12
@RequestMapping("/quick")
@ResponseBody
public void quickMethod9(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
输出结果:zhangsan
12
1.3 获得POJO类型参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
http://localhost:8080/quick1?name=zhangsan&age=12
//controller层
public class User {
private String username; private int age; getter/setter…
}
@RequestMapping("/quick1")
@ResponseBody
public void quickMethod10(User user) throws IOException { System.out.println(user);
}
//pojo层
package com.buka.pojo;
public class User {
private int age;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name+" "+age;
}
}
输出结果:zhangsan 12
1.4 获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
http://localhost:8080/quick2?strs=111&strs=222&strs=333
@RequestMapping("/quick11")
@ResponseBody
public void quickMethod11(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
1.5 获得集合类型参数
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以 获得集合参数时,要将集合参数包装到一个POJO中才可以前端
<form action="${pageContext.request.contextPath}/quick3" >
名 <input type="text" name="userList[0].name"><br>
<%-- 这的名必须和POJO里定义的Set方法后面的名字一样--%>
岁<input type="text" name="userList[0].age"><br>
名<input type="text" name="userList[1].name"><br>
岁<input type="text" name="userList[1].age"><br>
<input type="submit" value="提交"><br>
</form>
后端
@RequestMapping("quick3")
@ResponseBody
public void quick8(UserList userList) {
System.out.println(userList.getUserList());
}
pojo层user和上面user一致
新增UserList
package com.buka.pojo;
import java.util.List;
public class UserList {
public List<User>userList;
public List<User> getList() {
return userList;
}
public void setList(List<User> list) {
this.userList = list;
}
@Override
public String toString() {
return "UserList{" +
"userList=" + userList +
'}';
}
}
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。
前端
<script>
//模拟数据
var userList = new Array(); userList.push({username: "zhangsan",age: "20"});
userList.push({username: "lisi",age: "21"});
$.ajax({
type: "POST",
url: "/quick13",
data: JSON.stringify(userList),
contentType : 'application/json;charset=utf-8'
});
</script>
@RequestMapping("/quick13")
@ResponseBody
public void quickMethod13(@RequestBody List<User> userList) throws
IOException {
System.out.println(userList);
}
1.6 请求数据乱码问题
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
写在web.xml里
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.7 参数绑定注解@requestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。
例:
<form action="${pageContext.request.contextPath}/quick1" method="post">
<input type="text" name="name"><br>
<input type="submit" value="提交"><br>
</form>
@RequestMapping("/quick1")
@ResponseBody
public void quickMethod14(@RequestParam("name") String username) throws
IOException {
System.out.println(username);
}
注解@RequestParam还有如下参数可以使用:
value:与请求参数名称
required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@RequestMapping("/quick14")
@ResponseBody
public void quickMethod14(@RequestParam(value="name",required =false,defaultValue = "bk") String username) throws IOException {
System.out.println(username);
}
@PathVariable和@RequestParam的区别
[@PathVariable]和 [@RequestParam]的主要区别在于它们在 [URL]中处理参数的位置和方式不同。
- 位置和用途:
- @PathVariable 用于从 URL 路径中提取变量值。它通常用于 GET 和 DELETE 请求,其中参数直接作为 URL 路径的一部分(例如,
/resource/{id}
中的{id}
)。这些参数是 URL 路径的一部分,因此它们的值是静态的,不会随请求变化。12 - @RequestParam 用于从请求参数中获取数据。它通常用于 POST、PUT 和 PATCH 请求,其中请求体可能包含动态参数(尽管也可以用于 GET 请求的查询字符串中)。这些参数是动态的,可以随请求变化。
- @PathVariable 用于从 URL 路径中提取变量值。它通常用于 GET 和 DELETE 请求,其中参数直接作为 URL 路径的一部分(例如,
- 参数处理:
- @PathVariable 不需要问号(?)来传递参数,而是直接将参数嵌入 URL 路径中。它没有默认值参数(defaultValue),因为路径参数通常是必需的。
- @RequestParam 需要问号(?)来分隔 URL 和查询字符串,其中包含要传递的参数。它支持默认值参数(defaultValue),当请求中没有提供该参数时,将使用默认值。14
总结来说,选择使用哪个注解取决于你的需求:如果你需要从 URL 路径中提取静态参数,应使用 @PathVariable
;如果你需要从请求体或查询字符串中获取动态参数,应使用 @RequestParam
。
1.8 获得Restful风格的参数
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务
器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
Restful风格的请求是使用“url+请求方式”表示一次请求的目的,HTTP 协议里面四个表示操作方式的动词如下:
GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源
Restful风格的注解:
@RestController
@GetMapping = @RequestMapping(method = RequestMethod.GET)
@PostMapping = @RequestMapping(method = RequestMethod.POST)
@PutMapping = @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)
@RestController 与 @Controller 区别?
@Controller:定义传统的Spring MVC控制器。 @Controller注解的类中的方法返回的通常是视图的名称或ModelAndView对象,这些返回值将由Spring MVC的视图解析器用来渲染最终的视图。
@RestController:定义REST风格的Web服务控制器。它是@Controller和@ResponseBody的组合。 @RestController注解的类中的方法可以直接返回业务数据,Spring MVC会自动将这些数据序列化为JSON或XML格式的HTTP响应体。
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
http://localhost:8080/quick19/zhangsan
@RequestMapping("/quick19/{name}")
@ResponseBody
//这里面的Pathvariable功能和RequestParam一样,但是RequestParam是把{name}当做路由了,Pathvariable是将他当成值
public void quickMethod19(@PathVariable(value = "name",required = true) String name){
System.out.println(name);
}
输入url:
输出hello
我们看下图第二种, 他会
报错
\color{red}报错
报错,他将{name}字符串看成了路由,你需要将类上面的 @Controller改为@RestController