strutsで1つのactionから別のactionにジャンプ
通常actionでサービスを利用して業務を処理した後、直接
return mapping.findForward("myVIew");
このような方法でページにジャンプします.
現在、actionでサービスが完了した後、ページにジャンプする必要はなく、現在の結果を別のaction処理に直接伝える(注:このactionは既成)という状況に遭遇していますが、上記のように次のactionに値を伝えることはできません.検索すると、request/sessionで値を伝えることができますが、簡単には以下のように処理できます.
JAvaコード
他のいくつかの解決策は
1つ目の方法は、コンフィギュレーションファイルcontextRelativeプロパティをtrueに設定し、contextに対するパスを使用してforward検索を行うことです.
path="/moduleB/index.do"redirect="true"/>
もう1つのモジュールを切り替える方法は、SwitchActionを使用することです.要求に2つのパラメータを含める必要があります.1つはprefixで、モジュールの接頭辞名を指定します.1つはpageで、モジュールに対するリソースパスを指定します.たとえば、次のように設定できます.
path="/toModule"
type="org.apache.struts.actions.SwitchAction">
return new ActionForward("/toModule.do?prefix=/syscollection/chgbiz/chgperson&page=/showChgpersonDoListAC.do");
もう1つ:
例えばあなたのLOGINからregisterまで.action
register.action
/index.jsp
このtype="redirect"を必ず付けてください
または
action名
/index.jsp
以下は私が見たより完全なstrutsアーキテクチャのジャンプの説明です.
1.完全なアクション
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
まず、StrutsのActionServiceletは要求を受信し、struts-configに従う.xmlの構成は対応するmapping(マッピング)に位置決めされる.次に、formの範囲がrequestであるか、定義された範囲でこのformが見つからない場合は、新しいformインスタンスを作成します.formインスタンスを取得した後、reset()メソッドを呼び出し、フォームのパラメータをformに挿入します.validateプロパティがfalseでない場合、validate()メソッドを呼び出します.validate()が空でないActionErrorsを返すとinput属性で指定されたURIに移動され、空のActionErrorsを返すとActionのexecute()メソッドが実行され、返されたActionForwardに基づいてターゲットURIが決定される.
このような効果は、execute()はvalidate()が成功した後にのみ実行されます.Input属性はURIを指定します.
2.Formのみのアクション
type="org.apache.struts.actions.ForwardAction"
name="someForm"
input="someJSP.jsp"
parameter="someOtherJSP.jsp"
/>
まず、Strutsは定義されたscopeでsomeFormを検索し、見つかったら再利用し、見つからない場合は新しいインスタンスを作成します.formインスタンスを取得した後、reset()メソッドを呼び出し、フォームのパラメータをformに挿入します.validateプロパティがfalseでない場合、validate()メソッドを呼び出します.validate()が空でないActionErrorsを返すとinput属性で指定されたURIに移動し、空のActionErrorsを返すとparameter属性で指定されたターゲットURIに移動します.
このような効果は、actionクラスが私たちのビジネスロジックを保存できないため、書き込む必要があるすべてのロジックはformのreset()またはvalidate()メソッドにしか書けません.validate()の役割は、ビジネス・レイヤの検証とアクセスです.ここでのactionマッピングにはforwardは含まれていないので(意味もない)、リダイレクトはできず、デフォルトのforwardしか使えません.このようなformのみのactionは、データ取得を処理し、forwardを別のJSPに表示するために使用することができる.
3.アクションのみのアクション
type="somePackage.someActionClass">
input="someJSP.jsp"
まず、ActionServiceletが要求を受信した後、actionクラスインスタンスを取得し、execute()メソッドを呼び出す.次に、返されたActionForwardに基づいて、指定されたURIまたはactionにforward、forwardを構成中に探します.
これは、formインスタンスがexecute()メソッドに渡されないため、execute()は自分で要求からパラメータを取得しなければならないという効果です.Actionはforwardまたはリダイレクトすることができる.このアクションはHTML FORMでコミットされたリクエストを処理することができず,リンク式のリクエストしか処理できない.
4.JSPのみのアクション
type="org.apache.struts.actions.ForwardAction"
parameter="someOtherJSP.jsp"
/>
まず、ActionServiceletが要求を受けた後にForwardActionのexecute()メソッドを呼び出し、execute()は構成されたparameter属性値に基づいてそのURIにforwardを渡す.
このような効果は、formがインスタンス化されていないことです.比較的現実的な状況は、formがrequestより高いレベルの範囲で定義されている可能性があります.あるいは、このactionは、アプリケーションがコンパイルされた後にシステムパラメータとして使用され、システムを再コンパイルする必要がなく、このプロファイルを変更するだけです.
5.2つのactionが1つのformに対応
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
type="somePackage.someOtherActionClass">
name="someForm"
input="someOtherJSP.jsp"
個々のactionごとに,処理上完全なactionと実質的な違いはない.この組合せモードは、コマンドオブジェクト(form)を伝達するために使用することができる.次のactionでもformのreset()メソッドとvalidate()メソッドが呼び出されるので、formの情報が書き換えられないことを確認する必要があります.
処理の仕方は大きく2つに分けられます.
a)requestにインジケータを入れて、前のactionが意図的であることを示し、後のactionがそのformの値を保持できるようにします.これはforwardを使用する場合にのみ使用できます.b)forwardではなくredirectを使用する場合、session以上のレベルにインジケータを配置し、コマンドチェーンの最後のループでこのインジケータをクリアすることができます.
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
type="somePackage.someOtherActionClass">"
name="someOtherForm"
input="someOtherJSP.jsp"
この組合せ方式は前のプロセスではあまり区別されていませんが、2つのactionに対してそれぞれformを提供しているので、コードがより明確に見えます.そこで、WEBアプリケーションの入力と出力を別々に処理することができます.注目すべきは、後のactionもformにパラメータを書き込もうとしますが、a)後のformで別の属性名を使用することができます.
b)getterのみを提供し、setterは提供しない.
大体の処理はこうです.
前のactionは入力、検証を受信し、データをビジネス層または永続層に書き込み、後のactionにリダイレクトし、後のactionは手動でビジネス層/永続層からデータを取り出し、formに書き込み(他の方法で)、フロントJSP表示に渡す.
このような利点は、入力formの値を保持する必要がないため、forwardではなくredirectを使用することができます.これにより、2つのaction間の結合度が低下し、不要な重複コミットも回避される.
servletで別のservletに直接ジャンプするにはresponse.sendRedirect("UserInforServlet");
return mapping.findForward("myVIew");
このような方法でページにジャンプします.
現在、actionでサービスが完了した後、ページにジャンプする必要はなく、現在の結果を別のaction処理に直接伝える(注:このactionは既成)という状況に遭遇していますが、上記のように次のactionに値を伝えることはできません.検索すると、request/sessionで値を伝えることができますが、簡単には以下のように処理できます.
JAvaコード
1.Boolean teamUser = true;
2.Boolean doEdit = false;
3.
4.return new ActionForward("/myaction.do?userid="+userid + "&teamUser="+teamUser + "&doEdit="+doEdit);
他のいくつかの解決策は
1つ目の方法は、コンフィギュレーションファイルcontextRelativeプロパティをtrueに設定し、contextに対するパスを使用してforward検索を行うことです.
もう1つのモジュールを切り替える方法は、SwitchActionを使用することです.要求に2つのパラメータを含める必要があります.1つはprefixで、モジュールの接頭辞名を指定します.1つはpageで、モジュールに対するリソースパスを指定します.たとえば、次のように設定できます.
type="org.apache.struts.actions.SwitchAction">
return new ActionForward("/toModule.do?prefix=/syscollection/chgbiz/chgperson&page=/showChgpersonDoListAC.do");
もう1つ:
例えばあなたのLOGINからregisterまで.action
このtype="redirect"を必ず付けてください
または
以下は私が見たより完全なstrutsアーキテクチャのジャンプの説明です.
1.完全なアクション
name="someForm"
input="someJSP.jsp"
まず、StrutsのActionServiceletは要求を受信し、struts-configに従う.xmlの構成は対応するmapping(マッピング)に位置決めされる.次に、formの範囲がrequestであるか、定義された範囲でこのformが見つからない場合は、新しいformインスタンスを作成します.formインスタンスを取得した後、reset()メソッドを呼び出し、フォームのパラメータをformに挿入します.validateプロパティがfalseでない場合、validate()メソッドを呼び出します.validate()が空でないActionErrorsを返すとinput属性で指定されたURIに移動され、空のActionErrorsを返すとActionのexecute()メソッドが実行され、返されたActionForwardに基づいてターゲットURIが決定される.
このような効果は、execute()はvalidate()が成功した後にのみ実行されます.Input属性はURIを指定します.
2.Formのみのアクション
name="someForm"
input="someJSP.jsp"
parameter="someOtherJSP.jsp"
/>
まず、Strutsは定義されたscopeでsomeFormを検索し、見つかったら再利用し、見つからない場合は新しいインスタンスを作成します.formインスタンスを取得した後、reset()メソッドを呼び出し、フォームのパラメータをformに挿入します.validateプロパティがfalseでない場合、validate()メソッドを呼び出します.validate()が空でないActionErrorsを返すとinput属性で指定されたURIに移動し、空のActionErrorsを返すとparameter属性で指定されたターゲットURIに移動します.
このような効果は、actionクラスが私たちのビジネスロジックを保存できないため、書き込む必要があるすべてのロジックはformのreset()またはvalidate()メソッドにしか書けません.validate()の役割は、ビジネス・レイヤの検証とアクセスです.ここでのactionマッピングにはforwardは含まれていないので(意味もない)、リダイレクトはできず、デフォルトのforwardしか使えません.このようなformのみのactionは、データ取得を処理し、forwardを別のJSPに表示するために使用することができる.
3.アクションのみのアクション
input="someJSP.jsp"
まず、ActionServiceletが要求を受信した後、actionクラスインスタンスを取得し、execute()メソッドを呼び出す.次に、返されたActionForwardに基づいて、指定されたURIまたはactionにforward、forwardを構成中に探します.
これは、formインスタンスがexecute()メソッドに渡されないため、execute()は自分で要求からパラメータを取得しなければならないという効果です.Actionはforwardまたはリダイレクトすることができる.このアクションはHTML FORMでコミットされたリクエストを処理することができず,リンク式のリクエストしか処理できない.
4.JSPのみのアクション
parameter="someOtherJSP.jsp"
/>
まず、ActionServiceletが要求を受けた後にForwardActionのexecute()メソッドを呼び出し、execute()は構成されたparameter属性値に基づいてそのURIにforwardを渡す.
このような効果は、formがインスタンス化されていないことです.比較的現実的な状況は、formがrequestより高いレベルの範囲で定義されている可能性があります.あるいは、このactionは、アプリケーションがコンパイルされた後にシステムパラメータとして使用され、システムを再コンパイルする必要がなく、このプロファイルを変更するだけです.
5.2つのactionが1つのformに対応
name="someForm"
input="someJSP.jsp"
name="someForm"
input="someOtherJSP.jsp"
個々のactionごとに,処理上完全なactionと実質的な違いはない.この組合せモードは、コマンドオブジェクト(form)を伝達するために使用することができる.次のactionでもformのreset()メソッドとvalidate()メソッドが呼び出されるので、formの情報が書き換えられないことを確認する必要があります.
処理の仕方は大きく2つに分けられます.
a)requestにインジケータを入れて、前のactionが意図的であることを示し、後のactionがそのformの値を保持できるようにします.これはforwardを使用する場合にのみ使用できます.b)forwardではなくredirectを使用する場合、session以上のレベルにインジケータを配置し、コマンドチェーンの最後のループでこのインジケータをクリアすることができます.
name="someForm"
input="someJSP.jsp"
name="someOtherForm"
input="someOtherJSP.jsp"
この組合せ方式は前のプロセスではあまり区別されていませんが、2つのactionに対してそれぞれformを提供しているので、コードがより明確に見えます.そこで、WEBアプリケーションの入力と出力を別々に処理することができます.注目すべきは、後のactionもformにパラメータを書き込もうとしますが、a)後のformで別の属性名を使用することができます.
b)getterのみを提供し、setterは提供しない.
大体の処理はこうです.
前のactionは入力、検証を受信し、データをビジネス層または永続層に書き込み、後のactionにリダイレクトし、後のactionは手動でビジネス層/永続層からデータを取り出し、formに書き込み(他の方法で)、フロントJSP表示に渡す.
このような利点は、入力formの値を保持する必要がないため、forwardではなくredirectを使用することができます.これにより、2つのaction間の結合度が低下し、不要な重複コミットも回避される.
servletで別のservletに直接ジャンプするにはresponse.sendRedirect("UserInforServlet");