2

我想在多个请求之间共享模型(表单数据),因此在动作类中实现了 ScopedModelDriven 拦截器。

下面是我的代码

模型 - 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)如果我在声明模型时删除动作类中的新运算符,即
私有EventSearchBean eventSearchBean;
在操作类中访问模型时出现空指针异常。
如何声明/初始化模型?

3)只有在 UI 中提交表单时,如何在会话中覆盖/更新模型

4

2 回答 2

2

展开defaultStack,这就是您要定义的内容:

<interceptor-stack name="defaultStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="scopedModelDriven"/> <!-- here -->
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="datetime"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
    <interceptor-ref name="deprecation"/>
</interceptor-stack>

<interceptor-ref name="scopedModelDriven">
    <param  name="scope">session</param>
    <param  name="name">eventSearchBean</param>
    <param  name="className">com.karthik.beans.EventSearchBean</param> 
</interceptor-ref>

如您所见,它已经包含 ScopedModelDriven 拦截器。因此,您要定义它两次,第一次在 defaultStack 中,第二次手动定义,但只有第二次设置了参数,第一次全部为空:)

然后,而不是

<interceptor-ref name="defaultStack"/>
<interceptor-ref name="scopedModelDriven">
    <param  name="scope">session</param>
    <param  name="name">eventSearchBean</param>
    <param  name="className">com.karthik.beans.EventSearchBean</param> 
</interceptor-ref>

只需使用

<interceptor-ref name="defaultStack">
    <param  name="scopedModelDriven.scope">session</param>
    <param  name="scopedModelDriven.name">eventSearchBean</param>
    <param  name="scopedModelDriven.className">com.karthik.beans.EventSearchBean</param> 
</interceptor-ref>
于 2016-01-19T13:44:11.490 回答
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>

在代码中进行了以下更改:

  • 如果使用自定义堆栈,则自定义堆栈应包含 modelDriven 拦截器和 scopedModelDriven 拦截器。

  • 如果参数如上所示在动作类中指定,则参数必须以 scopedModelDriven 为前缀。也就是说,scopedModelDriven.paramName 而如果在动作类外部的拦截器堆栈中指定了 scopedModelDriven 参数,则不需要前缀。

  • 动作类中的模型不能用 new 操作符初始化。该模型必须刚刚声明。即私有EventSearchBean eventSearchBean;

于 2016-01-20T08:08:44.357 回答