次のようなstruts-configの単純な構成を想定します。
<action path="/action1"
type="...."
name="form1"
scope="...">
<forward name="success" path="/action2.do"/>
</action>
<action path="/action2"
type="...."
name="form2"
scope="...">
...
</action>
2番目のアクションに転送するには、を使用するだけreturn mapping.findForward("success");
で、フローが2番目のアクションに転送されます。ActionFormごとに次のような構成があると仮定します。
<form-beans>
<form-bean name="form1" type="..." />
<form-bean name="form2" type="..." />
</form-beans>
次に、転送を実行する前に、手に取ってform2
データを入力する必要があります。
各フォーム(それform1
またはform2
)は指定された名前で指定されたスコープにバインドされているため、もちろんそれを行うことができますが、それはStrutsの通常のフローを妨げるため、悪い習慣です(Strutsがどのように機能するかを実際に知ってからステップする必要があります)ショーに参加して盗む)。そういうわけで私はそれをする方法をあなたに教えません。
代わりに、2つのアクションを可能な限り切り離すことをお勧めします。各アクションはその役割を果たします。別のアクションによって事前に入力されているデータに依存するアクションはありません。
これを行うには、2番目のアクションで「魔法の」コードを移動し、そこに着いたら操作を実行します。アクション1から来た場合に、アクション2の操作のみを実行する必要がある場合は、構成にフラグを追加できます。
<forward name="success" path="/action2.do?theFlag"/>
アクション2でそれをテストします(request.getParameter("theFlag") != null
たとえば)。このようにして、2つのアクションをフラグだけで結び付けることができます。
もう1つできることは、DispatchActionクラスを使用することです。これは、すべて同じフォームを共有できる実行メソッドのコレクションであるため、複数のフォームを管理しなくても、あるメソッドから別のメソッドに転送できます。
編集:あなたのコメントに基づいて:「...私の新機能は、その前にいくつかのロジックを実行する必要があり、成功した場合にのみ「元の」アクションを実行します。あなたは次のようなものが必要なだけですか?
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forwardPage = mapping.findForward("success");
// Some Code....
boolean isSuccess = runLogicAndReturnStatus();
if (isSuccess) {
return forwardPage;
} else {
return mapping.findForward("error"); // or return to the same page (input page)
}
}
もしそうなら、なぜ新しいActionFormインスタンスを作成し、それを転送されたアクションに関連付ける必要があるのですか?