这次我正在研究可从 STS 仪表板下载的 Spring MVC 展示示例
但是,情况如下:
在名为 home.jsp 的视图中,我有这两个链接:
<li>
<a id="byProducesAcceptXml" class="writeXmlLink" href="<c:url value="/mapping/produces" />">By produces via Accept=appilcation/xml</a>
</li>
<li>
<a id="byProducesXmlExt" class="writeXmlLink" href="<c:url value="/mapping/produces.xml" />">By produces via ".xml"</a>
</li>
第一个链接生成对 URL 的 HTTP 请求:/mapping/produces 第二个链接生成对 URL 的 HTTP 请求:/mapping/produces.xml
这两个链接都有class="writeXmlLink"并且与所有具有此类的链接的单击事件相关,有以下 Jquery 函数:
$("a.writeXmlLink").click(function() {
var link = $(this); // Variabile che contiene il riferimento all'elemento nel DOM che ha scatenato l'evento click (il link clickato)
// Viene eseguita la chiamata ajax
$.ajax({
url: link.attr("href"), // Indirizzo verso cui è indirizzata la richiesta
beforeSend: function(req) { // Prima di inviare l'HTTP Request esegui la funzione passandogli il parametro req
if (!this.url.match(/\.xml$/)) { // Se l'url termina con .xml
req.setRequestHeader("Accept", "application/xml"); // Aggiunge alla HTTP Request l'header Accept: application/xml
}
},
success: function(xml) {
MvcUtil.showSuccessResponse(MvcUtil.xmlencode(xml), link);
},
error: function(xhr) {
MvcUtil.showErrorResponse(xhr.responseText, link);
}
});
return false;
});
这个脚本对我来说很清楚......实际上它发生了:
单击第一个链接时,jQuery 脚本启动并执行 AJAX 调用,在发送请求之前检查 URL 是否以 .xml 结尾,并且因为此链接不以 .xml 结尾,所以发送在我的控制器类中处理的 HTTP 请求通过以下方法:
@RequestMapping(value="/mapping/produces", method=RequestMethod.GET, produces=MediaType.APPLICATION_XML_VALUE)
public @ResponseBody JavaBean byProducesXml() {
System.out.println("Dentro byProducesXml()");
return new JavaBean();
}
这个方法只是简单地创建一个新的 JavaBean 对象并在一个 XML 文档中返回它,该文档放在 HTTP Response 的 body 字段中。因此 HTTP 响应到达客户端(我的浏览器),而 JQuery 脚本调用另一个显示输出的函数。
JavaBean 类是一个简单类,仅包含两个 valorised 变量和 getter/setter 方法:
@XmlRootElement
公共类 JavaBean {
private String foo = "bar";
private String fruit = "apple";
// GETTER & Setter
因此 HTTP 响应到达客户端(我的浏览器),JQuery 脚本调用另一个显示输出的函数(即 HTTP 响应正文中的 XML 文档)
事实上,在这种情况下,我的输出是:barapple
好的......现在当第二个链接被点击时,再次启动执行 AJAX 调用的 jQuery 函数,在发送请求之前检查 URL 是否以 .xml 结尾,因为这次链接以.xml结尾是 if 正文中的代码被执行,所以执行如下操作:
req.setRequestHeader("Accept", "application/xml");
在 HTTP 请求标头中添加一个标头名称并接受并具有值“application/xml”。
现在 AJAX 调用发送 HTTP 请求,该请求由相同的 previus 控制器方法处理,该方法将相同的东西返回到我的浏览器,这里出现了相同的输出消息: barapple
现在我的疑问与通过单击两个链接生成的两个请求之间的区别有关。
第一个没有设置 Accept 标头,第二个设置了此标头...结果是一样的...有什么变化?这两个请求有什么区别?