05-Request
1. @RequestParam
- 紧耦合方式(了解)
DispatcherServlet
中的service()
直接将此次请求的Request对象传递给单元方法。必须在单元方法上声明形参HttpServletRequest
- 解耦合方式(熟练)
DispatcherServlet
中的service()
将请求数据从Request对象中获取出来。单元方法上直接声明对应的形参进行接收- 形参名必须和请求数据键名一致,
DispatcherServlet
根据形参名作为key获取请求数据
/**
* HttpServletRequest获取参数。紧耦合参数注入
*/
@RequestMapping("/httpServletRequest")
public String httpServletRequest(HttpServletRequest req, HttpServletResponse resp) {
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
System.out.println("name = " + name);
System.out.println("pwd = " + pwd);
return name + ", " + pwd;
}
/**
* mvc获取参数。解耦合参数注入
* 1. 形参名必须和实参名一致
* 2. 不一致用`@RequestParam`获取
* 3. 类型自动转换
*/
@RequestMapping("/mvc")
public String mvc(String name, @RequestParam("password") Integer pwd) {
System.out.println("name = " + name);
System.out.println("pwd = " + pwd);
return name + ", " + pwd;
}
<form action="httpServletRequest" method="get">
<input type="text" name="name"/>
<input type="text" name="pwd"/>
<input type="submit" value="httpServletRequest">
</form>
<hr/>
<form action="mvc" method="get">
<input type="text" name="name"/>
<input type="text" name="password"/>
<input type="submit" value="mvc">
</form>
2. POJO接收参数
/*
* 1. 入参名和POJO属性名一致
* 2. SpringMVC底层通过反射setter()给pojo属性赋值
*/
@RequestMapping("/pojo")
public String pojo(Person person, Pet pet) {
System.out.println("person = " + person);
System.out.println("pet = " + pet);
return person.toString() + pet.toString();
}
<form action="pojo" method="post">
<p>姓名:<input type="text" name="pname" value="ooxx"></p>
<p>年龄:<input type="text" name="page" value="18"></p>
<p>性别:
<input type="radio" name="gender" value="1">男
<input type="radio" name="gender" value="0">女
</p>
<p>爱好:
<input type="checkbox" name="hobby" value="1"> 篮球
<input type="checkbox" name="hobby" value="2"> 足球
<input type="checkbox" name="hobby" value="3"> 羽毛球
</p>
<p>生日:
<input type="text" name="birthday" value="1994-10-18">
</p>
宠物:
<p>
名字:<input type="text" name="petName" value="petName">
类型:<input type="text" name="petType" value="petType">
</p>
宠物2:
<p>
名字:<input type="text" name="pet.petName" value="pet.petName">
类型:<input type="text" name="pet.petType" value="pet.petType">
</p>
<input type="submit" value="pojo">
</form>
@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
private String pname;
private String page;
private String gender;
private String[] hobby;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private Pet pet;
private List<Pet> pets;
private Map<String, Pet> petMap;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Pet {
private String petName;
private String petType;
}
3. 日期类型转换
1. 注解
@DateTimeFormat(pattern = "yyyy-MM-dd")
可以用于形参、类的属性上
@RequestMapping("/pojo")
public String pojo(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
System.out.println("date = " + date);
return "index.jsp";
}
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
2. 转换器
package com.listao.mvc.util;
public class StringToDateConverter implements Converter<String, Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date convert(String source) {
Date date;
try {
date = dateFormat.parse(source);
} catch (ParseException e) {
throw new RuntimeException("日期转换异常");
}
return date;
}
}
spring_mvc.xml
中配置转换器
<!-- 数据转换工厂 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 配置类型转换器 -->
<property name="converters">
<array>
<!-- 注入自定义转换器对象 -->
<bean class="com.listao.servlet.util.StringToDateConverter"/>
</array>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
4. 集合
List, Map
必须嵌套在对象中
/**
* 1. List<String>前必须@RequestParam注解
* 2. List<Pojo>不可用
*/
@RequestMapping("/listStr")
// public String list(@RequestParam List<Pet> pets) {
public String list(@RequestParam List<String> pets) {
System.out.println("pets = " + pets);
return pets.toString();
}
@RequestMapping("/container")
public String container(Person person) {
System.out.println("person = " + person);
return person.toString();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
private String pname;
private String page;
private String gender;
private String[] hobby;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private Pet pet;
private List<Pet> pets;
private Map<String, Pet> petMap;
}
<form action="container" method="post">
List:
<p>
宠物1:名字:<input type="text" name="pets[0].petName" value="list1">
类型:<input type="text" name="pets[0].petType" value="list1">
</p>
<p>
宠物2:名字:<input type="text" name="pets[1].petName" value="list2">
类型:<input type="text" name="pets[1].petType" value="list2">
</p>
Map:
<p>
宠物1:名字:<input type="text" name="petMap['a'].petName" value="map1">
类型:<input type="text" name="petMap['a'].petType" value="map1">
</p>
<p>
宠物2:名字:<input type="text" name="petMap['b'].petName" value="map2">
类型:<input type="text" name="petMap['b'].petType" value="map2">
</p>
<input type="submit" value="container">
</form>
5. 编码问题
1. GET
- 增加
URIEncoding="utf-8"
,不过Tomcat9已经自行解决
<!-- URIEncoding="utf-8" -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
URIEncoding="utf-8"
/>
2. POST
web.xml
中配置编码过滤器
<!-- SpringMVC提供字符编码过滤器 -->
<filter>
<filter-name>encFilter</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>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6. postman
1. x-www-form-urlencoded
$("#btn").click(function () {
var jsonObj = {pname: "jsonObj", petName: "petName"};
$.ajax({
type: "post",
url: "requestBody",
data: jsonObj,
})
})
@RequestMapping("/requestBody")
public String requestBody(Person person, Pet pet) {
// public String requestBody(@RequestBody Person person, Pet pet) {
System.out.println("person = " + person);
System.out.println("pet = " + pet);
return person + " ------- " + pet;
}
2. application/json
$("#btn").click(function () {
var jsonObj = {pname: "jsonObj", petName: "petName"};
$.ajax({
type: "post",
url: "requestBody",
data: JSON.stringify(jsonObj),
contentType: "application/json",
})
})
// 只有 @RequestBody 修饰形参可以接收请求参数
@RequestMapping("/requestBody")
// public String requestBody(Person person, Pet pet) {
public String requestBody(@RequestBody Person person, Pet pet) {
System.out.println("person = " + person);
System.out.println("pet = " + pet);
return person + " ------- " + pet;
}
3. form-data
$("#btn").click(function () {
var formData = new FormData();
formData.append('pname', 'formData')
formData.append('petName', 'petName')
$.ajax({
type: "post",
url: "requestBody",
data: formData,
processData: false,
contentType: false,
mimeType: "multipart/form-data",
})
})
@RequestMapping("/requestBody")
public String requestBody(Person person, Pet pet) {
// public String requestBody(@RequestBody Person person, Pet pet) {
System.out.println("person = " + person);
System.out.println("pet = " + pet);
return person + " ------- " + pet;
}