1

2 つのリスト変数を持つポートレット コントローラーがあります。

private List<MyObject1DTO> list1;
private List<MyObject2DTO> list2;

私の JSP では、AJAX リクエストを使用してオブジェクトをコントローラに送り返します。コントローラは、ユーザーが送信した内容に応じてオブジェクトをいずれかのリストに追加します。ユーザー セッションがタイムアウトすると、これらのリストはどうなりますか?

ユーザーがこれらのリストにオブジェクトを追加し (大きなフォームです)、フォームの残りの部分を埋めて [送信] を押すと、それらのリストの検証が失敗することがあります (空にすることはできません)。ユーザーがフォームに入力しているときにセッションが何らかの形でタイムアウトし、それらのリストがクリアされるかどうか疑問に思っています。リストが空になる原因として、他に何が考えられるでしょうか?

私がこれを行った方法は設計上の欠陥ですか?これを行うより良い方法はありますか?

とても大きなフォームで、たくさんのフィールドがあります。これらのオブジェクトを作成し、AJAX 要求によってリストに送信するフォームには 2 つの異なる部分があります。コントローラーでajaxリクエストを処理しているとき、モデル自体にアクセスできないため、オブジェクトをモデルに追加できません。だから私はコントローラのリストでそれをしました。

編集:

@Controller("myController")
@RequestMapping("VIEW")
public class MyController {
  private List<MyObject1DTO> list1;
  private List<MyObject2DTO> list2;    
  @ModelAttribute(value = "myFormDTO")
  public MyFormDTO getMyFormDTO() {
  ....
  }
  // Controller mappings etc.
}

フォームを表すモデル属性としてバインドされたオブジェクトがあります。ただし、これにはそれらのリストは含まれません。オブジェクトをリストに追加するために使用する ajax リクエストでこのモデル属性にアクセスする方法がわからない (可能だとは思わない) ためです。基本的に、ユーザーに表示されるフォームは、モデル属性にバインドされたフィールドです。次に、ユーザーが項目を追加できる 2 つの異なる「バスケット」(リスト) があります (コントローラー内のリストには、ユーザーが追加したオブジェクトが保持されます)。バスケットにアイテムを追加する方法は、ajax リクエストによるものです。

4

1 に答える 1

1

Spring Webflow を見るか、モデル属性をセッション属性として設定します。

次のようにクラスに注釈を付けることができます

@Controller("myController")
@RequestMapping("VIEW")
@SessionAttributes("myFormDTO")
public class MyController {
    ....
}

spring はモデル属性をセッションに追加します。これにより、コントローラーメソッドでモデル属性にアクセスできるようになります。

@RequestMapping("/ajax/addToList1")
public void ajaxAddToList1(@ModelAttribute("myFormDTO") MyFormDTO form, ....) {
    form.getList1().add(.....);
}

Springコントローラーはデフォルトでシングルトンであり、同時ユーザーが互いに干渉する可能性があるため、コントローラーメンバー変数を使用しないでください( @Scope アノテーションを使用しない限り)。

于 2012-09-11T12:15:36.430 に答える