【问题标题】:Maintaining values of action variables?维护动作变量的值?
【发布时间】:2014-01-23 13:19:54
【问题描述】:
class SampleAction extends ActionSupport {
private Map<String,String> circleIdNameMap;

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

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

我的preprocess 在链接中关联,例如:

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

所以只有第一次点击链接时preprocess被调用,之后当我重定向到我的JSP所以它不会被调用,所以第二次Map的值是空的。

  1. 我应该将地图放入会话中以便保留吗?还是可以做点别的?

  2. 我读到不要使用preprocess函数,使用Preparable接口。但根据文档:

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

所以,每个方法都会调用它。我希望仅在页面加载时调用 preprocess

【问题讨论】:

  • 你如何调用方法on page load?如果在页面加载时调用它,那么地图如何为空?您可以在return ERROR; 之前简单地调用preprocess(),然后JSP 映射不会为空。
  • prepare 方法会在您请求操作时被调用。所以无论是页面加载还是任何用例
  • @Aniket:我的预处理在链接中关联,例如:href="/gma/preprocessConfigureTspThreshold?operatorId=5102&sessionId=12332"!所以只有第一次点击链接时调用预处理,之后当我重定向到我的 JSP 时,它不会被调用
  • “页面提交后”表示有另一个请求。动作是按请求实例化的;除非以某种方式填充,否则先前操作中的任何数据显然不会出现在后续请求中。

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


【解决方案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

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

这段代码的意思是:如果 JSP 中的字段未初始化,则不应返回结果 SUCCESSINPUT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-05-20
    • 2021-05-17
    • 2015-03-17
    相关资源
    最近更新 更多