我有一些关于 Spring MVC 消息转换器使用的问题。
如果我有以下情况:
在我看来,我有以下链接:
<a id="writeXmlAccept" class="writeXmlLink" href="<c:url value="/messageconverters/xml" />">Write XML via Accept=application/xml</a>
此链接向 URL 生成 HTTP 请求:“/messageconverters/xml”
与具有class="writeXmlLink"的此链接的单击事件相关,我有以下 Jquery 回调函数:
$("a.writeXmlLink").click(function() {
/* Variabile che contiene il riferimento all'elemento nel DOM che ha
scatenato l'evento click (il link clickato) */
var link = $(this);
// Viene eseguita la chiamata ajax
$.ajax({
// Indirizzo verso cui è indirizzata la richiesta
url: link.attr("href"),
/* Prima di inviare l'HTTP Request esegui la funzione passandogli il
parametro req che rappresenta l'HTTP Request */
beforeSend: function(req) {
// Se l'url termina con .xml
if (!this.url.match(/\.xml$/)) {
// Aggiunge alla HTTP Request l'header Accept: application/xml
req.setRequestHeader("Accept", "application/xml");
}
},
success: function(xml) { // Caso di successo:
MvcUtil.showSuccessResponse(MvcUtil.xmlencode(xml), link);
},
error: function(xhr) { // Caso di errore:
MvcUtil.showErrorResponse(xhr.responseText, link);
}
});
return false;
});
由于 URL "/messageconverters/xml"不以 *.xml 模式结尾,因此该请求if
中未执行正文并且未设置标头Accept
好的,所以这个函数只执行我的HTTP请求的ajax调用并等待响应。
我的控制器类处理这个 HTTP 请求的方法如下:
/* Metodo che gestisce HTTP Request di tipo GET dirette verso
* l'URL: "/messageconverters/xml" */
@RequestMapping(value="/xml", method=RequestMethod.GET)
public @ResponseBody JavaBean writeXml() {
return new JavaBean("bar", "apple");
}
此方法仅创建并返回一个新的 JavaBean 对象,以评估它的两个属性
JavaBean 是我的示例中的一个类,它只有 2 个属性,getter 和 setter 方法以及 toString() 方法,这个:
@XmlRootElement
public class JavaBean {
@NotNull
private String foo;
@NotNull
private String fruit;
public JavaBean() {
}
public JavaBean(String foo, String fruit) {
this.foo = foo;
this.fruit = fruit;
}
// GETTER & SETTER & toString()
}
因此,增值的 JavaBean 对象返回给客户端(浏览器),在我的视图中显示以下输出:
<javaBean><foo>bar</foo><fruit>apple</fruit></javaBean>
我会很好地理解转换器在此示例中何时以及如何工作:
我认为使用转换器是Jaxb2RootElementHttpMessageConverter
因为我在我的视图中编写 XML 代码,并且因为我的 JavaBean 类使用@XmlRootElement
注释进行注释,该注释是实现 Java 类和 XML 字段之间映射的 JAXB 注释。
那么,当我点击我的链接时会发生什么?
创建了增值的 JavaBean 对象,当我返回它时(在 HTTP 响应的主体字段内),这个 JavaBean 对象由 Jaxb2RootElementHttpMessageConverter 转换为 XML 文档?
谢谢