0

STSダッシュボードからダウンロード可能なSpring MVC showwcaseを勉強しています。

現在、Spring MVC がリソースをマッピングする方法を研究していますが、次のことを理解するのに問題があります。

したがって、「/mapping/produces」フォルダーへの HTTP リクエストを生成する次のリンクがあります。

    <li>
        <a id="byProducesAcceptJson" class="writeJsonLink" href="<c:url value="/mapping/produces" />">By produces via Accept=application/json</a>
    </li>

ご覧のとおり、このリンクには「writeJsonLink」という名前のクラスがあり、このクラスには、リンクのクリックでトリガーされる次の JQuery 関数が定義されています。

$("a.writeJsonLink").click(function() {

    var link = $(this); // Variable that referer the clicked link in the DOM

    // Execute AJAX call
    $.ajax({ 
        url: this.href,     // Address to which the request is addressed        
        beforeSend: function(req) {     // Before send the Http Request call a function passing it the referer to the HTTP Request
            if (!this.url.match(/\.json$/)) {                               // If the url of the clicked link end with .json
                req.setRequestHeader("Accept", "application/json");         // Add to the HTTP Request theheader Accept: application/json 
            }
        },
        success: function(json) {
            MvcUtil.showSuccessResponse(JSON.stringify(json), link);
        },
        error: function(xhr) {
            MvcUtil.showErrorResponse(xhr.responseText, link);
        }});
    return false;
});

OK、コードの動作を理解するためにコードにコメントしました (私は Javascript と JQuery の初心者です)。このスクリプトの動作は次のように思われます。 Web アプリケーションへの ajax 呼び出しは、クリックされたリンクの URL が .json 拡張子で終わるアドレスであるかどうかを確認します。

この場合、私の URL は .json で終わっていません (私の URL は FOLDER: /mapping/produces に向けられており、.json ファイルに向けられていないため)、関数はヘッダー "Accept" を追加しません。 application/json" を HTTP リクエストのボディ フィールドに追加します。

さて、私の問題は、このコードが何をするのかを理解することです:

        success: function(json) {
            MvcUtil.showSuccessResponse(JSON.stringify(json), link);
        },

成功した場合、json という名前のパラメーターを持つ関数を呼び出します。この関数は、単純に showSuccessResponse という名前のメソッドを呼び出して、String に変換された json obkect とリンクを渡します。

これで、showSuccessResponse が何をするかがわかりました (これを使用して、ページ内のクリックされたリンクの横にメッセージを表示する span タグを作成します)。

問題は次のとおりです。成功した場合に関数に渡すjsonパラメーターは誰ですか。このパラメーターを文字列に変換していますが、いつ、どこでIDを作成しましたか?

リンクをクリックして例を実行すると、(リンクの隣に) 次のメッセージが表示されます: {"foo":"bar","fruit":"apple"}

次のキー\値の内容を持つJSONオブジェクトが作成されたようです:

フー:バー

果物:りんご

しかし、それはどこで作成されたのですか?!?! ブーブー

リンクをクリックしてメソッドを実行すると、スタックトレースに次のメッセージが表示されます。

01:27:38 [tomcat-http--28] DispatcherServlet - DispatcherServlet with name 'appServlet' processing GET request for [/spring-mvc-showcase/mapping/produces]
01:27:38 [tomcat-http--28] RequestMappingHandlerMapping - Looking up handler method for path /mapping/produces
01:27:38 [tomcat-http--28] RequestMappingHandlerMapping - Returning handler method [public org.springframework.samples.mvc.mapping.JavaBean org.springframework.samples.mvc.mapping.MappingController.byProducesJson()]
01:27:38 [tomcat-http--28] DispatcherServlet - Last-Modified value for [/spring-mvc-showcase/mapping/produces] is: -1
01:27:38 [tomcat-http--28] RequestResponseBodyMethodProcessor - Written [JavaBean {foo=[bar], fruit=[apple]}] as "application/json" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@360eb2b8]
01:27:38 [tomcat-http--28] DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'appServlet': assuming HandlerAdapter completed request handling
01:27:38 [tomcat-http--28] DispatcherServlet - Successfully completed request

何が起こるか理解するのを手伝ってもらえますか?

4

1 に答える 1

1

サーバー側のコードも見てください。/mapping/produces URLがMappingController のハンドラー メソッドにマップされていることがわかります。

@RequestMapping(value="/mapping/produces", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody JavaBean byProducesJson() {
    return new JavaBean();
}

ここで重要なことは次の 2 つです。

  • 戻り値の型に@ResponseBodyアノテーションを配置することにより、Spring は返された JavaBean インスタンスを HTTP レスポンスに直接シリアル化します。
  • Produce=MediaType.APPLICATION_JSON_VALUEは、返されたオブジェクトをシリアル化するときに JSON 形式を使用する必要があることを Spring に伝えます。

ご覧のとおり、このコントローラー メソッドは、次のデフォルト プロパティを持つJavaBean クラスの新しいインスタンスを返すだけです。

public class JavaBean {
...
    private String foo = "bar";
    private String fruit = "apple";
...
}

その結果、前述の{"foo":"bar","fruit":"apple"} JSON が応答で取得されます。

また、ログから、URL を呼び出したときにどのコントローラー メソッドがリクエストを処理していたかを確認できます。

01:27:38 [tomcat-http--28] RequestMappingHandlerMapping - Looking up handler method for path /mapping/produces
01:27:38 [tomcat-http--28] RequestMappingHandlerMapping - Returning handler method [public org.springframework.samples.mvc.mapping.JavaBean org.springframework.samples.mvc.mapping.MappingController.byProducesJson()]
于 2012-11-28T11:11:27.767 に答える