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
的值为空。我在 Struts 2 中使用这个 Map
作为下拉标签。
我的
preprocess
在链接中关联,例如:
href="/gma/preprocessConfigureTspThreshold?operatorId=5102&sessionId=12332"`
因此,只有第一次单击链接时才会调用
preprocess
,之后,当我重定向到我的 JSP 时,因此不会调用它,所以第二次 Map
的值为空。
我应该将地图放入会话中以便保留它吗?或者可以做点别的吗?
我读到不要使用
preprocess
功能,使用Preparable
界面。但根据文档:
prepare方法总是会被Struts 2框架的prepare拦截器调用
每当 Action 类调用任何方法时。
因此,每个方法都会调用它。我希望仅在页面加载时调用
preprocess
。
prepare
操作类的
Preparable
方法在每个操作执行时都会被调用,没错。这可能就是您在 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 中的字段未初始化,则不应返回结果
SUCCESS
或 INPUT
。