0

今回は、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つのリクエストの違いは何ですか?

4

0 に答える 0