6

現在、Spring MVC を使用して学習しています。開発中、 Ajax と jQueryで 4 種類のフォーム処理を使用しました。さて、それぞれの方法の長所と短所は何だろうと思っています。他にもありますか?

2 つの入力しかない非常に単純なフォームがあるとします。

<input id="name" type="text" value"Name">
<input id="active" type="checkbox">
<input type="button" onclick="submitForm()">

クライアント サイトでもサーバー サイトでもデータを検証していないと仮定しましょう。また、返されたデータの処理も省略します。サーバーにデータを送信することに興味があります。では、どのように送信を処理できますか? 私の解決策は次のとおりです。

1. PathVariable に基づくリクエスト

JS 送信リクエストは次のようになります。

function submitForm() {
    var name = jQuery("#name").val();
    var active = jQuery("#active").is("checked");

    jQuery.ajax("/Submit/Name/" + name + "/Active/"+ active + "/",
    {
        type:"POST"
    });   
}

また、コントローラー:

 @RequestMapping(value="/Submit/Name/{name}/Active/{active}/",method=RequestMethod.POST)
 publis void submitForm(@PathVariable String name, @PathVariable Boolean active)
 { //something not important here }

私の意見では長所

  • コントローラーでデータを受け取る簡単な方法、簡単な注釈で機能します
  • 基本的なデータ型 (文字列、ブール値、数値) の型照合

短所

  • 要求アドレスは必要なデータとともに増加します
  • URL の特殊文字に問題がありますか? /これについてはよくわかりませんが、チームメイトがサーバーに送信されるデータで文字として使用されるという問題を抱えていたことを覚えています

2. データ付きリクエスト

名前の付け方はわかりませんが、これはJSファイルのアイデアです:

function submitForm() {
    var name = jQuery("#name").val();
    var active = jQuery("#active").is("checked");

    var object = {name:name,active:active};

    jQuery.ajax("/Submit/",
    {
        type:"POST",
        data: object
    });   
}

そしてコントローラー:

 @RequestMapping(value="/Submit/",method=RequestMethod.POST)
 publis void submitForm(@RequestParam(value="name") String name, @RequestParam(value="active") Boolean active)
 { //something not important here }

私の意見では、最初の方法と大差ありませんが、

長所

  • 短いリクエストアドレス

短所

  • 多くのパラメーターを含むメソッド宣言は巨大になる可能性があります

3. JSON を PathVariable としてサーバーに送信する

JS ファイル内:

function submitForm() {
    var name = jQuery("#name").val();
    var active = jQuery("#active").is("checked");

    var object = {name:name,active:active};

    jQuery.ajax("/Submit/" + JSON.stringify(object),
    {
        type:"POST"
    });   
}

そしてコントローラー

 @RequestMapping(value="/Submit/{json}",method=RequestMethod.POST)
 publis void submitForm(@RequestParam(value="name") String name, @RequestParam(value="active") Boolean active)
 { 
    //now we are actually doing sth important here, cause we need to parse JSON
 }

長所

  • ショートリクエストアドレス
  • 短いメソッド宣言

短所

  • 独自の JSON 解析

4. クラスがマッピングされた RequestBody としての JSON

私のお気に入りの方法ですが、送信されたデータをラップするためだけに複数のクラスを記述する必要があるため、常に可能であるとは限りません JS:

function submitForm() {
    var name = jQuery("#name").val();
    var active = jQuery("#active").is("checked");

    var object = {name:name,active:active};

    jQuery.ajax("/Submit/",
    {
        type:"POST",
        data:JSON.stringify(object)
    });

そして Java コード:

public class Wrapper {
    private String name;
    private Boolean active;    
    //getters and setters
}

 @RequestMapping(value="/Submit/",method=RequestMethod.POST)
 publis void submitForm(@RequestBody Wrapper wrapper)
 { 
    //all data available with Wrapper class
 }

長所

  • 目的のオブジェクトへのマッピング
  • 迅速かつ簡単

短所

  • サーバーに送信されるすべてのデータのラッパーを作成する必要があります

それは私が現在知っているすべてです。感謝と批判、より良い解決策の提案などをお願いします。ありがとう!

4

3 に答える 3

2

私は主に1、2、4を行います。

Spring Roo は、1、2、および 4 のコードを自動生成します。

1、2、および 4 は、、、、、(それぞれ CRUD) を実行するかどうかによって大きく異なりますPOSTGETPUTDELETE

番号 1 - パス変数

ほとんどGETの場合、単一のアイテムです。CRUDでのREADです。

番号 2 - リクエスト パラメータ

真の REST の場合、これは、リストのページングや を使用した検索用のフィルターなどのオプションのGETパラメーター用である必要があります。リクエストボディはありません。

古い学校の REST にも使用され、POST最も重要なのは従来の HTML フォーム (別名application/x-www-form-urlencoded.

これは、POST4 よりも 2 の方がはるかに簡単なため、重要です。

番号 3 - しないでください。

他の人は理由を述べています。

番号 4 - JSON リクエスト本文

これはほとんどの場合、POSTand PUT(CRUD の C と U) に対して行われます。通常は a と組み合わせて、PathVariableどのアイテムを指定するかを指定します。

これをブラウザでテストするのは難しく、更新を行うにはクライアントが有効な形式を知っている必要があります。すなわち。名前と値のペアは、JSON/XML スキーマよりも文書化と理解が容易です。

私がやること

最近、私は #2 を行っているので、シングル ページ アプリケーション用の JSON の HTML フル ロードまたはデータのみのロードの両方をサポートできます。

リクエストごとに 2 つのメソッドを記述する必要がないように、カスタム ビュー リゾルバーを使用して行います。

それ以外の場合は、リクエストごとに 2 つのメソッドを作成する必要があります (1application/jsonつは HTML 用、もう 1 つは HTML 用)。

@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json")
public Object doJson() {}

@RequestMapping(method = RequestMethod.POST)
public Object doHtml() { //after processing redirect. }
于 2012-08-26T01:45:56.613 に答える
2

私は(2)と(4)の方法をよく使います。(2) その柔軟性のため。(4)高結合データが必要で、入力を簡単に検証したい場合、つまり、@Valid送信されたデータをバインドするために使用するコントローラーのメソッドパラメーターに注釈を追加したい場合。

于 2012-08-25T05:37:02.403 に答える
2

(1) PathVariableに基づくリクエスト

あなたが言ったように、特殊文字(など/)で問題が発生します。パスベースの URL は、短くすると最も読みやすくなります。例: /hotel/{h}/room/{r}. vsパラメータを表すために、パラメータpathとパラメータの組み合わせが使用されることがあります。requestmandatoryoptional

(2) 資料請求

Request Parametersこれは、パラメーターのさまざまな組み合わせを管理するだけでなく、簡単に追加/削除できる柔軟性を提供する優れたアプローチです。

(3) JSON を PathVariable としてサーバーに送信する

このアプローチには と同じ技術的問題があると思います(1)。適切なエスケープがなければ (また、現時点で Spring/はどのような形式でも処理できません)、このオプションは実行できません。(4) これを行う方法です。

(4) クラスがマッピングされた RequestBody としての JSON

これは、複雑なオブジェクトに適しています。通常、Spring は json を Java オブジェクトに直接マップするのに役立ちます。トレードオフは、ブラウザから簡単にテストできないことです。これは、RESTful サービスでは一般的なパターンだと思いますが、必ずしも伝送テクノロジを決定するわけではありません。


要約すれば、

  • クエリ パラメータの使用は簡単で、ユーザーはブラウザのアドレス バーから直接サービスをテストできます。

  • リクエスト本文でオブジェクトを使用すると、複雑なデータを柔軟に処理できるようになりますが、ブラウザーから簡単にテストすることはできません。

のような特殊文字を含まない整形式のデータ/が送信されない限り、パス変数オプションは春とうまく調和しません。

于 2012-08-24T23:33:42.030 に答える