【问题标题】:Struts2 wizard with scoped model driven具有范围模型驱动的 Struts2 向导
【发布时间】:2026-01-12 13:45:01
【问题描述】:

我是 Struts2 的新手,正在想办法实现一个带有 2 个表单和 4 个 bean 的 3 页向导。

在开始提问之前,让我以一种通用的方式提出我的用例,不涉及任何实体的细节,以保持简单。以下是我的用例:

  1. JSP1 具有带输入字段的 Form1。
  2. Form1 提交给 Action1。
  3. Form1 的字段值通过请求参数绑定填充到 Action1 中的 Bean1。
  4. Action1 验证 Bean1 中的字段,如果验证失败,则显示 JSP1,并在 Form1 字段中捕获 Bean1 值和错误消息。
  5. 如果验证成功,则使用 Bean1 检索 Bean2,并将结果定向到 JSP2。
  6. JSP2 显示 Bean2 中的数据以及 Form2 中的其他输入字段。
  7. Form2 提交给 Action2
  8. Form2 的字段值通过请求参数绑定填充到 Action2 中的 Bean3。
  9. Action2 验证 Bean3 中的字段,如果验证失败,则显示 JSP2,并在 Form2 字段中捕获 Bean3 值和错误消息以及 Beans2 数据!
  10. 如果验证成功,则使用 Bean3 填充 Bean4,并将结果定向到 JSP3。
  11. JSP3 在 Bean4 中显示数据

在发表这篇文章之前,我已经在以下书籍中阅读过有关此主题的内容:Struts2 in Action 和 Practical Struts2 Web2.0 projects。我探索了范围拦截器、范围模型驱动操作和使用通配符的方法调用的单个操作的选项。我不期待以 Spring WebFlow 等形式添加额外的依赖项。

我正在尝试使用具有会话范围的 ScopedModelDriven 操作来实现向导。我的设计目标是为每个操作定义明确的 bean,而不是为所有操作使用单个 bean。

在关于向导的问题之前,我有一个关于动作中 bean 范围的基本问题。 Action1 在值栈中应该有 Bean1 有两个原因: 1. 在提交时绑定来自 Form1 的输入值; 2. 如果验证失败,则显示 Form1 值。 Action1 的值堆栈中还应该有 Bean2,以便在 JSP2 中显示结果。

输入页面 (Bean1) 和结果页面 (Bean2) 的操作是否应该始终具有字段(以便它们位于 ValueStack 中)?如果实现 ScopedModelDriven 哪个 bean 将是我的模型?

同样,对于 Action2,Bean2、Bean3 和 Bean4 需要在 ValueStack 中。

一种蛮力解决方案是将 Bean1、Bean2、Bean3 和 Bean4 中的所有字段组合在一起,并且整个向导只有一个 Bean!我不想这样做,因为所有这些 bean 都有特定的功能。

我相信我没有正确理解这个概念。应该有一种巧妙的方式来使用会话范围使用这些原子 bean 来实现这个向导。

非常感谢任何帮助。

【问题讨论】:

  • 我不确定这是一个简单的用例。也就是说,它似乎是加载了实现。如果它让您满意,您可以为每个操作中的每个 bean 创建一个 getter/setter(您可以从视图访问嵌套对象)。

标签: model struts2 wizard


【解决方案1】:

可能为时已晚,但您可以通过Struts2 Conversation plugin 实现您的目标

【讨论】: