2

複数のリクエスト間でモデル(フォームデータ)を共有したいので、アクションクラスにScopedModelDriven Interceptorを実装しました。

以下は私のコードです

モデル - EventSearchBean.java

public class EventSearchBean {

   private Integer eventId;

   private String location;

   //getters and setters

}

アクション - EventSearchAction

public class EventSearchAction implements ScopedModelDriven<EventSearchBean>
{
   private EventSearchBean eventSearchBean;

   public static final String EVENT_MODEL_SESSION_KEY = "eventSearchBean"; 

   public EventSearchBean getModel() {
        return eventSearchBean;
   }

   public String getScopeKey() {
        return EVENT_MODEL_SESSION_KEY;
   }

   public void setModel(EventSearchBean eventSearchBean) {
        this.eventSearchBean = eventSearchBean;  
   }

   public void setScopeKey(String arg0) {
        // TODO Auto-generated method stub
   }

   public String execute();
   {
     String locale = eventSearchBean.getLocation();

     //Calling business service to fetch events based on location
     List<> eventList = eventManager.getEvents(locale);

     return "success";

   }
}

struts.xml

     <!-- old stack used for other action classes -->

    <interceptor-stack name="oldStack">
      <interceptor-ref name="servletConfig"/>
      <interceptor-ref name="modelDriven"/>
      <interceptor-ref name="exception"/>  
      <interceptor-ref name="fileUpload"/>
      <interceptor-ref name="params"/>
    </interceptor-stack>

   <!-- new stack used for EventSearchAction class -->
    <interceptor-stack name="newStack">
      <interceptor-ref name="servletConfig"/>
      <interceptor-ref name="scopedModelDriven"/>
      <interceptor-ref name="exception"/>  
      <interceptor-ref name="fileUpload"/>
      <interceptor-ref name="params"/>
    </interceptor-stack> 

    <action name="eventSearch" class="com.karthik.EventSearchAction">
       <interceptor-ref name="newStack">
         <param  name="scope">session</param>
         <param  name="name">eventSearchBean</param>
         <param  name="className">com.karthik.beans.EventSearchBean</param> 
       </interceptor-ref>
       <result name="success">/jsp/eventlist.jsp</result>
       <result name="error">/jsp/generalExceptionPage.jsp</result>
    </action>

1)リクエストごとに新しいモデルが作成されます(モデルデータは、後続のリクエストのためにセッションからコピーされません)。モデルをセッション スコープに入れるには、コードで何を変更する必要がありますか?
モデルをStruts1のセッションスコープのActionFormのように動作させるには?

2) モデルの宣言中にアクション クラスの new 演算子を削除すると、それは
private EventSearchBean eventSearchBean;
アクション クラスでモデルにアクセスすると、Null Pointer 例外が発生します。
モデルを宣言/初期化する方法は?

3)フォームが UI で送信された場合にのみ、セッションでモデルをオーバーライド/更新する方法は?

4

2 に答える 2

0
    <interceptor-stack name="newStack">
       <interceptor-ref name="servletConfig"/>
       <interceptor-ref name="scopedModelDriven"/>
       <interceptor-ref name="modelDriven"/>
       <interceptor-ref name="exception"/>  
       <interceptor-ref name="fileUpload"/>
       <interceptor-ref name="params"/>
    </interceptor-stack> 

    <action name="eventSearch" class="com.karthik.EventSearchAction">
       <interceptor-ref name="newStack">
         <param name="scopedModelDriven.scope">session</param>
         <param name="scopedModelDriven.name">eventSearchBean</param>
         <param name="scopedModelDriven.className">com.karthik.beans.EventSearchBean</param> 
       </interceptor-ref>
       <result name="success">/jsp/eventlist.jsp</result>
       <result name="error">/jsp/generalExceptionPage.jsp</result>
    </action>

コードに次の変更が加えられました。

  • カスタム スタックを使用する場合、カスタム スタックには、scopedModelDriven インターセプターの他に modelDriven インターセプターが含まれている必要があります。

  • 上記のようにパラメーターがアクション クラス内で指定されている場合、パラメーターの前に scopedModelDriven を付ける必要があります。つまり、scopedModelDriven.paramName ですが、scopedModelDriven パラメータがアクション クラス外のインターセプタ スタック内で指定されている場合、プレフィックスは必要ありません。

  • アクション クラスのモデルは、new 演算子で初期化してはなりません。モデルは宣言するだけです。つまり、プライベート EventSearchBean eventSearchBean;

于 2016-01-20T08:08:44.357 に答える