我的Action类preprocess()
和getThresholdData()
中有两种方法:
我在List<String>
方法中设置preprocess()
变量(在页面加载时调用);
然后从JSP页面提交表单并调用getThresholdData()
。
JSP:
<body>
<s:form action="getThresholdDataConfigureTspThreshold">
<s:select list="tspNames" label="Select TSP:" name="tspName"></s:select>
<s:radio list="{'Default', 'Latest'}" label="Select Threshold type:"
name="thresholdType"></s:radio>
<s:submit value="Submit"></s:submit>
</s:form>
</body>
tspNames
(迭代列表)在页面加载后立即在动作类的preprocess()
方法中设置,如下所示:
<a href="/gma/preprocessConfigureTspThreshold" />
行动类:
public class ConfigureTspThresholdAction extends ActionSupport{
private static final String DISPLAY = "display";
private Map session;
private List<String> tspNames;
private List<String> thresholdParametres;
private String tspName;
private String thresholdType;
public String preprocess() {
// Get tspNames from server after Table creation
tspNames = new ArrayList<String>();
tspNames.add("RELIANCE");
tspNames.add("AIRTEL");
tspNames.add("TATA");
tspNames.add("BSNL");
tspNames.add("MTNL");
session.put("tspNames", tspNames);
return DISPLAY;
}
public String getThresholdData(){
// Get parametres from server after creating table
thresholdParametres = new ArrayList<String>();
thresholdParametres.add("1");
thresholdParametres.add("2");
thresholdParametres.add("3");
thresholdParametres.add("4");
thresholdParametres.add("5");
System.out.println("************" + tspNames);
return DISPLAY;
}
/** GETTER AND SETTERS*/
}
struts.xml中:
<action name="*ConfigureTspThreshold"
class="gma.struts.ConfigureTspThresholdAction" method="{1}">
<result name="display">pages/ConfigureTspThresholdInput.jsp</result>
</action>
流程是:
preprocess
。但是,由于无法显示JSP,因此tspNames
方法中设置的列表preprocess()
即将来null
,因此无法显示错误。
这里,当我尝试打印列表时
System.out.println("************" + tspNames);
我在第一个函数中设置它的值是null
。
为什么会这样?表单提交后变量值是否丢失? 有会话概念吗?
答案 0 :(得分:2)
你正试图重新发明轮子;你需要的是实现Preparable Interface
,以充分利用框架功能;
您的初始化代码将放在prepare()
方法中(它类似于您的自定义preprocess()
方法,但由框架管理,知道它):
实现此接口的Action类必须覆盖prepare 方法。 Struts 2将始终调用prepare方法 每当调用任何方法时,框架都会准备拦截器 操作类以及在视图之前验证失败时 呈现。
您也不需要会话,但这是您的选择。
答案 1 :(得分:0)
在上面的场景中,您已在第一个操作调用tspNames
上为会话添加了一些变量preprocess
。请注意,要使用会话,您的操作类应将SessionAware
作为替代方案之一。另一种方法是将变量的范围设置为"session"
。您可以使用拦截器scope
或scopedModelDriven
执行此操作,或者如果您希望使用"session"
范围扩展struts2框架,则应实现范围策略,如this问题中所述。
代码中的错误:
SessionAware
。您应该添加代码:
public String getThresholdData() {
tspNames = (List<String>) session.get("tspNames");
...
}
答案 2 :(得分:0)
如果您希望在同一操作类中的那些操作调用之间共享这些变量,请尝试使用private static来定义这些变量。