4

我正在使用 Struts 1.3 创建一个由 3 个 jsp 页面和 3 个 Struts 动作组成的类似向导的界面。流程如下: page1>action1 ->page2>action2 -> page3>action3

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

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

4

4 回答 4

5

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

  1. 查看strutsConfig文件以了解两个操作(2 和 3)的 actionMapping。为单独的操作保持不同的表单名称(例如,用于操作 2 的表单 2 和用于操作 3 的表单 3)。
  2. 在 Action3 中,不要强制转换表单,而是使用这个form2 = (FormBean2) session.getAttribute("form2");

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

于 2010-12-07T10:42:52.370 回答
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()。

于 2010-12-21T20:27:51.187 回答
1

感谢您的所有投入。这是我解决问题的方法。我不太喜欢这个解决方案,但它可能是我能找到的最整洁的解决方案。

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

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

我认为 Struts 以这种方式工作没有意义,但是……就这样吧。

于 2010-12-07T13:13:22.293 回答
0

您如何在 action2 和 action3 中访问 page2 的表单 bean。
我想您访问的方式错误。您是否收到有关 invalidCast 或其他内容的异常。

于 2010-12-07T06:21:22.717 回答