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

一、環境準備

  • 創建一個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屬性前面加不加/都可以

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章