通过学习前面的SpringMVC 的数据相应,通过页面看到了结果,但是编程不能只通过自己看到,要通过SpringMVC 获得请求数据,通过这样请求,达到跳转页面,增加更好的效果
获得请求参数
客户端请求参数的格式是:name=value&name=value… …
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
1 基本类型参数
2 POJO类型参数
3 数组类型参数
4 集合类型参数
代码如下(示例):
//获得集合类型参数
@RequestMapping(value="/quick15")
@ResponseBody
public void save15(@RequestBody List<User> userList) throws IOException {
System.out.println(userList);
}
//获得集合类型参数
@RequestMapping(value="/quick14")
@ResponseBody
public void save14(VO vo) throws IOException {
System.out.println(vo);
}
//获得数组类型
@RequestMapping(value="/quick13")
@ResponseBody
public void save13(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
//POJO参数类型
@RequestMapping(value="/quick12")
@ResponseBody
public void save12(User user) throws IOException {
System.out.println(user);
}
//基本数据类型
@RequestMapping(value="/quick11")
@ResponseBody
public void save11(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
其中获得集合参数时,要将集合参数包装到一个POJO中才可以。
<form action="${pageContext.request.contextPath}/quick12" method="post">
<input type="text" name="userList[0].username"><br>
<input type="text" name="userList[0].age"><br>
<input type="text" name="userList[1].username"><br>
<input type="text" name="userList[1].age"><br>
<input type="submit" value="提交"><br>
form>
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js">script>
<script>
var userList = new Array();
userList.push({username: "zhangsan", age: 18});
userList.push({username: "lisi", age: 18});
$.ajax({
type: "POST",
url: "${pageContext.request.contextPath}/user/quick15",
data: JSON.stringify(userList),
contentType: "application/json;charset=utf-8"
});
script>
head>
<body>
body>
html>
注意:通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器
DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种
方式指定放行静态资源:
• 在spring-mvc.xml配置文件中指定放行的资源
• 使用
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
//多文件上传
@RequestMapping(value="/quick22")
@ResponseBody
public void save22(String username, MultipartFile uploadFile,MultipartFile uploadFile2) throws IOException {
System.out.println(username);
//获得上传文件的名称
String originalFilename = uploadFile.getOriginalFilename();
uploadFile.transferTo(new File("D:\\"+originalFilename));
String originalFilename2 = uploadFile2.getOriginalFilename();
uploadFile2.transferTo(new File("D:\\"+originalFilename2));
}
//使用@CookieValue可以获得指定Cookie的值
@RequestMapping(value="/quick21")
@ResponseBody
public void save21(@RequestHeader(value = "JSESSIONID",required = false) String jsessionID) throws IOException {
System.out.println(jsessionID);
}
//使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestMapping(value="/quick20")
@ResponseBody
public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
System.out.println(user_agent);
}
//SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入
@RequestMapping(value="/quick19")
@ResponseBody
public void save19(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
System.out.println(request);
System.out.println(response);
System.out.println(session);
}
@RequestMapping(value="/quick18")
@ResponseBody
public void save18(Date date) throws IOException {
System.out.println(date);
}
//localhost/user/quick17/zhangsan
@RequestMapping(value="/quick17/{username}")
@ResponseBody
public void save17(@PathVariable(value = "username") String username) throws IOException {
System.out.println(username);
}
@RequestMapping(value="/quick16")
@ResponseBody
public void save16(@RequestParam(value="name",required=false,defaultValue = "itcast") String username) throws IOException {
System.out.println(username);
}
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
自定义类型转换器的开发步骤:
① 定义转换器类实现Converter接口
② 在配置文件中声明转换器
③ 在中引用转换器
定义转换器类实现Converter接口
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
//将容器字符串转换成日期对象,返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date=format.parse(dateStr);
}catch(ParseException e){
e.printStackTrace();
}
return date;
}
}
在配置文件中声明转换器
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.itheima.converter.DateConverter"/>
list>
property>
bean>
在中引用转换器
通过学习SpringMVC 获得请求数据,了解到各个SpringMVC可以接受类型的参数。还有各种可以获得的请求,或者上传文件等,为接下来的学习,开发,提供了基础。增加了学习激情。