Java開發學習(二十四)----SpringMVC設定請求對映路徑

2022-08-12 12:10:49

一、環境準備

  • 建立一個Web的Maven專案

  • pom.xml新增Spring依賴

    <?xml version="1.0" encoding="UTF-8"?>
    ​
    <project xmlns="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">
      <modelVersion>4.0.0</modelVersion>
    ​
      <groupId>com.itheima</groupId>
      <artifactId>springmvc_03_request_mapping</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    ​
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
    ​
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <port>80</port>
              <path>/</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    ​
  • 建立對應的設定類

    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?

二、問題分析

團隊多人開發,每人設定不同的請求路徑,衝突問題該如何解決?解決思路:為不同模組設定模組名作為請求路徑前置

對於Book模組的save,將其存取路徑設定http://localhost/book/save

對於User模組的save,將其存取路徑設定http://localhost/user/save

這樣在同一個模組中出現命名衝突的情況就比較少了。

三、設定對映路徑

步驟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屬性前面加不加/都可以