Spring MVC メッセージ コンバーターの使用についていくつか質問があります。
次のような状況がある場合:
私の見解では、次のリンクがあります。
<a id="writeXmlAccept" class="writeXmlLink" href="<c:url value="/messageconverters/xml" />">Write XML via Accept=application/xml</a>
このリンクは、URL 「/messageconverters/xml」への HTTP リクエストを生成します。
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");
}
このメソッドは、2 つのプロパティを評価する新しい JavaBean オブジェクトを作成して返すだけです。
JavaBean は、getter メソッドと setter メソッド、および toString() メソッドの 2 つのプロパティしか持たない私の例のクラスです。
@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>
この例では、コンバーターがいつ、どのように機能するかをよく理解できます。
使用されているコンバーターは、ビュー内に XML コードを記述しているため、および Java クラスと XML フィールド間のマッピングを実装する JAXB アノテーションであるアノテーションをJaxb2RootElementHttpMessageConverter
使用して JavaBean クラスにアノテーションが付けられているためだと思います。@XmlRootElement
では、リンクをクリックすると何が起こるのでしょうか?
評価された JavaBean オブジェクトが作成され、それを (HTTP 応答の body フィールド内で) 返すと、この JavaBean オブジェクトは Jaxb2RootElementHttpMessageConverter によって XML ドキュメントに変換されますか?
ありがとう