3

diSTSダッシュボードからダウンロード可能なSpringMVSShowcaseを勉強しています。Springがリクエストをどのようにマッピングするかを調査していますが、次のことを理解するのに問題があります。

送信ボタン付きのこのフォームがあります。

        <li>
            <form id="byConsumes" class="readJsonForm" action="<c:url value="/mapping/consumes" />" method="post">
                <input id="byConsumesSubmit" type="submit" value="By consumes" />
            </form>
        </li>

送信ボタンをクリックすると、JSONオブジェクトを作成するJquery関数がHTTP Post Requestによって渡されます。これは、JQuery関数のコードです。

$("form.readJsonForm").submit(function() {          

    var form = $(this);                 // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento click (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 path, 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オブジェクトは、データ変数で表され、次のキー\値が含まれています:{\" foo \":\ "bar \"、\ "fruit \":\ "apple\"}

何かのようなもの:

foo:bar

果物:リンゴ

これで、コントローラーにこの要求を処理するメソッドがあります。

@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
    return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}

したがって、このメソッドが「マッピング/消費」パス(POSTリクエストのみ)に向けてHTTP POSTリクエストを処理することは明らかですが、次の項目の意味についてはよくわかりません。

  1. 消費=MediaType.APPLICATION_JSON_VALUE:これは正確にはどういう意味ですか?このメソッドはJSON形式のオブジェクトを受け取るので、何らかの方法で解析できるとSpringに伝えていると思いますが、それについてはよくわかりません。ドキュメントにはありません。

    何が消費されますか?変数または注釈のようなもの?これは@RequestMappingアノテーションのパラメーターであるため、理解できませんが、Googleで検索すると、スタンドアロンのアノテーションとして使用されていることがわかります...

  2. byConsumes()メソッドには、次の入力パラメーターがあります:@RequestBodyJavaBeanjavaBean。Springのドキュメントを読むと、次のことがわかります。@RequestBodyメソッドパラメーターアノテーションは、@ RequestBodyアノテーションを使用して、メソッドパラメーターをHTTPリクエスト本文の値にバインドする必要があることを示しています。

    したがって、実際には、これは、HTTPリクエストの本文フィールド内にJSONオブジェクトがあり、このアノテーションを使用して、クラスJavaBeanを持つjavaBeanという名前のオブジェクトに変換していることを意味しますか?

    私の断言が本当なら...JavaBeanタイプのオブジェクトはどのようなオブジェクトですか?いくつかの変数と対応するgetterおよびsetterメソッドのみを含むオブジェクト?(前のケースでは、2つの変数のみを含むオブジェクト:最初の変数はfooという名前で値が「bar」、2番目の変数は名前がfruitで値が「apple」)

正しいですか?

どうもありがとうアンドレア

4

1 に答える 1

8

このコードが何をしているのかについてのあなたの解釈は本質的に正しいです。

「Consumes」は@RequestMapping、メソッドが処理する HTTP コンテンツ タイプを示すために使用されるアノテーションのパラメーターです。この場合、メソッドが JSON を入力として受け取ることを Spring に示しています。詳細については、こちらの Spring ドキュメントを参照してください。同様に、メソッドが XML を「消費する」ことを示すこともできます。

注釈に関して@RequestBodyは、これは、注釈付きのメソッド パラメータを HTTP リクエストの本文から構成する必要があることを示すために使用されます。そのドキュメントはhereです。Spring は通常、リクエストで HTTP パラメータの名前を取得し、setter メソッドを使用して Java Bean に値を設定することでこれを行います。

あなたの例では、Spring はメソッドのアノテーションを検査し、リクエストの本文を type のオブジェクトにマップする必要があると判断しますJavaBean。そのクラスのインスタンスが自動的に作成され、(メッセージ コンバーターを介して)JavaBeanインスタンスが生成されます。Spring はリフレクションを使用してこれらすべてを行いますが、Spring が実行するコードは基本的に次のようになります。

JavaBean parameter = new JavaBean();
parameter.setFoo("bar");
parameter.setFruit("apple");

フィールドと. JavaBean_foofruit

于 2012-11-26T19:18:37.513 に答える