1

アクションを次の構成済みアクションに転送したいのですが、その前に新しい ActionForm インスタンスを作成し、転送されたアクションに関連付けます。

疑似コードは次のとおりです。

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    ActionForward forwardPage = mapping.findForward("success");


    // Some Code....
    ....
    ....

    // finally
    MyActionForm form = new MyActionForm();

    form.setSomeProp(...);
    form.setAnotherProp(...);

    forwardPage.doSomeMagicAndAssociateWith(form);

    return forwardPage;

}

ばかげた質問で申し訳ありませんが、私はこれらすべてに不慣れで、答えを見つけることができませんでした...

ありがとう

編集1:

明確にするために、「成功」への ActionForwarded は、今追加しなければならない新機能の前に存在していました。

特定のフローでは、最初のフロー (ここでは「成功」と呼ばれます) の前に来て、いくつかの計算を行い、その後、成功の場合 [ :-) ] フローを「成功」アクションに転送したいと考えています。

私の主張が今より明確になることを願っています。

4

3 に答える 3

2

次のような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インスタンスを作成し、それを転送されたアクションに関連付ける必要があるのですか?

于 2010-06-30T10:32:23.367 に答える
1

アクションでは、パラメータで渡された ActionForm のフィールド値を変更できますが、新しい ActionForm を作成して次の JSP ページに関連付けることはできません。

転送されたページを呼び出す前に、フォーム内のすべてのデータをリセットしたい場合は、「form.reset();」のようにすることができます。または「form.clear();」、Form クラスでこのメソッドを作成します。

フォームにない成功ページのフィールドが必要な場合は、「リクエスト」オブジェクトを使用してこれらのフィールドを保存できます。

于 2010-06-30T10:19:26.100 に答える
1

私は自分で管理しました。多分私の解決策は、私が私の質問でできたことがわからないことを説明するでしょう...

これが私の struts-config.xml ファイルだとしましょう:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
    <data-sources>
    </data-sources>
    <!-- ================== Form Beans ================ -->
    <form-beans>
        <form-bean name="FirstForm"
            type="com.blahblah.forms.FirstForm" />  
        <form-bean name="SecondForm"
            type="com.blahblah.forms.SecondForm" />

            <form-bean name="NewForm"
            type="com.blahblah.forms.NewForm" />
    </form-beans>   
    <!-- ================== Action Mapping Definitions ================ -->
    <action-mappings>       
        <action path="/pages/First" name="FirstForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="success" path="/pages/Second.do" />
        </action>
        <action path="/pages/Second" name="SecondForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="doSomthing" path="/pages/DoSomthing.jsp" />
        </action>

        <action path="/pages/New" name="NewForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="success" path="/pages/First.do" />
        </action>
    </action-mappings>
</struts-config>

FirstForm, FirstAction, SecondForm and SecondAction私の機能の前に存在していたので、彼らのコードに介入したくありませんでした...

は次NewActionのことを行います。execute()

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    ActionForward forwardPage = mapping.findForward("success");

    // do some coding

    FirstForm firstForm = new FirstForm();
    firstForm.setX(...);
    firstForm.setY(...);
    request.setAttribute("FirstForm", firstForm);

    return forwardPage;
}
于 2010-06-30T12:30:42.013 に答える