この期間、私はSpringMVCショーケースの例を研究しています。
リクエストのマッピングについて、少し疑問があります。次のような状況があります。
フォームを送信するビューで、このフォームを送信すると、次の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に対するHTTP POSTリクエストを処理します: "/ mapping / contains"そして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アノテーションのconsumes属性が"application / xml"であることがわかりました(またはSpring3.1より前のContent-Typeヘッダーは"application / xml ")これにより、リクエストメッセージのペイロードがXMLであり、@RequestBodyでアノテーションが付けられたオブジェクトにマーシャリングを解除する必要があることがSpringに通知されます。この場合、@ RequestBodyでアノテーションが付けられたオブジェクトは、通常、そのオブジェクトをXMLとの間でマーシャリングおよびアンマーシャリングするために必要なメタデータを提供するために、JAXbアノテーションで自身にアノテーションが付けられます。@ XmlRootElementは、そのメタデータを提供するアノテーションの1つです。
わかりました、これはすべて私には明らかです...私の唯一の疑問は、@ RequestMappingアノテーションで、Content-Typeヘッダーが"application / xmlに設定されているのではなく、 consumes=MediaType.APPLICATION_JSON_VALUEであるという事実に関連しています。
だから私はあなたに次の質問があります:
1) Content-Typeヘッダーと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「オブジェクト」を持っていませんが、XMLの代わりとなるJSONオブジェクトを使用していることです!!! 私は何が欠けていますか?
どうもありがとうございます
アンドレア