在这段时间里,我研究了可从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=foo
是true
$("#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;
});