【问题标题】:Accessing the action class variable in a second action在第二个动作中访问动作类变量
【发布时间】:2017-01-21 06:43:02
【问题描述】:

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

  • 我在preprocess()方法中设置了一个List<String>变量(页面加载时调用);

  • 然后从 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>

流程是:

  1. JSP 加载 preprocess 在设置列表的地方调用。
  2. 用户填写并提交表单,一些工作在服务器端完成,用户重定向到同一个 JSP。

但是错误是因为 JSP 无法显示为 preprocess() 方法中设置的列表 tspNames 即将出现 null

在这里,当我尝试打印列表时

System.out.println("************" + tspNames);

我在第一个函数中设置的值是null

为什么会这样?表单提交后变量值是否丢失? 与会话概念有什么关系吗?

【问题讨论】:

  • @SiddharthTrikha 每个变量都有其作用域。因此,当您调用预处理函数并设置列表值时,它仅适用于该函数。在这个范围之外,它的值为空。例如,假设您非常了解“java”语言,但对“.net”一无所知。因此,当有人问您有关 java 的任何问题时,您知道答案.. 但 .NET 不一样.. 您不知道答案,因为它超出了您的范围。所以首先你必须学习它,然后你才能回答它。
  • @SiddharthTrikha 对于每个动作调用,都会创建一个动作类的新实例,如果您不使用数据填充该实例,则在没有它的情况下渲染 JSP 会丢失。

标签: java jsp session struts2


【解决方案1】:

您正在尝试重新发明轮子;您需要实现Preparable Interface,以充分利用框架功能;

您的初始化代码将放在prepare() 方法中(它就像您自定义的preprocess() 方法,但由框架管理,这是知道的):

实现此接口的动作类必须覆盖prepare 方法。 prepare 方法总是会被 Struts 2 调用 每当调用任何方法时,框架的准备拦截器 动作类 以及在视图之前验证失败时 渲染。

您也不需要会话,但这是您的选择。

【讨论】:

  • 然后放到execute()方法中。 P.S:不要从 JSP 调用 Actions 来执行代码(作为正常流程,在某些情况下它可以很方便,但据我所见并非你的)
【解决方案2】:

在上述场景中,您在第一次操作调用preprocess 时将一些变量tspNames 放入会话。请注意,要使用会话,您的操作类应该实现 SessionAware 作为替代方案之一。另一种方法是将变量的范围设置为"session"。你可以使用拦截器scopescopedModelDriven 来实现,或者如果你想用"session" 作用域扩展struts2 框架,你应该实现this 问题中描述的作用域策略。

代码中的错误:

  1. 未实现SessionAware
  2. 如果#1 不正确,那么您只将变量放入会话中,但在第二次操作执行时没有从会话中获取它。

你应该添加代码:

public String getThresholdData() {
  tspNames = (List<String>) session.get("tspNames");
  ...
}    

【讨论】:

  • 是的,我看到我没有实现 SessionAware。谢谢。实际上,我在我的 JSP 中使用放入会话中的变量,例如:
  • 您没有将变量放入会话中,或者会话在第二次调用时失效。
【解决方案3】:

如果您希望在同一操作类中的这些操作调用之间共享这些变量,请尝试使用私有静态来定义这些变量。

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 2015-06-08
    • 1970-01-01
    • 2011-12-07
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多