本文共 4999 字,大约阅读时间需要 16 分钟。
前言
先说结论,springmvc可以接收的参数类型如下:
基本数据类型
POJO类型参数
数组类型参数
集合类型参数
此外,本篇文章也会对获取restful参数、获取请求头信息、文件上传等内容进行总结
一、获取基本数据类型(get请求)
http://localhost:8088/user/getParams?username=xiaoming&age=15
@RequestMapping("/getParams")
@ResponseBody
public void getParams(String username,int age){
System.out.println("username: "+ username);
System.out.println("age: "+ age);
}
image.png
二、获取pojo类型参数,会实现pojo参数的自动封装
http://localhost:8088/user/getParams2?username=xiaoming&age=15
@RequestMapping("/getParams2")
@ResponseBody
public void getParams2(User user){
System.out.println(user);
}
image.png
三、获取数组类型参数(get请求)
和上面的做法没什么差别,url只要参数和方法的参数名保持一致就行
http://localhost:8088/user/getParams3?str=xiaoming&str=xiaohong&str=xiaoqi
@RequestMapping("/getParams3")
@ResponseBody
public void getParam3(String[] str){
System.out.println(Arrays.asList(str));
}
image.png
四、获取集合类型参数(post请求)
场景一: 直接的表单提交
获取集合类型的参数相对来说有些特殊,需要通过包装类封装一下才可以接受到集合参数
localhost:8088/form.jsp 跳转到页面后,填写信息提交
Title用户名1
用户年龄1
用户名2
用户年龄2
/**
* 要使用集合的话,要用建一个包装类封装一下
*/
@RequestMapping("/getParams4")
@ResponseBody
public void getParam4(UserVO userVO){
System.out.println();
}
image.png
场景2: 提交过来的数据格式是json格式
这里有两点要注意
需要用@RequestBody注解,这样才可以直接接收集合数据而无需使用POJO进行包装。
这里的话使用到了jq,记得要引入对应的包
http://localhost:8088/ajax.jsp
Titlevar userList = new Array();
userList.push({username:"zhangsan",age:18});
userList.push({username:"lisi",age:28});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/user/getParams5",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
});
@RequestMapping("/getParams5")
@ResponseBody
public void getParam5(@RequestBody List userList){
System.out.println(userList);
}
image.png
注意:由于DispatcherServlet会对所有的请求进行过滤,如果想要页面获取到静态资源,需要对请求进行放行。
方法1:在spring-mvc.xml中加入
方法2:在spring-mvc.xml中加入
五、参数绑定注解
这种是对于页面上的入参名和方法的参数名称不对应时,可以使用@requestParam注解来进行参数绑定
http://localhost:8088/user/getParam6?name=xiaoming
通过@RequestParam注解实现了url和方法参数的映射
@RequestMapping("/getParam6")
@ResponseBody
public void getParam6(@RequestParam("name") String username){
System.out.println(username);
}
image.png
六、获取restful风格参数
http://localhost:8088/user/getRestfulParam/xiaoming
使用@PathVariable注解和 { }占位符对url参数进行接收
/**
* 获取restful风格参数
*/
@RequestMapping("/getRestfulParam/{name}")
@ResponseBody
public void getRestfulParam(@PathVariable(value = "name",required = true) String username){
System.out.println(username);
}
image.png
七、获取日期类型的参数
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
步骤如下:
1. 自定义转换器实现Converter接口
package com.xiaoming.util;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter {
public Date convert(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateStr);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
2. 在spring-mvc.xml文件中声明转换器
class="org.springframework.context.support.ConversionServiceFactoryBean">
3. 在中引用转换器
发起请求
http://localhost:8088/user/getDateParam?date=2020-10-3
image.png
八、获取Servlet原生API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
HttpServletRequest
HttpServletResponse
HttpSeesion
@RequestMapping("/getHttpParam")
@ResponseBody
public void getHttpParam(HttpServletRequest servletRequest, HttpServletResponse servletResponse, HttpSession session){
System.out.println(servletRequest);
System.out.println(servletResponse);
System.out.println(session);
}
九、获取文件资源
1. 导入fileupload和io坐标
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.3
2. 配置文件上传解析器
3. 使用MultipartFile类进行接收
@RequestMapping("/getUploadFile")
@ResponseBody
public void getUploadFile(String name, MultipartFile uploadFile1,MultipartFile uploadFile2){
System.out.println("hhh");
if(null !=uploadFile1 && !StringUtils.isEmpty(uploadFile1.getOriginalFilename())&&
null !=uploadFile2 && !StringUtils.isEmpty(uploadFile2.getOriginalFilename())){
String filename1 = uploadFile1.getOriginalFilename();
String filename2 = uploadFile2.getOriginalFilename();
try {
uploadFile1.transferTo(new File("C:\\upload\\"+filename1));
uploadFile2.transferTo(new File("C:\\upload\\"+filename2));
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果是多个文件的话,也可以通过MultipartFile[] 数组来对进行用户上传的文件进行接收
@RequestMapping("/getUploadFiles")
@ResponseBody
public void getUploadFiles(String name, MultipartFile[] uploadFiles){
for(MultipartFile uploadFile :uploadFiles){
if(null !=uploadFile && StringUtils.isEmpty(uploadFile.getOriginalFilename())){
String filename = uploadFile.getOriginalFilename();
try {
uploadFile.transferTo(new File("C:\\upload\\"+filename));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
总结
总的来说,springmvc提供给了我们接收各种数据类型参数的方法,一方面,针对字符串、pojo类型数据等常见的类型,我们可以直接通过参数名称或者@RequestParam注解来进行映射,对于特殊一些的日期转换,我们可以通过自定义转换器来实现;对于文件上传,则可以通过MultipartFile类型参数来接收。也能通过springmvc获取到一些servlet的原生api。
在实际开发项目中,也需要我们结合项目的具体框架设计来合理的对前端的参数进行正确的接收。
转载地址:http://lxhsl.baihongyu.com/