1

この期間、私は 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"}

今、私はそれについていくつかの疑問を持っています:

  1. 最初のリンクは、 /mapping/producesに対する HTTP リクエストを生成します。

    2 番目のリンクは、/mapping/ produces.jsonに対する HTTP リクエストを生成します。

    私のメソッドは、"/mapping/produces" という形式の URL に対する HTTP リクエストを処理します。なぜこのメソッドは、.json で終わる 2 番目のタイプの HTTP リクエストも処理するのですか?

  2. 最初の HTTP リクエストは.json拡張子で終わらないため、前の Jquery コードが実行されると、if 本文に入力しないため、次のヘッダーが設定されません: ("Accept", "application/json")私のHTTPリクエストのために。

    私のメソッドの @RequestMapping アノテーションには、 produces=MediaType.APPLICATION_JSON_VALUE要素が含まれています。ドキュメントを読んで理解したところでは、ヘッダーに「Accept」、「application/json」を値として含む Accept ヘッダーがある場合にのみ、このメソッドは HTTP リクエストを処理する必要があります。

    この HTTP リクエストにはこのヘッダーが含まれていません。なぜ私のメソッドで処理されるのですか?

  3. 2種類のHTTP Requestとの違いは?同じように扱われますか?なぜ?

どうもありがとうございました

アンドレア

4

1 に答える 1

1

Springによるコンテンツネゴシエーションの効果が見えてきていると思います。HTTP 自体は、応答に必要なコンテンツ タイプを示す手段を 1 つだけ提供します。それはAcceptヘッダーです。Spring は、コンテンツ ネゴシエーション Bean を介して 2 つの追加手段を提供します。URI サフィックス (.jsonこの場合) を特定のコンテンツ タイプの要求として解釈できます。Bean は、コントローラ クラスを渡す前にサフィックスを取り除きます。

于 2013-06-16T22:58:53.493 に答える