维护行动变量的值?

时间:2014-01-06 07:12:42

标签: java jsp java-ee struts2 url-parameters

class SampleAction extends ActionSupport {
private Map<String,String> circleIdNameMap;

public String preprocess(){
--logic for populating value of MAP
}
--getters and setters
}

现在我的问题是在页面加载时我调用preprocess函数并填充Map的值。在页面提交之后调用另一个方法,在此之后,在一些数据库交互之后,它会重定向到JSP,但这次Map的值为空。我在Struts2中使用此Map作为下拉标记。

我的preprocess与链接相关联,如:

href="/gma/preprocessConfigureTspThreshold?operatorId=5102&sessionId=12332"‌`​

因此,只有在第一次单击链接时preprocess被调用,之后我重定向到我的JSP,因此它不被调用,所以第二次Map的值为空。

  1. 我应该将地图放在会话中以便保留吗?或者可以做点什么?

  2. 我读到不使用preprocess函数,请使用Preparable接口。但按照文档:

      

    Struts 2框架的准备拦截器总是会调用prepare方法   每当为Action类调用任何方法时。

  3. 因此,每个方法都会调用它。我希望仅在页面加载时调用preprocess

1 个答案:

答案 0 :(得分:1)

每次执行动作时都会调用Preparable动作类的prepare方法,这是正确的。这可能是您为preprocess方法中的下拉列表准备地图的原因。

public class SampleAction extends ActionSupport {
    private Map<String,String> circleIdNameMap;
    private String circleId;
    //getters and setters here

    protected boolean reload = false;

    private void preprocess(){
      // Get the Map by calling a stateless Session bean
      circleIdNameMap = remoteInterface.getMap(); 
    }

    public String action1(){
      preprocess();
      Map session = ActionContext.getContext().getSession(); 
      session.put("circleIdNameMap ", circleIdNameMap );
      return SUCCESS; 
    }

    public String action2(){
      Map session = ActionContext.getContext().getSession();
      circleIdNameMap = (Map<String,String>)session.get("circleIdNameMap"); 
      if (circleIdNameMap == null){
        if (reload) {
          preprocess();
          Map session = ActionContext.getContext().getSession(); 
          session.put("circleIdNameMap ", circleIdNameMap );
        } else {
          addActionError("circleIdNameMap is null");
          return ERROR;
        }
      }  
      return SUCCESS; 
    }

   ...//other actions
}

JSP for drop-down

<s:select name="circleId" list="circleIdNameMap" listKey="key" listValue="value"/>

此代码的含义是:如果JSP中的字段未初始化,则不应返回结果SUCCESSINPUT