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

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

现在我的问题是页面加载,我调用preprocess函数并填充Map的值。在page submit之后调用另一个方法,在这个过程中,在一些db交互之后,它会重定向到jsp,但是这次Map的值是空的。我使用这个Map作为struts2中的下拉标记。
mypreprocess在链接中关联如下:
href="/gma/preprocessConfigureTspThreshold?operatorId=5102&sessionId=12332"‌`​

因此,只有第一次单击链接时才会调用preprocess,之后当我重定向到我的jsp时才会调用它,所以第二次Map的值为空。
我可以把地图放在会议上保留吗?或者能做点别的?
我读到不使用preprocess函数,使用Preparable接口。但根据文件:
prepare方法将始终由struts 2框架的prepare拦截器调用
每当为action类调用任何方法时。
所以,每个方法都会调用它。我希望只有页面加载时才调用preprocess

最佳答案

action类的prepare方法在每个操作执行时都会被调用,没错。这可能是为Preparable方法中的下拉菜单准备映射的原因。

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
<s:select name="circleId" list="circleIdNameMap" listKey="key" listValue="value"/>

这段代码的含义是:如果jsp中的字段未初始化,则不应返回resultpreprocessSUCCESS

10-06 05:58