【发布时间】:2026-01-12 13:45:01
【问题描述】:
我是 Struts2 的新手,正在想办法实现一个带有 2 个表单和 4 个 bean 的 3 页向导。
在开始提问之前,让我以一种通用的方式提出我的用例,不涉及任何实体的细节,以保持简单。以下是我的用例:
- JSP1 具有带输入字段的 Form1。
- Form1 提交给 Action1。
- Form1 的字段值通过请求参数绑定填充到 Action1 中的 Bean1。
- Action1 验证 Bean1 中的字段,如果验证失败,则显示 JSP1,并在 Form1 字段中捕获 Bean1 值和错误消息。
- 如果验证成功,则使用 Bean1 检索 Bean2,并将结果定向到 JSP2。
- JSP2 显示 Bean2 中的数据以及 Form2 中的其他输入字段。
- Form2 提交给 Action2
- Form2 的字段值通过请求参数绑定填充到 Action2 中的 Bean3。
- Action2 验证 Bean3 中的字段,如果验证失败,则显示 JSP2,并在 Form2 字段中捕获 Bean3 值和错误消息以及 Beans2 数据!
- 如果验证成功,则使用 Bean3 填充 Bean4,并将结果定向到 JSP3。
- 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(您可以从视图访问嵌套对象)。