在这段时间里,我研究了可从STS仪表板安装的Spring MVC Showcase示例

我对通过标头的HTTP请求映射的功能有疑问。

在展示示例中,我具有以下2个链接:

        <li>
            <a id="byHeader" href="<c:url value="/mapping/header" />">By presence of header</a>
        </li>

        <li>
            <a id="byHeaderNegation" class="textLink" href="<c:url value="/mapping/header" />">By absence of header</a>
        </li>


因此,如您所见,单击第一个链接我向“ / mapping / header”文件夹创建一个HTTP请求,然后单击第二个链接我向同一“ / mapping / header”文件夹创建一个HTTP请求

现在,这些HTTP请求由我的控制器类中的两个方法管理。

第一个通过以下方法处理:

@RequestMapping(value="/mapping/header", method=RequestMethod.GET, headers="FooHeader=foo")
public @ResponseBody String byHeader() {
    System.out.println("Sono dentro byHeder()");
    return "Mapped by path + method + presence of header! (MappingController)";
}


第二个是通过以下方法处理的:

@RequestMapping(value="/mapping/header", method=RequestMethod.GET, headers="!FooHeader")
public @ResponseBody String byHeaderNegation() {
    System.out.println("Sono dentro byHeaderNegation");
    return "Mapped by path + method + absence of header! (MappingController)";
}


我不明白为什么两个请求都用两种不同的方法处理,因为两个链接都会向同一个文件夹生成一个HTTP请求:“ / mapping / header”

为什么第一个没有标题,而第二个没有标题?

我可能缺少了一些东西,您能帮我理解一下吗?

非常感谢你
安德里亚

最佳答案

正如您在最后的src/main/webapp/WEB-INF/views/home.jsp文件中发现的那样,按标题显示映射的链接正在使用Ajax,它将FooHeader设置为foo

这就是两种方法的调用方式。

如果未设置标头(表示简单的HTML链接),则会调用方法byHeaderNegation,但如果设置标头(在这种情况下使用Ajax),则会调用方法byHeader,因为FooHeader=footrue

$("#byHeader").click(function(){
    var link = $(this);
    $.ajax({ url: this.href, dataType: "text", beforeSend: function(req) { req.setRequestHeader("FooHeader", "foo"); }, success: function(form) { MvcUtil.showSuccessResponse(form, link); }, error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, link); }});
    return false;
});

07-24 19:10
查看更多