一、环境准备
二、问题分析
团队多人开发,每人设置不同的请求路径,冲突问题该如何解决? 解决思路:为不同模块设置模块名作为请求路径前置
对于Book模块的save,将其访问路径设置 http://localhost/book/save
对于User模块的save,将其访问路径设置 http://localhost/user/save
这样在同一个模块中出现命名冲突的情况就比较少了。
创建一个Web的Maven项目
pom.xml添加Spring依赖
- "1.0" encoding="UTF-8"?>
-
"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
4.0.0 -
-
com.itheima -
springmvc_03_request_mapping -
1.0-SNAPSHOT -
war -
-
-
-
javax.servlet -
javax.servlet-api -
3.1.0 -
provided -
-
-
org.springframework -
spring-webmvc -
5.2.10.RELEASE -
-
-
-
-
-
-
org.apache.tomcat.maven -
tomcat7-maven-plugin -
2.1 -
-
80 -
/ -
-
-
-
-
创建对应的配置类
- 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];
- }
- }
-
- @Configuration
- @ComponentScan("com.itheima.controller")
- public class SpringMvcConfig {
- }
编写BookController和UserController
- @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服务器,后台会报错:

从错误信息可以看出:
UserController有一个save方法,访问路径为 http://localhost/save
BookController也有一个save方法,访问路径为 http://localhost/save
当访问 http://localhost/save 的时候,到底是访问UserController还是BookController?
三、设置映射路径
步骤1:修改Controller
- @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:优化路径配置
优化方案:
- @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值相加匹配才能访问到。
@RequestMapping注解value属性前面加不加 / 都可以