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
的值为空。
我应该将地图放在会话中以便保留吗?或者可以做点什么?
我读到不使用preprocess
函数,请使用Preparable
接口。但按照文档:
Struts 2框架的准备拦截器总是会调用prepare方法 每当为Action类调用任何方法时。
因此,每个方法都会调用它。我希望仅在页面加载时调用preprocess
。
答案 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中的字段未初始化,则不应返回结果SUCCESS
或INPUT
。