Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在第二个操作中访问action类变量_Java_Jsp_Session_Struts2 - Fatal编程技术网

Java 在第二个操作中访问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" /> 这是我在第一个函

我的Action类中有两个方法
preprocess()
getThresholdData()

  • 我在
    preprocess()
    方法中设置了
    List
    变量(页面加载时调用)

  • 然后从JSP页面提交表单并调用
    getThresholdData()

JSP:


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");
      ...
    }