请求
# 请求
在日常开发时,一个项目肯定不会是一个人完成的,往往需要一整个团队合力完成。 但配置请求路径时,你如何确保其他人配置的路径与你不冲突呢?
常见的方法就是
小明:负责user_info模块开发,因此所有路径必须是/user/xxxx
小红:负责eco模块开发,因此所有路径必须是/eco/xxxx
这的确能解决上述提到的问题。但倘若你的模块有三十几条路径,你每个方法都需要输入/user
实在很麻烦,而且难保会不会某一个出差错。
有个很好的方法是:
// 访问路径:http://localhost:8080/user/save
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("Loading save()...");
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
当你在class上设置@RequestMapping
时,它就会认为这是路径前缀,这样一来,可以避免重复输入前缀,减少出错的情况。
# 提醒
上面我们的路径耦合度很高,为了避免这种情况,还是建议使用properties解决,方法和Spring一样。
# Get&Post参数接收
@RequestMapping("/save")
@ResponseBody
public String save(String name){
System.out.println("Loading save()..."+name);
return "{'module':'springmvc'}";
}
2
3
4
5
6
# POST中文乱码
之前解决乱码问题时,我们是通过过滤器(Filter)实现的,但现在在SpringMVC中该如何做呢?
我们需要在主类配置中进行方法重新,我们的主类配置是继承自AbstractAnnotationConfigDispatcherServletInitializer
,我们可以重写其getServletFilters
方法
public class SContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
2
3
4
5
6
7
8
9
# 参数名
前面的例子中
@RequestMapping("/save")
@ResponseBody
public String save(String name){
System.out.println("Loading save()..."+name);
return "{'module':'springmvc'}";
}
2
3
4
5
6
但如果参数名与前端提供的参数名不同,则会接收不到参数,因此,我们需要为参数添加别名,从而更好地接收参数。
@RequestMapping("/save")
@ResponseBody
public String save(@RequestParam("userName") String name){
System.out.println("Loading save()..."+name);
return "{'module':'springmvc'}";
}
2
3
4
5
6
这样,就算前端给的是userName
你也能接收到了
# POJO传参
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO (opens new window)名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
简而言之: 一个仅包含变量和其getter&setter等基本函数的类,不包含业务逻辑函数
//POJO类
public class User {
private String name;
private int 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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//控制类
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(User user){
System.out.println("Loading save()..."+user);
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
11
Loading save()...User{name='飞猪', age=22}
# 嵌套POJO传参
即POJO类中包含引用类型
public class User {
private String name;
private int age;
private Address address;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
public Address getAddress() {return address;}
public void setAddress(Address address) {this.address = address;}
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;}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Address {
private String location;
public String getLocation() {return location;}
public void setLocation(String location) {this.location = location;}
@Override
public String toString() {
return "Address{" +
"location='" + location + '\'' +
'}';
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
//控制类
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(User user){
System.out.println("Loading save()..."+user);
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
11
传参 ![[Pasted image 20220615155254.png]]
Loading save()...User{name='飞猪', age=22, address=Address{location='地球'}}
# 数组传参
常见于checkbox的提交
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(String[] likes){
System.out.println("Loading save()..."+ Arrays.toString(likes));
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
传参 ![[Pasted image 20220615155453.png]] Loading save()...[飞猪, 携程, 乐活]
# 集合传参
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(@RequestParam List<String> likes){
System.out.println("Loading save()..."+ likes);
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
切记,集合传参一定要加@RequestParam
否则会当作POJO对象处理
# 接收JSON类型数据
想要接收Json数据相比其他数据较为麻烦
- 导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
2
3
4
5
- 在核心配置中(SpringMVCConfig)添加
@EnableWebMvc
注释
@Configuration
@ComponentScan("com.project.controller")
@EnableWebMvc
public class SpringMVCConfig {
}
2
3
4
5
- 在控制器中的函数参数加上
@RequestBody
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(@RequestBody List<String> likes){
System.out.println("Loading save()..."+ likes);
return "{'module':'springmvc'}";
}
}
2
3
4
5
6
7
8
9
10
- 发送json数据
# POJO Json
代码和先前一样的POJO案例用到的一样,唯一不同的是控制器中的函数参数需要加上@RequestBody
传参
{ "name":"Lam ka kuan", "age":22, "address":{"location":"Beijing"}}
# @RequestBody & @RequestParam
![[Pasted image 20220615161822.png]]