" http:// localhost / app / hello"之间的区别是什么?和#34; http:// localhost / app / hello /"?

时间:2017-07-27 05:18:44

标签: java spring spring-mvc tomcat server

我已经编写了一个基于Spring MVC的控制器。

@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/"?

2 个答案:

答案 0 :(得分:3)

查看您的控制器代码

@RequestMapping("/hello")
public class JsonController

你的控制器有网址映射 - > “/你好”

和action(service)url mapping是“/”

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

现在每当我们为控制器提供映射时,控制器的每个操作都需要控制器URL路径作为前缀(如果URL映射在控制器中定义),正如您已经提到控制器映射< strong>“/ hello”和行动服务网址映射“/” 因此,当您需要访问服务操作时,请执行以下操作:&gt; 您需要控制器的基本路径(如果在控制器中定义请求URL映射)+操作URL映射

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

因此,在访问网址“page”的情况下,它很容易找到service操作并返回响应

现在,当您尝试访问URL“http://localhost/app/hello/”时,URL映射搜索此映射并在您的控制器映射中找到它(因为它在您的情况下已定义),但没有为其定义的操作,原因是得到404。

您可以将其定义为默认操作,如:

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

所以现在如果您点击“http://localhost/app/hello”这将返回有效回复而不是404

答案 1 :(得分:1)

我想,这与您的tomcat重定向配置有关。尝试在context.xml中包含以下属性

mapperContextRootRedirectEnabled

说明如果启用,将在必要时由Mapper而不是默认Servlet重定向(添加尾部斜杠)对Web应用程序上下文根的请求。这更有效,但具有确认上下文路径存在的副作用。如果未指定,则使用默认值true。

mapperDirectoryRedirectEnabled

说明如果启用,将在必要时由Mapper而不是默认Servlet重定向(添加尾部斜杠)对Web应用程序目录的请求。这样更有效,但具有确认目录存在的副作用。如果未指定,则使用默认值false。

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