在第二个操作中访问操作类变量

时间:2013-11-20 06:57:27

标签: java jsp session struts2

我的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>

流程是:

  1. 在设置列表的地方调用JSP加载preprocess
  2. 用户填写并提交表单,一些工作在服务器端完成,用户重定向到同一个JSP。
  3. 但是,由于无法显示JSP,因此tspNames方法中设置的列表preprocess()即将来null,因此无法显示错误。

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

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

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

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

3 个答案:

答案 0 :(得分:2)

你正试图重新发明轮子;你需要的是实现Preparable Interface,以充分利用框架功能;

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

  

实现此接口的Action类必须覆盖prepare   方法。 Struts 2将始终调用prepare方法   每当调用任何方法时,框架都会准备拦截器   操作类以及在视图之前验证失败时   呈现。

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

答案 1 :(得分:0)

在上面的场景中,您已在第一个操作调用tspNames上为会话添加了一些变量preprocess。请注意,要使用会话,您的操作类应将SessionAware作为替代方案之一。另一种方法是将变量的范围设置为"session"。您可以使用拦截器scopescopedModelDriven执行此操作,或者如果您希望使用"session"范围扩展struts2框架,则应实现范围策略,如this问题中所述。

代码中的错误:

  1. 未实施SessionAware
  2. 如果#1不为真,那么您只将变量放入会话,但在第二次操作执行时没有从会话中获取。
  3. 您应该添加代码:

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

答案 2 :(得分:0)

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