【发布时间】:2012-11-27 20:58:41
【问题描述】:
这段时间我正在研究 Spring MVC 展示示例。
关于请求映射我有点怀疑,我有以下情况:
在一个视图中我提交一个表单,提交这个表单启动下面的Jquery函数:
$("form.readJsonForm").submit(function() {
var form = $(this); // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento submit (il form)
var button = form.children(":first"); // Seleziona il bottone submit
var data = form.hasClass("invalid") ? // OPERATORE CONDIZIONALE: il form ha classe "invalid" ?
"{ \"foo\": \"bar\" }" : // SI: foo = bar
"{ \"foo\": \"bar\", \"fruit\": \"apple\" }"; // NO: foo= bar ; fruit = apple
/* AJAX CALL PARAMETER:
type: Say to the servlet tath the request is a POST HTTP Request
url: The address to which to send the call
data: the content of my data variable
contentType: an object having JSON format
dataType: the type of content returned by the server
*/
$.ajax({ type: "POST", url: form.attr("action"), data: data, contentType: "application/json", dataType: "text",
success: function(text) { MvcUtil.showSuccessResponse(text, button); },
error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});
return false;
});
所以在我的例子中生成了以下具有 JSON 格式的 JavaScript 对象:
{ \"foo\": \"bar\", \"fruit\": \"apple\" }
好的,然后我的 Jquery 函数执行 AJAX 调用并将我的 JSON 对象发送到 Spring 控制器类。
这是处理这个 HTTP 请求的方法:
@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
System.out.println("foo: " + javaBean.getFoo() + " fruit: " + javaBean.getFruit());
return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}
此方法处理对 URL:“/mapping/consumes”的 HTTP POST 请求并使用 JSON 对象(由 consumes=MediaType.APPLICATION_JSON_VALUE 指定)
好的,这个方法接受一个输入参数,该参数使用 @RequestBody 注释进行注释,表明我的方法参数应该绑定到 HTTP 请求正文中的值(我的 JSON 对象)
JavaBean 类仅包含 2 个属性:
private String foo;
private String fruit;
(作为 JSON 对象属性)
为了将 JSON 对象属性与 JavaBean 属性绑定,JavaBean 类由 @XmlRootElement 注释进行注释:
包org.springframework.samples.mvc.mapping;
导入 javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class JavaBean {
private String foo = "bar";
private String fruit = "apple";
// Setter and Getter method for properties
现在我知道,当您在 Spring 控制器中的对象上看到 @RequestBody 注释时,@RequestMapping 注释的消费属性是“application/xml”(或在 spring 3.1 之前,Content-Type 标头设置为"application/xml") 这将告诉 Spring 请求消息的有效负载是 XML 并且需要解组到使用 @RequestBody 注释的对象。在这种情况下,使用 @RequestBody 注释的对象通常会使用 JAXb 注释对其自身进行注释,以提供将该对象编组到 XML 或从 XML 解组所需的元数据,而 @XmlRootElement 是提供该元数据的那些注释之一。
好的,这对我来说很清楚......我唯一的疑问与我的 @RequestMapping 注释中我没有 Content-Type 标头 设置为 "application/xml 但我有:consumes=MediaType.APPLICATION_JSON_VALUE
所以我有以下问题要问你:
1) Content-Type header 和 consumes=MediaType.APPLICATION_JSON_VALUE
有什么区别2) 据我了解,阅读 ** @XmlRootElement** 文档:http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html
这个注解提供了 XML 内容和 JAVA 内容之间的双向关联。 所以我可以在Java类属性中映射XML字段的内容,反之亦然
问题在于,在这种情况下,我没有 XML“对象”,但我使用的是 JSON 对象,它可以替代 XML !!!我错过了什么?
非常感谢
安德烈亚
【问题讨论】:
标签: java json spring spring-mvc jaxb