この期間、私は Spring MVC ショーケースのサンプルのダウンロード可能なフォーム STS ダッシュボードを研究しています。
いくつかの rmapping の種類について疑問があります (ショーケースの Request Mapping セクションに示されています)。
home.jsp ビューには、次の 2 つのリンクがあります。
<li>
<a id="byProducesAcceptJson" class="writeJsonLink"
href="<c:url value="/mapping/produces" />">
By produces via Accept=application/json</a>
</li>
<li>
<a id="byProducesJsonExt" class="writeJsonLink"
href="<c:url value="/mapping/produces.json" />">By produces via ".json"</a>
</li>
最初のリンクは、URL への HTTP リクエストを生成します: "/mapping/produces" 2 番目のリンクは、URL への HTTP リクエストを生成します: "/mapping/produces.json"
writeJsonLinkクラスに関連して、次の単純な Jquery コールバック関数があります。
$("a.writeJsonLink").click(function() {
var link = $(this); // Variabile che si riferisce all'elemento del DOM che ha scatenato l'evento click (il link clickato)
// Esegue la chiamata ajax
$.ajax({
url: this.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(/\.json$/)) { // Se l'url termina con .json
req.setRequestHeader("Accept", "application/json"); // Aggiunge alla HTTP Request l'header Accept: application/json
}
},
success: function(json) {
MvcUtil.showSuccessResponse(JSON.stringify(json), link);
},
error: function(xhr) {
MvcUtil.showErrorResponse(xhr.responseText, link);
}});
return false;
});
この機能は何をするのか、私にとっては非常に明確です。単純に AJAX 呼び出しを実行し、呼び出しを送信する前に、URL が .json で終わっているかどうかを確認します。
OK、私のコントローラ クラスには、以前の両方の HTTP リクエストを処理する次のメソッドがあります。
@RequestMapping(value="/mapping/produces", method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody JavaBean byProducesJson() {
System.out.println("Dentro byProducesJson()");
return new JavaBean();
}
このメソッドの動作は、私にとって非常に明確です。
このメソッドは、URL「/mapping/ produces」に対する HTTP GET リクエストを処理し、* Produce要素は、指定された MediaType と互換性のない Accept という名前のヘッダーを持つリクエストをメソッドが受け付けないこと、およびこのメソッドが JSON 形式の新しいオブジェクトを生成することを指定します。 HTTP レスポンスの body フィールドに入れられます*
新しい JavaBean オブジェクトには、初期化された 2 つの変数と getter\setter メソッドのみが含まれています。
public class JavaBean {
private String foo = "bar";
private String fruit = "apple";
// Getter & Setter Method
わかりました...新しい JavaBean オブジェクトがこの変数値で作成され、この値は JSON オブジェクト内に格納され、ブラウザへの HTTP 応答内に配置されます。
両方のリンクをクリックすると、ブラウザに同じ出力が表示されます。{"foo":"bar","fruit":"apple"}
今、私はそれについていくつかの疑問を持っています:
最初のリンクは、 /mapping/producesに対する HTTP リクエストを生成します。
2 番目のリンクは、/mapping/ produces.jsonに対する HTTP リクエストを生成します。
私のメソッドは、"/mapping/produces" という形式の URL に対する HTTP リクエストを処理します。なぜこのメソッドは、.json で終わる 2 番目のタイプの HTTP リクエストも処理するのですか?
最初の HTTP リクエストは.json拡張子で終わらないため、前の Jquery コードが実行されると、if 本文に入力しないため、次のヘッダーが設定されません: ("Accept", "application/json")私のHTTPリクエストのために。
私のメソッドの @RequestMapping アノテーションには、 produces=MediaType.APPLICATION_JSON_VALUE要素が含まれています。ドキュメントを読んで理解したところでは、ヘッダーに「Accept」、「application/json」を値として含む Accept ヘッダーがある場合にのみ、このメソッドは HTTP リクエストを処理する必要があります。
この HTTP リクエストにはこのヘッダーが含まれていません。なぜ私のメソッドで処理されるのですか?
2種類のHTTP Requestとの違いは?同じように扱われますか?なぜ?
どうもありがとうございました
アンドレア