SpringMVC请求与响应

请求与响应


SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,这也是SpringMVC的==重点==内容:

  • 请求映射路径
  • 请求参数
  • 日期类型参数传递
  • 响应json数据

1. 设置请求映射路径


1.1 环境准备

  • 创建对应的配置类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getServletConfigClasses() {
    return new Class[]{SpringMvcConfig.class};
    }
    protected String[] getServletMappings() {
    return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses() {
    return new Class[0];
    }
    }
    1
    2
    3
    4
    5
    @Configuration
    @ComponentScan("com.itheima.controller")
    public class SpringMvcConfig {
    }

  • 编写BookController和UserController

    1
    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
    @Controller
    public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
    System.out.println("user save ...");
    return "{'module':'user save'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String save(){
    System.out.println("user delete ...");
    return "{'module':'user delete'}";
    }
    }

    @Controller
    public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
    System.out.println("book save ...");
    return "{'module':'book save'}";
    }
    }

把环境准备好后,启动Tomcat服务器,后台会报错:

1630466555934

从错误信息可以看出:

  • UserController有一个save方法,访问路径为http://localhost/save
  • BookController也有一个save方法,访问路径为http://localhost/save
  • 当访问http://localhost/saved的时候,对于是访问UserController还是BookController会引起冲突。

1.2 问题分析

团队多人开发,每人设置不同的请求路径,冲突问题该如何解决?

解决思路:为不同模块设置模块名作为请求路径前置

对于Book模块的save,将其访问路径设置http://localhost/book/save

对于User模块的save,将其访问路径设置http://localhost/user/save

这样在同一个模块中出现命名冲突的情况就比较少了。

1.3 设置映射路径

步骤1:修改Controller
1
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
@Controller
public class UserController {

@RequestMapping("/user/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}

@RequestMapping("/user/delete")
@ResponseBody
public String save(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}

@Controller
public class BookController {

@RequestMapping("/book/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'module':'book save'}";
}
}

问题是解决了,但是每个方法前面都需要进行修改,写起来比较麻烦而且还有很多重复代码,如果/user后期发生变化,所有的方法都需要改,耦合度太高。

*步骤2:优化路径配置

优化方案:

1
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
30
@Controller
@RequestMapping("/user")
public class UserController {

@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}

@RequestMapping("/delete")
@ResponseBody
public String save(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}

@Controller
@RequestMapping("/book")
public class BookController {

@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'module':'book save'}";
}
}

注意:

  • 当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。

2. 请求参数


关于请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:

  • GET
  • POST

针对于不同的请求前端如何发送,后端如何接收?

2.1 参数传递

GET发送单个参数

发送请求与参数:

1
http://localhost/commonParam?name=itcast
1630467921300

接收参数:

1
2
3
4
5
6
7
8
9
10
@Controller
public class UserController {

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){
System.out.println("普通参数传递 name ==> "+name);
return "{'module':'commonParam'}";
}
}
GET发送多个参数

发送请求与参数:

1
http://localhost/commonParam?name=itcast&age=15
1630468045733

接收参数:

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通参数传递 name ==> "+name);
System.out.println("普通参数传递 age ==> "+age);
return "{'module':'commonParam'}";
}
}
GET请求中文乱码

如果我们传递的参数中有中文,你会发现接收到的参数会出现中文乱码问题。

发送请求:http://localhost/commonParam?name=张三&age=18

1630480536510

出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path> <!--虚拟目录-->
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
</configuration>
</plugin>
</plugins>
</build>
POST发送参数

发送请求与参数:

1630480812809接收参数:

和GET一致,不用做任何修改

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通参数传递 name ==> "+name);
System.out.println("普通参数传递 age ==> "+age);
return "{'module':'commonParam'}";
}
}
*POST请求中文乱码

发送请求与参数:

1630480964421

接收参数:

控制台打印,会发现有中文乱码问题。

1630481008109

解决方案:配置过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}

protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}

protected String[] getServletMappings() {
return new String[]{"/"};
}

//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}

CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。