2

編集: 質問のタイトルと内容を変更しました。JSON プラグイン ガイドを読むと、プラグインがこのクエリ マップではなく JSON 文字列を想定している可能性があることに気付きました。その場合、通常は代わりに GSON を使用します。問題は次のようになると思います: Struts2 は次のようなクエリ文字列の型変換をどのように処理できますか:sort[0][field]=status&sort[0][dir]=asc


Struts2 バックエンドとのインターフェースに Kendo UI グリッドを使用しています。サーバーに送信される AJAX 要求は、次の形式 (GET クエリ文字列) に従います。

take=5&skip=0&page=1&pageSize=5&sort%5B0%5D%5Bfield%5D=status&sort%5B0%5D%5Bdir%5D=asc

または(エスケープなし):

take=5&skip=0&page=1&pageSize=5&sort[0][field]=status&sort[0][dir]=asc

基本的に、Kendo UI グリッドはフラット化された JSON オブジェクトをサーバーに送信します。したがって、入力を取得するために、次のような並べ替えモデル オブジェクトを作成します。

public class SortModel {
    private String field;
    private String dir;
}

これを Struts2 アクションに入力する変数として含めます。

private SortModel[] sort;

ただし、これは AJAX リクエストが入ったときに Struts2 によって読み込まれることはありません。JSON インターセプターも追加しようとしましたが、編集で説明されているように、その逆シリアル化プロセスを誤解していたと思います。

とにかく、上記のクエリ文字列などを使用してStruts2型変換を行った人はいますsort[0][field]=status&sort[0][dir]=ascか?

4

2 に答える 2

3

並べ替え[0][フィールド]=ステータス&並べ替え[0][ディレクトリ]=昇順

上記は適切な JSON ではありません。文字列は引用符で囲む必要があります。これが完了すると、次のようになります。

その場合、フォーム内のフィールド (または json パラメーター)name[i]['s']の値が文字列で、i が整数、s が任意の文字列である場合、次のようにサポートされます。

private List<Map<String, String>> name = new ArrayList<Map<String, String>>();

//getter AND setter required

PS: Struts2 を使用すると、リストのリストのリストにインデックスを付けることができます...問題なく。

于 2012-07-31T06:15:59.610 に答える
0

わかった。

バニラの Struts2 は、この形式のクエリ文字列を受け入れないことがわかりましたobj[idx][property](これについては自由に修正してください)。クエリ文字列をその特定のオブジェクトの配列に変換することを期待していました。

Struts2 が受け入れるのは、obj[idx].property正しく変換される形式ですprivate Object[] obj

したがって、これに対する可能な解決策は次のようになると思います。

  1. JSON.stringify(jsonObj) クエリ文字列に渡す前に、ラ&jsonData=[{property:'value'}]-この場合、Kendo UIグリッドにはクエリパラメーターを変更できるインターセプターのようなイベントがないように見えるため、これはできません。または、

  2. この特定の形式を処理するカスタム型コンバーターを実装します。または、

  3. サーバーに送信される前に AJAX リクエストを傍受し、jQuery.ajaxSend などを使用してクエリ文字列を再フォーマットします。

    $(body).ajaxSend(function(event, req, settings){
        console.log(settings.url); //contains the url string to replace
        settings.url = settings.url.replace(some_regex, 'correct format');
    });
    
于 2012-07-31T03:54:17.677 に答える