0

这次我正在研究可从 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 标头,第二个设置了此标头...结果是一样的...有什么变化?这两个请求有什么区别?

4

0 回答 0