4

クライアント側からサーバーにデータを送信し、ファイルのダウンロードに処理しようとしています。ファイルのダウンロードを初期化するため (AJAX ではなく)、単純な HTML フォームを使用しています。フォーム フィールドの 1 つが項目の配列です。(他の 2 つは名前と説明の文字列です)。フォームを送信する前に、このフィールドを文字列 (JSON.stringify) にシリアル化しています。

サーバー側では、これを単一の型または 3 つの個別の型 (文字列 + 文字列 + リスト/配列) に変換するために、100 万の手法 (@ModelAttribute と @RequestBody、さまざまな jackson マッピング Bean 構成) を試しました。

私が見つけた例はAJAX専用でした...誰かが実際の例または説明を提供できますか?

=======

更新:コレクションを JSON.stringify して入力の 1 つに渡すことで回避策を実装しました。サーバー側では次のようにします。

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
  public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsListForm exportSectionsListForm) {
Section[] sectionObjects = gson.fromJson(exportSectionsListForm.getSections(), Section[].class);
...

文字列のみを含む ExportSectionsListForm オブジェクトを使用:

public class ExportSectionsListForm {
private String name;
private String url;
private String rssUrl;
private String sections;
...
(omitting ctor, getters and setters)

さらに、この有望なリンクを見つけました: http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ しかし、試していませんでした - 入力要素を動的に生成する必要があるようですこれは機能しますが、実際には正しい解決策かもしれません。誰もこれを試しましたか?

4

2 に答える 2

8

@ModelAttribute タグは、フォームの投稿に基づいてオブジェクトを構築しようとします。フォームの値を JSON にシリアライズしているため、これは機能しません。@RequestBody は、リクエスト本文を表す String を提供するだけです。したがって、渡される JSON を表す文字列を取得し、Jackson of FlexJSON (または使用する任意の JSON ライブラリ) を使用して JSON をデマーシャリングできます。ただし、これが最善のアプローチであるかどうかはわかりません。

そもそもなぜフォームを JSON にシリアライズする必要があるのか​​疑問に思います。Spring は、Lists/Maps を含むフォームを問題なく処理します。@ModelAttribute を使用してフォームを送信し、「配列」とリスト、またはコントローラーで期待するものを作成するだけです。したがって、あなたの例を正しく解釈している場合、ModelAttribute は次のようになります。

public class ExportSectionsFormBean {
  private String name;
  private String url;
  private String rssUrl;
  private List<String> sections;
  /* getters/setters */
}

次に、私の Controller メソッドは次のようになります。

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel")
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean ) {
  /* Do whatever with your  */
}

フォーム側では、Spring JSTL タグを使用して、「セクション」フィールドを次のようにします。

<form:input path="sections[0]" />
<form:input path="sections[1]" />

または、HTML を使用する場合は、

<input type="text" name="sections[0]" id="sections0" />
<input type="text" name="sections[1]" id="sections1" />

これは、上記の JSTL タグによって生成されるものです。「sections」の値が「section[#]=value」として HTTP リクエストに入れられている限り、設定は完了です。

于 2013-03-19T12:34:01.373 に答える