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中的下拉标记。my
preprocess
在链接中关联如下: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中的字段未初始化,则不应返回result
preprocess
或SUCCESS
。