2017-07-27 91 views
1

我寫了一個基於Spring MVC的控制器。「http:// localhost/app/hello」和「http:// localhost/app/hello /」有什麼區別?

@Controller 
@RequestMapping("/hello") 
public class JsonController { 

    @RequestMapping(value="/",method=RequestMethod.GET) 
    @ResponseBody 
    public Person service(){ 
     Person person=new Person(); 
     person.setId(3); 
     person.setName("666"); 
     return person; 
} 

當我訪問「http://localhost/app/hello」時,我得到404; 當我訪問「http://localhost/app/hello/」時,我得到202 OK。 「http://localhost/app/hello」和「http://localhost/app/hello/」有什麼區別?

+5

那麼不同的是,你映射了'/'用'@RequestMapping(value =「/」,method = RequestMethod.GET)'結束函數'service()',而末尾沒有'/'的URL映射爲空。如果你調用一個url,其餘的api沒有分配給你,那麼你自然會得到一個404。 – Nico

回答

3

看你的控制器代碼

@RequestMapping("/hello") 
public class JsonController 

你控制器具有URL映射 - >輸入 「/ hello」

和行動(服務)的URL映射爲 「/」

@RequestMapping(value="/",method=RequestMethod.GET) 
    @ResponseBody 
    public Person service() 

現在,只要我們提供了我們的控制器的映射然後控制器的每一個動作所需要的控制器URL路徑前綴(如URL映射在控制器中定義),因爲你已經提到你的控制器測繪與「/你好」和行動服務 URL映射與「/」 所以當你需要訪問服務行動,那麼 - > 您需要的控制器的基本路徑(如果請求的URL映射到控制器定義)+動作URL映射

-> "/hello" + "/" => "/hello/" 

所以在訪問的情況下, URL「http://localhost/app/hello/「很容易找到service動作並返回響應

現在,當你試圖訪問URL」http://localhost/app/hello「,URL映射搜索這個映射,並找到它在你的控制器映射(因爲它定義在你的情況),但有沒有爲它定義的動作,爲什麼得到404。

你可以將其定義默認喜歡動作:

@RequestMapping(method=RequestMethod.GET) 
    public Person defaultAction() { 
----your code 
} 

所以現在,如果你會打「http://localhost/app/hello」這是你將返回有效的響應不是404

1

我想,這是你的tomcat重定向配置。嘗試包括你的context.xml

mapperContextRootRedirectEnabled

說明以下屬性:如果啓用,Web應用程序上下文根將被重定向請求映射器(添加尾隨斜線)如果有必要,而比默認的Servlet。這更有效,但具有確認上下文路徑存在的副作用。如果未指定,則使用默認值true。

mapperDirectoryRedirectEnabled

說明:如果啓用,Web應用程序的目錄請求都將改由映射器,而不是默認的Servlet(添加尾隨斜線)如果需要的話。這樣更有效,但是有確認目錄存在的副作用。如果未指定,則使用默認值false。

參考:https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters

相關問題