【发布时间】:2011-01-13 03:07:48
【问题描述】:
据我了解,Struts2 动作类实例可以(与 Struts1 不同)是有状态的,因为对动作的每个 GET 或 POST 都会创建一个支持动作类的新实例。
我还看到有一个标准(?)习语(模式?)来提供输入表单:相同的 .jsp 用作两个不同操作的 View 组件,如下所示:
<action name="showForm" class="defaultActionThatDoesNothingExceptReturnSuccess">
<result name="success">inputForm.jsp</result>
</action>
<action name="validateAndProcessForm" class="realAction">
<result name="input">inputForm.jsp</result>
<result name="success">formProcessed.jsp</result>
</action>
第一个动作只是显示表单,而不验证输入或处理它。 .jsp 中的表单发布到 second 操作:
<s:form action="validateAndProcessForm" method="post">
并且第二个操作验证发布的字段/参数,如果表单的输入不完整或无效,则返回“输入”,或者如果输入完整且有效,则实际调用操作类的execute,从而处理表单并返回(例如)formProcessed.jsp 显示类似“感谢您的输入!”。
所以我们有这种“栅栏”成语:
defaultAction- -> realAction-
| | | |
-> input.jsp- <--- -> success.jsp
这样做是为了在第一次显示 input.jsp 时不会调用验证(因此不会显示验证错误),但是在单击该 jsp 上的提交按钮后,“真实”操作将验证输入,可能会传回错误,指出input.jsp 将显示的无效输入。
这让我们回到了有状态的、非单例的动作;因为该操作是有状态的,因此不会在 GET 或 POST 之间共享,并且每个实例仅针对该 GET 或 POST 进行实例化,因此该操作无法知道特定会话是否已多次“获取”同一页面。所以 GETing showForm.action 将永远验证,而 GETing validateAndProcessForm 将总是验证(如果参数无效则显示错误),即使 GET 是特定会话第一次“获取”该 URL。
这就是我们需要“栅栏柱”的原因:第一个动作只是显示表单,第二个动作是捕获输入。
我的理解正确吗?有没有更简洁的方法来做到这一点,不在初始 GET 上验证输入,而是在 POST 上验证,而不必为每个表单执行两个操作?
【问题讨论】:
-
不要使用单独的操作来查看表单和处理表单。
标签: validation struts2 state