Struts会话表单bean不保留状态

时间:2010-12-06 18:17:18

标签: java forms session struts struts-action

我正在使用Struts 1.3创建一个类似于向导的界面,包含3个jsp页面和3个Struts动作。流程如下: page1> action1 - > page2> action2 - >第3页> ACTION3

我使用会话表单bean(具有会话范围的操作表单)在请求之间共享数据。我遇到的问题是我在第2页中提交的数据在操作2中可用,但在行动3中没有。我有疑问可能是我在第3页上没有表格来保存这些数据,或者因为我打电话action3通过jQuery post方法而不是常规表单提交,但我真的不确定。

我一直在挖掘所有互联网已有近一天但仍然没有运气。谁能提供一些帮助。非常感谢。

4 个答案:

答案 0 :(得分:5)

我想您可能已经为StrutsConfig.xml中的操作分配了相同的表单,因此它没有给出ClassCastException。顺便说一下,如果你想访问在action 2中填充的同一个表单bean,请执行以下操作

  1. 查看两个操作(2和3)的 actionMapping strutsConfig 文件。为单独的操作保留不同的表单名称(例如action2的form2和action3的form3)。
  2. 在Action3中,使用此form2 = (FormBean2) session.getAttribute("form2");
  3. 而不是转换表单

    上面的原因是因为两个动作都使用相同的形式,所以struts可能会覆盖它。希望以上将解决您的问题。

答案 1 :(得分:4)

每个请求都会调用表单上的reset()方法,因此您正在丢失状态。您可以通过编程方式控制它。

public class MyForm extends ActionForm {
    boolean reset = true;
    private String[] checkboxes = {};

    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        if (reset) {
            this.checkboxes = new String[];
            // etc
        }

        reset = true;
    }

    public void doNotReset() {
        reset = false;
    }
}

让action2在表单上调用doNotReset()。

答案 2 :(得分:1)

感谢您的所有投入。这是我如何解决我的问题。我真的不喜欢这个解决方案,但它可能是我能找到的最好的解决方案。

在第3页中,我添加了隐藏字段,用于表示我希望在操作中可用的属性3.Struts会将值存储在这些隐藏字段中,当再次提交表单时,数据将重新填充到操作中形式。

在我看来,Struts的工作方式如下:当它加载第3页时,它会尝试使用myForm的值填充第3页中的表单。提交表单时,该过程相反,它使用用户表单中的值填充myForm。问题是,在使用用户提交的值填充myForm之前,它会重置myForm的属性。并且因为在重新设置之后,它没有找到这些字段的值,所以它将它留空。

我不认为Struts以这种方式工作是有道理的,但是......就这样吧。

答案 3 :(得分:0)

如何在action2和action 3中访问page2的表单bean。
我想你是以错误的方式访问的。您是否收到有关无效Cast或其他内容的异常。