gpt4 book ai didi

Struts 1 ActionForms - 表单中日期的约定是什么?

转载 作者:行者123 更新时间:2023-12-02 12:52:31 27 4
gpt4 key购买 nike

我即将开始使用 Struts 1.2 的 e 项目。没有转移到另一个框架的计划。

我想知道处理表单中的日期时的约定是什么?

  • 我应该创建一个 Date 变量并创建一个 setDate(String date)方法在哪里会发生转换?
  • 创建一个日期变量,一个 setDate(Date date)并在链中的某处注册一个特殊的转换器? (不知道可不可以)
  • 创建一个字符串变量,一个 setDate(String date)并让转换/验证到 validate ActionForm bean 中的方法?

  • 还是另一种方法?

    此外,如果您有任何建议以加快使用此框架,我将不胜感激。

    最佳答案

    在我回答你的问题之前,让我先说:人们不了解 ActionForm 是什么或 ActionForm 做什么

    ActionForm表示用户在 HTML 表单中填写的数据。 Struts 读入请求参数并按名称将它们与为提交的目标 Action 配置的 ActionForm 进行匹配。是用户输入的数据,简单明了。

    请求中的数据始终是 java.lang.String 类型 .但是人们可能有一个名为“age”的表单字段,它是他们模型数据中的一个整数。或者也许他们有一个“birthDate”而不是“age”,当然在他们的模型数据中是 java.util.Date 。因此,他们认为将 int 和 Date 类型放在 ActionForm 上并允许 Struts 将根据请求到达的 String 转换为 int 和 Date 是个好主意。

    这是一个非常有用的转换,您作为开发人员不必处理它,Struts 可以。这有点框架魔法。

    但这不是吓唬哈利波特! 转换可能会在整数和日期上失败 .为什么?

    int 是一种原始类型,因此它必须始终具有值。默认初始化为零。在进行绑定(bind)(请求参数到 ActionForm 对象属性)时,Struts 在 ActionForm 上看到一个 int 类型,并尝试将请求 String 值转换为 int。

    如果用户插入字符串“5”,则该字段设置为 5。那很好!

    但是如果用户插入了“bla”呢?我们会收到一个异常吗?不!我们得到零值,因为转换(静默)失败。 UPS!

    日期又是一个问题。为什么?因为它们的值是作为字符串根据请求到达的。它们的格式可能很简单,例如“12/01/2011”,作为信息完全无用。为什么?因为表示为字符串的日期必须与 Locale 齐头并进。以便转换为它所代表的正确 Date 实例。

    "12/01/2011" + Locale.US = 01 December 2011
    "12/01/2011" + Locale.FRENCH = 12 January 2011

    UPS!

    好的,这就是介绍! 现在让我们来回答您的问题 .

    1. Should I create a Date variable and create a setDate(String date) method where the conversion will occur.


    在某些时候,您必须将日期发送回 View 和 Struts html tags通常必须使用 getDate()返回字符串。如果 getter 返回 Date(Struts 将对 getter 值执行 toString()),您在用户输入中获得的“12/01/2011”可能会显示为“Jan. 12, 2011 00:00:00”。因此,您实际上需要具有 Date 类型的 setter/getter 和 String 类型的 setter/getter 的 Date 字段。在 Action 类中使用类型 Date 并使用 String 与 View 标签交互。

    题?您如何处理 ActionForm 中正确的 Locale 值?

    1. Create a Date variable, a setDate(Date date) and register a special converter somewhere in the chain (don't know if it's possible)


    It is possible .您可以创建并注册一个自定义转换器,该转换器可能采用日期的字符串表示形式并将其转换为日期。如果您使用 ISO 8601格式我认为你会安全的。

    题?您能否在不破坏通过使用各种格式或语言环境以自己的方式将 String 转换为日期的代码的情况下将其纳入现有应用程序中?

    1. Create a String variable, a setDate(String date) and let the conversion/validation to the validate method in the actionForm bean


    这行不通。 validate在 ActionForm 对象上的参数绑定(bind)之后调用方法。当你到达这一点时已经晚了。 Struts 进行了转换。如果您有一个值为 0 的 int 类型字段,则无法知道用户是否实际插入了零并且转换有效,或者用户是否插入了“bla”并且转换失败并且您返回零作为默认初始化值。如果零是您的应用程序的有效值,那么您将遇到更大的麻烦。

    那么约定是什么?

    没有约定。使用上述信息并根据您的情况应用常识。

    理想情况下,您应该将 ActionForm 中的所有属性都作为字符串 这样您在绑定(bind)过程中就不会丢失任何信息。但这涉及在使用它们之前手动将属性转换为 Action 类中的正确类型。您拥有完全的控制权(Struts 不再进行转换,因为源值和目标值都是 String 类型),但您还有很多样板代码要编写以正确的方式完成,这在某些时候会变得很烦人。

    附言在我结束这一切并上床 sleep 之前(我所在的国家/地区是凌晨 01:00 :D)我只想提一件事,人们通常看不到。 ActionForm 不是模型的一部分 ,它也不应该直接与模型交互。

    如果您需要在模型中处理来自 ActionForm 的数据,则将其映射为与模型 DTO(数据传输对象)的一对一关系。如果您不这样做,那么您将在 Model 和 Struts 框架之间创建紧密耦合,因为您的 ActionForm 对象不是 POJO。您的类必须从我们一直在讨论的 Struts 扩展 ActionForm 类。人们不会这样做,而是将 ActionForm 直接发送到模型。更糟糕的是,他们还使用 validate执行业务验证而不是基本验证的方法,例如“需要”、“值是否在范围内”等。

    ActionForms 只是 Action( Controller )和 View 之间的通信路径。如此对待它。

    关于Struts 1 ActionForms - 表单中日期的约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707068/

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