1

在此期间,我正在研究可从 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”

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

我可能遗漏了一些东西,你能帮我理解这件事吗?

非常感谢安德里亚

4

1 回答 1

3

正如您在src/main/webapp/WEB-INF/views/home.jsp最后的文件中找到的那样,显示按标题映射的链接正在使用FooHeaderfoo.

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

如果您不设置标题(即简单的 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;
});
于 2012-11-19T10:56:15.890 回答