2010-12-06 10 views
4

私は、3つのJSPページとStruts 1.3を使用する3つのStrutsアクションで構成されるウィザードのようなインターフェイスを作成しています。このフローは次のようなものです:page1> action1 - > page2> action2 - > page3> action3StrutsセッションフォームBeanは状態を保持しません

リクエスト間でデータを共有するセッションフォームBean(セッションスコープのアクションフォーム)を使用します。私が抱えている問題は、page2で提出したデータは、アクション2では利用可能ですが、アクション3では利用できないということです。私は、これらのデータを保持するためにページ3上にフォームを持っていない可能性があります。 action3通常のフォームの送信の代わりにjQueryのポストメソッドを介して、私は本当にわからないです。

私はほぼ一日中、すべてのインターネットを掘っていますが、まだ運がありません。誰も助けてくれますか?どうもありがとう。

+0

このStrutsは1ですか? –

+1

はい、それはstruts 1.3 – Sandeep

+0

です。セッションを 'request.getSession()。setAttribute(KEY、VALUE)'フォームに保存していますか? –

答えて

0

action2とaction3のpage2のフォームBeanにはどのようにアクセスしていますか。
間違った方法でアクセスしているとします。 invalidCastなどに関する例外が発生していますか?

+0

アクションクラスでは、次のようにフォームにアクセスします。MyForm myForm =(MyForm)form; 例外はスローされず、アクション2では正しいデータを取得できました。すなわちmyForm.getName()。しかし、アクション3の同じコードでは、フォームの新しいインスタンスが作成されたかのように、すべてのプロパティが空になります。 – Sandeep

5

StrutsConfig.xmlのアクションに同じフォームを割り当てている可能性があり、ClassCastExceptionを与えていないとします。ところで、あなたはアクション2のものに充填した同じフォームBeanにアクセスしたい場合は、アクション(2及び3)の両方のをするActionMapping ためstrutsConfigファイルで次の

  1. ルックを行います。別のアクション(例:action2の場合はform2、action3の場合はform3)ごとに異なるフォーム名を使用してください。
  2. Action3で
  3. 、代わりにフォームをキャストする、アクションの両方が同じ形式を使用しているので、上記の理由は、支柱はそれを上書きしている場合があります。このform2 = (FormBean2) session.getAttribute("form2");

を使用しています。うまくいけば、あなたの問題を解決します。

+0

ありがとう、私は私の問題を解決した。私はStrutsがこのような単純なことを行うためのきれいな方法を提供してくれることを願っています:-) – Sandeep

1

ありがとうございます。ここで私がどのように私の問題を解決したのですか?私はこのソリューションが本当に好きではありませんが、おそらく私が見つけることができる最もきれいなものです。

3ページ目では、私がアクション3で利用できるプロパティのための隠しフィールドを追加しました。Strutsはこれらの隠しフィールドに値を格納し、フォームが再びサブミットされると、データはアクションフォーム。

Strutsはこのように動作します.3ページ目を読み込むと、3ページ目のフォームにmyFormの値が設定されます。フォームが送信されると、プロセスは逆になり、myFormにユーザーフォームの値が入力されます。問題は、myFormにユーザーが送信した値を入力する前に、myFormのプロパティをリセットすることです。また、リセッティング後、これらのフィールドの値が見つからないため、空のままになります。

私はStrutsがそのように動作するのは理にかなっているとは思っていませんが...そうです。

4

フォームのreset()メソッドがリクエストごとに呼び出されているため、状態が失われています。これをプログラムで制御することができます。

public class MyForm extends ActionForm { 
    boolean reset = true; 
    private String[] checkboxes = {}; 

    @Override 
    public void reset(ActionMapping mapping, HttpServletRequest request) { 
     if (reset) { 
      this.checkboxes = new String[]; 
      // etc 
     } 

     reset = true; 
    } 

    public void doNotReset() { 
     reset = false; 
    } 
} 

do2をdoNotReset()をフォームで呼び出します。

関連する問題