今回は、STSダッシュボードからダウンロード可能なSpringMVCショーケースの例を調べています。
ただし、状況は次のとおりです。
home.jspという名前のビューには、次の2つのリンクがあります。
<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 2番目のリンクは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オブジェクトを作成し、HTTPResponseのbodyフィールド内に配置するXMLドキュメント内にそれを返すだけです。したがって、HTTP応答がクライアント(私のブラウザー)に届き、JQueryスクリプトが出力を表示する他の関数を呼び出します。
JavaBeanクラスは、2つの値化された変数とgetter/setterメソッドのみを含む単純なクラスです。
@XmlRootElement
パブリッククラスJavaBean{
private String foo = "bar";
private String fruit = "apple";
// GETTER & Setter
したがって、HTTP応答がクライアント(私のブラウザー)に届き、JQueryスクリプトが出力を表示する他の関数(つまり、HTTP応答の本文内のXMLドキュメント)を呼び出します。
実際、この場合の出力は次のとおりです。barapple
OK ... 2番目のリンクがクリックされたら、AJAX呼び出しを行うjQuery関数を再度開始します。リクエストを送信する前に、URLが.xmlで終わっているかどうかを確認します。今回は、リンクが.xmlで終わっているため、if本文内のコードを確認します。が実行されるため、次の操作が実行されます。
req.setRequestHeader("Accept", "application/xml");
これにより、HTTPリクエストヘッダーにAcceptという名前のヘッダーが追加され、値は「application/xml」になります。
これで、AJAX呼び出しは、同じものをブラウザーに返す同じ以前のコントローラーメソッドによって処理されるHTTPリクエストを送信し、ここに同じ出力メッセージが表示されます: barapple
今、私の疑問は、2つのリンクをクリックすることによって生成される2つのリクエストの違いに関連しています。
最初のものはAcceptヘッダーが設定されておらず、2番目のものはこのヘッダーが設定されています...結果は同じです...何が変わりますか?2つのリクエストの違いは何ですか?