4. SpringMVC 获得请求数据
4.1 获得请求参数
客户端请求参数的格式(使用GET方法时,在URI后加上参数即可):?name=value&name=value…
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收以下类型的参数:
- 基本类型参数
- POJO类型参数
- 数组类型参数
- 集合类型参数
4.2 获得基本类型参数
Controller中的业务参数名称要与请求参数的name一致,参数值会自动映射匹配
http://localhost:8080/user/save10?username=JackiePaper&age=8
@RequestMapping("/save10")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save10(String username, int age) throws IOException {
System.out.println(username + " " + age);
}
4.3 获得POJO类型的参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配
http://localhost:8080/user/save10?username=JackiePaper&age=8
public class User {
private String username;
private int age;
getter/setter...
}
@RequestMapping("/save11")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save11(User user) throws IOException {
System.out.println(user);
}
4.4 获得数组类型参数
数组类型参数指的是名称一样值类型相同但是具体内容不同的一组数据。Controller中的业务方法的数组参数的属性名与请求参数的name一致,参数值会自动映射匹配
http://localhost:8080/user/save12?strs=jodjaf&strs=iji11&strs=19938
@RequestMapping("/save12")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save12(String[] strs) throws IOException {
System.out.println(Arays.asList(strs));
}
4.5 获得集合类型参数
1.使用表单提交
获得集合参数时,要将集合参数包装到一个POJO对象中
<form action="${pageContext.request.contextPath}/user/save13" method="post">
<%--表面是第几个User的username和age--%>
第一个元素:<br/>
<input type="text" name="userList[0].username"><br/>
<input type="text" name="userList[0].age"><br/>
第二个元素:<br/>
<input type="text" name="userList[1].username"><br/>
<input type="text" name="userList[1].age"><br/>
<input type="submit"/><br/>
</form>
@RequestMapping("/save13")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save13(UserList userList) throws IOException {
System.out.println(userList);
}
2.使用ajax提交
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"/>
<script>
var userList = new Array();
userList.push({username:"nisha", age:54});
userList.push({username:"ana", age:12});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/user/save14",
data:JSON.stringify(userList),
contentType:"application/json;charset=UTF-8"
})
</script>
@RequestMapping("/save14")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save14(@RequestBody List<User> userList) throws IOException {
System.out.println(userList);
}
-
tips:开启静态资源访问的两种方法
<!--开放资源访问--> <mvc:resources mapping="/资源类型/**" location="/所在文件/" /> <!--如果springMVC找不到资源,就交由原始容器寻找--> <mvc:default-servlet-handler/>
4.6 请求乱码问题
当使用POST请求时,数据出现乱码,可以设置一个过滤器来进行编码的过滤
<!--配置全局过滤器的filter-->
<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>
4.7 参数绑定注解@RequestParam
当请求的参数名称与Controller的业务方法参数(与通过方法传递的形参名可以不一致)名称不一致时,需要通过@requestParam注解显示绑定
<form action="${pageContext.request.contextPath}/user/save15" method="post">
<input type="text" name="username"><br/>
<input type="text" name="age"><br/>
<input type="submit"/><br/>
</form>
@RequestMapping("/save15")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save15(@RequestParam("name") String username, @RequestParam("age") int age) throws IOException {
System.out.println(username + " " + age);
}
注解@RequestParam还可以使用以下参数:
- value:与请求参数名称
- required:在指定的请求参数是否必须必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值
@RequestMapping("/save15")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save15(@RequestParam(value="name", required=false, defaultValue="itcast") String username, @RequestParam("age") int age) throws IOException {
System.out.println(username + " " + age);
}
4.8 获得Restful风格的参数
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简介,更远层次,更易于实现缓存机制等。
Restful风格的请求是使用 “url + 请求方式” (如/user/1,表示对id = 1的user进行相应的操作)表示一次请求的目的,HTTP协议里四个表示操作的方式如下:
- GET:用于获取资源
- GET:由于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中可以使用@PathVariable注解进行占位符的匹配获取工作
http://localhost:8080/user/save17/Jackie
@RequestMapping("/save17/{name}")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save17(@PathVariable(value = "name", required = true) String username) throws IOException {
System.out.println(username);
}
4.9 自定义类型转换器
自定义类型转换器的步骤(以日期格式转换为例):
1)定义转换器类实现Converter接口
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;
}
}
2)在配置文件中声明转换器
<bean id = "conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.springit.mvc.converter.DateConverter"></bean>
</list>
</property>
</bean>
3)在中引用转换器
<mvc:annotation-driven conversion-service="conversionService"/>
4.10 获得请求头
1. @RequestHeader
使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeader注解属性如下:
- value:请求头名称
- required:是否必须携带此请求头
@RequestMapping("/save20")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save20(@RequestHeader(value="RequestHeader", required = true) String = request_header) throws IOException {
System.out.println(request_header);
}
2. @CookieValue
使用@CookieValue可以获得指定Cookie值
@CookieValue注解的属性如下:
- value:指定cookie名称
- required:是否必须携带此cookie
@RequestMapping("/save21")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
public void save21(@CookieValue(value="JSESSIONID", required = true) String jessionId) throws IOException {
System.out.println(jessionId);
}
4.11 文件上传
1. 文件上传客户端三要素
- 表单项type=“file”
- 表单提交方式是post
- 表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”
<form action="${pageContext.request.contextPath}/" method="POST" enctype="multipart/form-data">
名称:<input type="text" name="name"><br/>
文件:<input type="file" name="file"><br/>
<input type="submit" value="提交"><br>
</form>
2. 文件上传原理
- 当form表单修改为多部分表单时,request.getParameter()失效
- enctype="application/x-www-form-urlencoded"时,form表单的正文内容格式为:key=value&key=value&key=value … …
- 当表单的enctype取值为multipart/form-data时,请求正文内容变为多部分形式
3. 单文件上传步骤
1)导入fileupload和io坐标
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>x.x</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>x.x.x</version>
</dependency>
2)配置文件上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件上传总大小-->
<property name="maxUploadSize" value="5242800" />
<!--上传单个文件的大小-->
<property name="maxUploadSizePerFile" value="102400" />
<!--上传文件的编码类型-->
<property name="defaultEncoding" value="UTF-8" />
</bean>
3)编写文件上传代码
@RequestMapping("/save22")
@ResponseBody //告知SpringMVC框架 不进行页面跳转 直接进行数据返回响应
//参数名称必须与上传表单项的名称匹配
public void save22(String name, MultipartFile uploadFile) throws IOException {
//获得文件名称
String originalFilename = uploadFile.getOriginalFilename();
//保存文件至指定存储介质的某一位置
uploadFile.transferTo(new File("D:\\upload\\" + originalFilename));
}
4. 多文件上传
- 在单文件上传的基础上加入多组参数
- 表单中文件名称相同,单个表单名称,使用数组接收