基本类型数据
Controller 中的业务方法的参数名与请求参数的 name 保持一致,SpringMVC 自动进行匹配
@RequestMapping("/eat1")
@ResponseBody
public void eat1(String username, int age) {
System.out.println(username);
System.out.println(age);
}
通过如下请求进行测试
http://localhost:8080/user/eat1?userName=猫头夜鹰&age=3
服务端成功接受数据
POJO 类型数据
Controller 中的业务方法的 POJO 类型的属性名与请求参数的 name 保持一致,SpringMVC 自动进行匹配
User 类中含有 userName 和 age 属性
@RequestMapping("/eat2")
@ResponseBody
public void eat2(User user) {
System.out.println(user);
}
通过如下请求进行测试
http://localhost:8080/user/eat2?userName=猫头夜鹰&age=3
服务端成功接受数据
数组类型数据
Controller 中的业务方法的数组参数名与请求参数的 name 保持一致,SpringMVC 自动进行匹配
@RequestMapping("/eat3")
@ResponseBody
public void eat3(String[] food) {
System.out.println(Arrays.asList(food));
}
通过如下请求进行测试
http://localhost:8080/user/eat3?food=苹果&food=西瓜&food=菠萝
服务端成功接受数据
集合类型数据
(1)创建 VO 类,含相应的集合属性,将请求数据封装到 VO 对象中
package Entity;
import java.util.List;
public class VO {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{" + "userList=" + userList + '}';
}
}
Controller 中的业务方法的参数为相应的 VO 类型
@RequestMapping("/eat4")
@ResponseBody
public void eat4(VO vo) {
System.out.println(vo);
}
jsp 中表单如下,name 指定了将要填充的位置下标,以及该对象的具体属性,如 userList[0].userName 表示填充 VO 对象的属性 userList 的第一个元素,并填充它的 userName 为相应值
<form action="${pageContext.request.contextPath}/user/eat4">
<input type="text" name="userList[0].userName">
<input type="text" name="userList[0].age"><br>
<input type="text" name="userList[1].userName">
<input type="text" name="userList[1].age">
<input type="submit" value="提交">
</form>
(2)Ajax 指定 contentType 为 json ,通过 @RequestBody 接受集合数据
@RequestMapping("/eat5")
@ResponseBody
public void eat5(@RequestBody List<User> userList) {
System.out.println(userList);
}
Controller 中的业务方法的参数名可以任取,@RequestBody 一般用于接受 POST 请求的 application/json 类型的数据,也就是 json 格式的字符串,并自动解析生成相应 java 对象
var userList = [];
userList.push({userName: "猫头夜鹰", age: 3})
userList.push({userName: "卡比兽", age: 5})
$.ajax({
type: "POST",
url: "${pageContext.request.contextPath}/user/eat5",
data: JSON.stringify(userList),
contentType: "application/json;charset=utf-8"
})
请求数据乱码问题
在 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>
参数绑定
当请求数据的 name 与 Controller 中的业务方法的参数名不一致时,可以通过 @RequestParam 注解显式的进行参数绑定
@RequestMapping("/eat6")
@ResponseBody
public void eat6(@RequestParam("uName") String userName) {
System.out.println(userName);
}
此时请求数据的 name 可以为 uName ,示例请求如下
http://localhost:8080/user/eat6?uName=猫头夜鹰
服务端成功接受数据
对于 @RequestParam 注解,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value
- value:请求参数的 name
- required:请求参数是否必须包括,默认为 true ,为 true 时若请求数据中不含该参数会报错
- defaultValue:请求参数的默认值
RESTful 风格参数
RESTful(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,使用 POST ,DELETE ,PUT 和 GET 四种请求方式对指定的 URL 资源进行增删改查操作
RESTful 使用 url + 请求方式 表示一次请求的目的
- GET:获取
- POST:增加
- PUT:更新
- DELETE:删除
在 MVC 中使用占位符进行参数绑定,使用 @PathVariable 注解将占位符参数绑定到 Controller 中的业务方法的形参
@RequestMapping("/eat7/{name}")
@ResponseBody
public void eat7(@PathVariable(value = "name") String userName) {
System.out.println(userName);
}
通过如下请求进行测试
http://localhost:8080/user/eat7/猫头夜鹰
服务端成功接受数据
可通过 RequestMapping 对请求方法进行判断,进而调用不同的处理方法
@RequestMapping(value = "/eat7/{name}", method = RequestMethod.PUT)
@ResponseBody
public void eat7Put(@PathVariable(value = "name") String userName) {
System.out.println(userName);
}
@RequestMapping(value = "/eat7/{name}", method = RequestMethod.GET)
@ResponseBody
public void eat7Get(@PathVariable(value = "name") String userName) {
System.out.println(userName);
}
自定义类型转换器
在 SpringMVC 中,默认提供了一些常用的类型转换器,如在请求中的字符串,如果是数字,可以自动转化为 int 类型,对于一些特殊类型,需要自定义类型转换器,下面以日期类型示例
对于前端请求中的日期数据,格式不一,当后端需要用 Java 的 Date 类型接受时,则需要相应的类型转换器
(1)创建 DateConverter 类,实现 Converter 接口并重写 convert 方法
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
泛型中 String 表示传入的数据是字符串,转换后传出 Date
(2)在 spring-mvc.xml 文件中声明转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="Converter.DateConverter"/>
</list>
</property>
</bean>
(3)在 spring-mvc.xml 文件中用 <mvc:annotation-driven> 引用转换器
<mvc:annotation-driven conversion-service="conversionService"/>
测试如下:
@RequestMapping(value = "/eat8")
@ResponseBody
public void eat8(Date date) {
System.out.println(date);
}
请求日期数据
http://localhost:8080/user/eat8?date=2021-11-29
服务端成功接受数据,并转化为相应的 Date 对象
获取请求头
通过 @RequestHeader 注解可以获取请求标头信息,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value
- value:请求标头的参数名
- required:请求参数是否必须包括
@RequestMapping(value = "/eat9")
@ResponseBody
public void eat9(@RequestHeader("User-Agent") String user_agent) {
System.out.println(user_agent);
}
通过 @CookieValue 注解获得指定 Cookie 的值,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value
- value:指定 cookie 的名称
- required:此 cookie 是否必须包括
@RequestMapping(value = "/eat10")
@ResponseBody
public void eat10(@CookieValue("JSESSIONID") String jsessionId) {
System.out.println(jsessionId);
}