gpt4 book ai didi

validation - 帮助我更好地理解 Struts2、验证和有状态操作

转载 作者:行者123 更新时间:2023-12-04 17:40:45 25 4
gpt4 key购买 nike

据我了解,Struts2 Action 类实例可以(与 Struts1 不同)是有状态的,因为对 Action 的每个 GET 或 POST 都会创建一个支持 Action 类的新实例。

我还看到有一个标准(?)习惯用法(Pattern?)来提供输入表单:相同的 .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 中的表单发布到第二个操作:
<s:form action="validateAndProcessForm" method="post">

并且第二个操作验证发布的字段/参数,如果表单的输入不完整或无效,则返回“输入”,或者实际调用操作类的 execute如果输入完整且有效,则处理表单并返回(例如) formProcessed.jsp显示诸如“感谢您的输入!”之类的内容。

所以我们有这种“尖桩篱笆”习语:
defaultAction-           -> realAction-
| | | |
-> input.jsp- <--- -> success.jsp

这样做是为了让第一次 input.jsp显示,不调用验证(因此不显示验证错误),但是在单击该 jsp 上的提交按钮后,“真实”操作将验证输入,可能会传回调用无效输入的错误 input.jsp将显示。

这让我们回到有状态的、非单例操作;因为该操作是有状态的,因此不会在 GET 或 POST 之间共享,并且每个实例仅针对该 GET 或 POST 进行实例化,所以该操作无法知道特定 session 是否多次“获取”同一页面。所以正在获取 showForm.action永远不会验证,并且正在获取 validateAndProcessForm将始终验证(并在参数无效时显示错误),即使该 GET 是特定 session 第一次“获取”该 URL。

这就是我们需要“栅栏柱”的原因:第一个 Action 只是为了显示表单,第二个 Action 是为了捕获输入。

我的理解正确吗?是否有一种不那么冗长的方法来执行此操作,即不在初始 GET 上验证输入,而是在 POST 上验证,而不必为每个表单执行两个操作?

最佳答案

还有另一种方法可以在没有栅栏的情况下执行您想要的操作。默认情况下,验证拦截器不会为输入法触发。因此,您可以将 struts.xml 更新为以下内容:

<action name="*MyForm" method="{1}" class="realAction">
<result name="input">inputForm.jsp</result>
<result name="success">formProcessed.jsp</result>
</action>

使用此设置,您根本不需要空操作。当您第一次转到表单时,您将转到 url“inputMyForm”,并使您的表单操作指向“MyForm”。方法块中的 {1} 仅表示框架将调用与操作名称中的 * 匹配的任何方法。如果 * 匹配为空,则默认为 execute 方法。所以你会得到以下类型的 Action :
  • inputMyForm 将转到您的操作类的 input() 方法
  • MyForm 将转到您的操作类的 execute() 方法
  • executeMyForm 将转到您的操作类的 execute() 方法
  • customMethodNameMyForm 将转到您的操作类的 customMethodName() 方法

  • 由于验证器拦截器排除了进入输入法的任何操作,您可以为此操作设置任何您想要的验证,并且它只会在您提交表单时查找它。由于每次提交表单时,它都会转到执行方法,因此每次提交表单时都会进行验证。

    此外,如果您要扩展 ActionSupport 类,该类已经定义了 input() 方法,因此您甚至不需要更改操作类即可完成此操作。

    关于validation - 帮助我更好地理解 Struts2、验证和有状态操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4676418/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com