【问题标题】:Struts 1 ActionForms - What's the convention for dates in the form?Struts 1 ActionForm - 表单中日期的约定是什么?
【发布时间】:2011-07-15 12:39:26
【问题描述】:

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

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

  1. 我应该创建一个 Date 变量并创建一个setDate(String date) 方法来进行转换吗?

  2. 创建一个日期变量setDate(Date date) 并在链中的某处注册一个特殊转换器? (不知道有没有可能)

  3. 创建一个String变量,一个setDate(String date),并让ActionForm bean中的validate方法转换/验证?

还是其他方法?

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

【问题讨论】:

    标签: struts conventions struts-1


    【解决方案1】:

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

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

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

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

    但这不是吓坏哈利波特! 整数和日期的转换可能会失败。为什么?

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

    如果用户插入字符串“5”,则该字段设置为 5。没关系!

    但是如果用户插入“bla”呢?我们会遇到一个异常吗?没有!我们返回零值,因为转换(静默)失败。 起立!

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

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

    起立!

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

    1. 我是否应该创建一个 Date 变量并创建一个 setDate(String date) 方法来进行转换。

    在某些时候,您必须将日期发送回视图,而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 与视图标签交互。

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

    1. 创建一个 Date 变量,一个 setDate(Date date) 并在链的某处注册一个特殊的转换器(不知道是否可能)

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

    问题?您能否在不破坏使用各种格式或区域设置以自己的方式将字符串转换为日期的代码的情况下将其容纳到现有应用程序中?

    1. 创建一个 String 变量,一个 setDate(String date) 并让 actionForm bean 中的 validate 方法转换/验证

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

    那么约定是什么?

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

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

    附:在我结束这一切并上床睡觉之前(在我的国家是 01:00 AM :D)我只想提一件事人们经常看不到的东西。 ActionForm 不是模型的一部分,它也不应该直接与模型交互。

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

    ActionForm 只是 Action(控制器)和视图之间的通信路径。照此处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多