2017-07-27 51 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

相关问题