目录
请求映射路径
get请求与psot请求发送普通参数
get请求发送参数
post请求发送参数
post请求乱码问题
5种参数类型传递
普通参数传递(不同名)
实体类对象传递
数组传递
集合参数
json数据传递参数
JSON数组
JSON对象
编辑
JSON引用集合
日期型参数传递
请求映射路径
问题:在团队多人开发中,每人设置不同的请求路径,冲突问题该如何解决...
示例:在controller包下,有两个类下的方法设置的请求路径均为/save
@RequestMapping("/save")@ResponseBodypublic String Book(){System.out.println("book save......");return "{'module':'book koob'}";}
@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save");return "{'module':'user save'}";}
这种情况下运行项目会报错。可以设置模块名作为请求路径前缀。
@RequestMapping("/book/save")@ResponseBodypublic String Book(){System.out.println("book save......");return "{'module':'book koob'}";}
@RequestMapping("/user/save")@ResponseBodypublic String save(){System.out.println("user save");return "{'module':'user save'}";}
除了在方法上指定请求路劲,也可以在类上使用@RequestMapping设置路径前缀,相当于给该类下的所有路径都添加上了相同的前缀:
@RequestMapping("/book")
public class BookController {@RequestMapping("/save")@ResponseBodypublic String Book(){System.out.println("book save......");return "{'module':'book koob'}";}
}
get请求与psot请求发送普通参数
在controller类接收参数,只需要添加参数列表,即可直接引用:
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(String string,int age){System.out.println("普通参数传递 string == >"+ string);System.out.println("普通参数传递 age == >"+ age);return "{'module':'user save'}";}
}
get请求发送参数
get发送请求参数,只需要在url后接 ?key=value&key1=value1.....
post请求发送参数
post请求参数在请求体中,所以下方按钮要选择Body,再选择x-www-form-urlencoded(编码表单)。
补充:
form-data(表单数据):传文件或混合文本和文件数据。
x-www-form-urlencoded(编码表单):提交简单键值对数据(无文件)。
raw(原始数据):发送 JSON、XML 等结构化数据。
binary(二进制文件):直接上传二进制文件(如图片、视频)。
post请求乱码问题
上面post请求传递的参数在控制台显示乱码,解决方案:
设置过滤器:
在servlet容器中进行乱码处理,重写getServletFilters()方法:
@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
重新发送请求,此时乱码问题已解决:
5种参数类型传递
普通参数传递(不同名)
当传递的参数key值与方法的参数列表名不一致时,会出现参数无法传递的情况:
解决方案:
在控制器类对应的方法参数前,添加@RequestParam("对应的参数名"):
public String save(@RequestParam("name") String string, int age){System.out.println("普通参数传递 string == >"+ string);System.out.println("普通参数传递 age == >"+ age);return "{'module':'user save'}";}
此时可以成功传递参数,但是用原来的参数名会报错!
实体类对象传递
准备了一个实体类,接下来就将该类的对象作为参数传递:
public class User {private String name;private int age;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
@RequestMapping("/pojo")@ResponseBodypublic String pojoParam(User user){System.out.println("pojo参数传递===="+user);return "{'module':'pojo param'}";}
可以直接使用对象属性名进行参数传递:
当类的属性里有其他对象时:
public class Person {private int height;private int weight;@Overridepublic String toString() {return "Person{" +"height=" + height +", weight=" + weight +'}';}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}
}
普通属性直接使用属性名,引用类型使用pojo.属性名传递:
@RequestMapping("/pojoCoin")@ResponseBodypublic String pojoCoinPojo(User user){System.out.println("pojo参数传递===="+user);return "{'module':'pojo param'}";}
数组传递
当传入的参数为数组时,url参数的key只需使用相同的命名即可:
@RequestMapping("/arr")@ResponseBodypublic String pojoCoinPojo(String[] arr){System.out.println("pojo参数传递===="+ Arrays.toString(arr));return "{'module':'array param'}";}
集合参数
传入的参数为集合时,需要再list参数前加上注解@RequestParam,传递时只需key相同即可。
@RequestMapping("/list")@ResponseBodypublic String listParam(@RequestParam List<String> lists){System.out.println("pojo参数传递===="+ lists);return "{'module':'list param'}";}
json数据传递参数
JSON数组
在实验之前,首先要导入jackson-databind依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency>
想要传递json数据,点击Body,数据格式选择raw,右侧选择JSON,使用get和post提交都可。
还需要再springmvc配置类中加上注解: @EnableWebMvc 。在Controller类的方法参数前也要加上注解@RequestBody:
//json集合参数@RequestMapping("/listJSON")@ResponseBodypublic String listJSONParam(@RequestBody List<String> lists){System.out.println("JSON数组传递===="+ lists);return "{'module':'listJSON param'}";}
JSON对象
JSON对象的传递与JSON数组的传递只在传递的JSON格式不同,其他完全相同!
仍要注意传入的JSON对象的key值要和方法参数列表的对象属性的属性名一致,否则接收不到。引用类型的数据则是用属性名再用大括号包裹它对应的属性。
JSON引用集合
传入的参数还可以是引用类型的集合,仅有参数列表和传入的数据形式改变:
//json的对象集合@RequestMapping("/pojoJSONList")@ResponseBodypublic String pojoJSONParam(@RequestBody List<User> users){System.out.println("JSON引用集合传递===="+ users);return "{'module':'pojoJSONList param'}";}
日期型参数传递
日期类型的数据基于系统的不同格式也不同:
- 2024-10-01
- 2024/10/01
- 01/10/2024
斜线格式的处理方法如下:直接使用date类型的参数
@RequestMapping("/dateParam")@ResponseBodypublic String dataParam(Date date){System.out.println("日期类型的参数===="+ date);return "{'module':'date param'}";}
传递的参数为其他格式时,需要加上注解@DateTimeFormat(pattern="日期格式")来指定日期格式。