Java 在第二个操作中访问action类变量
我的Action类中有两个方法Java 在第二个操作中访问action类变量,java,jsp,session,struts2,Java,Jsp,Session,Struts2,我的Action类中有两个方法preprocess()和getThresholdData(): 我在preprocess()方法中设置了List变量(页面加载时调用) 然后从JSP页面提交表单并调用getThresholdData() JSP: tspNames(要迭代的列表)在页面加载后立即在action类的preprocess()方法中设置,如下所示: <a href="/gma/preprocessConfigureTspThreshold" /> 这是我在第一个函
preprocess()
和getThresholdData()
:
- 我在
方法中设置了preprocess()
变量(页面加载时调用)List
- 然后从JSP页面提交表单并调用
getThresholdData()
tspNames
(要迭代的列表)在页面加载后立即在action类的preprocess()
方法中设置,如下所示:
<a href="/gma/preprocessConfigureTspThreshold" />
这是我在第一个函数中设置的,它的值是null
为什么会这样?提交表单后变量值是否丢失?
会话概念有什么用吗?您正在尝试重新发明轮子;您需要的是实现,以充分利用框架功能 您的初始化代码将被放置在
prepare()
方法中(它类似于您的自定义preprocess()
方法,但由框架管理,框架知道它):
实现此接口的操作类必须重写prepare
方法Struts 2将始终调用prepare方法
框架的prepare拦截器,无论何时为
操作类,以及在查看之前验证失败时
渲染
您也不需要会话,但这是您的选择。在上述场景中,您在第一次操作调用
预处理时为会话添加了一些变量tspNames
。注意,要使用会话,您的action类应该实现SessionAware
,作为备选方案之一。另一种方法是将变量的范围设置为“session”
。您可以使用interceptor或interceptor,或者如果您想使用“session”
范围扩展struts2框架,您应该实现上述范围策略
代码中的错误:
未实现SessionAware
如果#1不是真的,那么您只将变量放入会话,但在执行第二个操作时没有从会话中获取它李>
您应该添加以下代码:
public String getThresholdData() {
tspNames = (List<String>) session.get("tspNames");
...
}
公共字符串getThresholdData(){
tspNames=(List)session.get(“tspNames”);
...
}
如果希望在同一操作类中的操作调用之间共享这些变量,请尝试使用私有静态定义这些变量 @SiddharthTrikha每个变量都有其作用域。因此,当您调用预处理函数并设置列表的值时,它只能用于该函数。在此范围之外,其值为null。例如,假设您非常熟悉“java”语言,但对“.net”一无所知。因此,当有人问你关于java的任何问题时,你都知道答案。。但对.NET来说不一样。。你不知道答案,因为它超出了你的范围。因此,首先您必须学习它,然后才能回答它。@SiddharthTrikha对于每个动作调用,都会创建一个动作类的新实例,如果您不使用该实例填充数据,则在没有它的情况下呈现JSP时会丢失该实例。然后将其放入execute()
方法中。注意:不要从JSP调用操作来执行代码(作为正常的流程,在某些情况下,它可能很方便,但从我所看到的情况来看,它不是您的操作)。是的,我看到我没有实现SessionAware。谢谢实际上,我在JSP中使用了放入会话的变量,比如:您没有将变量放入会话,或者会话在第二次调用时无效。
System.out.println("************" + tspNames);
public String getThresholdData() {
tspNames = (List<String>) session.get("tspNames");
...
}