目录
请求映射路径
问题:在团队多人开发中,每人设置不同的请求路径,冲突问题该如何解决...
示例:在controller包下,有两个类下的方法设置的请求路径均为/save
@RequestMapping("/save") @ResponseBody public String Book(){ System.out.println("book save......"); return "{'module':'book koob'}"; }
@RequestMapping("/save") @ResponseBody public String save(){ System.out.println("user save"); return "{'module':'user save'}"; }
这种情况下运行项目会报错。可以设置模块名作为请求路径前缀。
@RequestMapping("/book/save") @ResponseBody public String Book(){ System.out.println("book save......"); return "{'module':'book koob'}"; }
@RequestMapping("/user/save") @ResponseBody public String save(){ System.out.println("user save"); return "{'module':'user save'}"; }
除了在方法上指定请求路劲,也可以在类上使用@RequestMapping设置路径前缀,相当于给该类下的所有路径都添加上了相同的前缀:
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String Book(){
System.out.println("book save......");
return "{'module':'book koob'}";
}
}
get请求与psot请求发送普通参数
在controller类接收参数,只需要添加参数列表,即可直接引用:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public 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()方法:
@Override protected 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;
@Override
public 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")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递===="+user);
return "{'module':'pojo param'}";
}
可以直接使用对象属性名进行参数传递:
当类的属性里有其他对象时:
public class Person {
private int height;
private int weight;
@Override
public 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") @ResponseBody public String pojoCoinPojo(User user){ System.out.println("pojo参数传递===="+user); return "{'module':'pojo param'}"; }
数组传递
当传入的参数为数组时,url参数的key只需使用相同的命名即可:
@RequestMapping("/arr")
@ResponseBody
public String pojoCoinPojo(String[] arr){
System.out.println("pojo参数传递===="+ Arrays.toString(arr));
return "{'module':'array param'}";
}
集合参数
传入的参数为集合时,需要再list参数前加上注解@RequestParam,传递时只需key相同即可。
@RequestMapping("/list")
@ResponseBody
public 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") @ResponseBody public 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")
@ResponseBody
public 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") @ResponseBody public String dataParam(Date date){ System.out.println("日期类型的参数===="+ date); return "{'module':'date param'}"; }
传递的参数为其他格式时,需要加上注解@DateTimeFormat(pattern="日期格式")来指定日期格式。