【问题标题】:Java EE - What is the correct layer for formatting domain model objects before passing them to views?Java EE - 在将域模型对象传递给视图之前格式化域模型对象的正确层是什么?
【发布时间】:2011-07-13 20:14:08
【问题描述】:

我正在开发一个具有典型分层架构的 Web 应用程序:

从数据库中检索域模型对象的 DAO 层;

该层与使用这些对象进行一些业务操作的服务层通信;

Web 层(Spring 控制器)使用服务层检索域模型对象(或它们的集合)并将它们传递给视图层;

视图层可以是使用 JSTL 显示数据的简单 JSP,也可以是通过 AJAX 以 JSON 对象(通过 Jackson 库转换为 JSON 的域对象)形式检索一些数据的 JSP。

我一直在研究以下内容:

我经常需要将 db 字段转换为不同的格式以显示给用户。例如,日期可能存储为时间戳,我希望它显示为格式化日期(例如 dd/mm/yyyy)。

另外,我需要做相反的事情,将一些值(通常是用户输入)转换为域模型对象属性的格式。

我的问题是,我应该在哪里进行这种转换?尤其是 JSON 数据,它们应该已经在 AJAX 响应中进行了格式化,我认为我不应该使用 Javascript 来格式化它,对吗?

提前谢谢你。

【问题讨论】:

    标签: json jakarta-ee domain-model data-formatters


    【解决方案1】:

    我经常需要将 db 字段转换为不同的格式以 显示给用户。例如,日期可能存储为时间戳 我希望它显示为格式化的日期(例如 dd/mm/yyyy)。

    另外,我需要做相反的事情,转换一些价值(通常是用户 输入)到域模型对象属性的格式。

    我的问题是,我应该在哪里进行这种转换?

    我的观点是,所有数据格式的转换都应该在视图中完成,或者在协作对象中完成。模型或服务层不应执行此活动。在模型中执行此操作将是糟糕的设计,因为它会将模型公开的接口耦合到仅一个视图。此外,这会使在视图中进行更改变得更加困难,这也需要对模型进行更改。

    您可以参考编写良好的 JSF 应用程序(因为您提到您使用的是 Java EE),其中编写了特定的转换器以确保视图能够适当地格式化域对象的内容。

    尤其是 JSON 数据,它们应该已经在 AJAX 响应中进行了格式化,我认为我不应该使用 Javascript 来格式化它,对吗?

    这取决于您如何查看视图。如果您对视图的表示是服务器必须向客户端提供格式化数据,那么服务器应该这样做。但是,大多数应用程序采用实用的方法,其中客户端逻辑也被视为视图的一部分。根据使用数据的上下文,您可以:

    • 在服务器上格式化数据,特别是如果格式化的数据在客户端普遍使用而无需任何进一步修改。
    • 或者,以规范形式将数据传输到客户端,然后根据使用数据和/或向用户显示数据的上下文对其进行格式化。

    【讨论】:

    • 我从来没有使用过 JSF,而且我读过很多关于它的负面信息,所以我现在不想去那里。您提到了“协作对象”,这是什么意思?某种包含要显示给视图的格式化数据的 DTO?这可能是一个很好的做法,但它可能是一种矫枉过正,为每个需要显示到视图的域模型类添加新类。我提到 Javascript 格式是一个坏主意,因为我知道维护它(或者在我的情况下是 jQuery)是一场噩梦。但如果我理解正确,你不会反对?
    • 如果视图类本身不格式化数据,而是将其委托给转换器来执行相同的操作,那么您正在使用协作者进行格式化。一个更简单的示例是 JSTL 中的 c:out 标记,它在将数据写入输出之前执行数据的 XML 编码。关于将编码数据从模型发送到视图的主题,我认为这是一种不好的做法。如果您明天需要添加一个不同的客户端——可能是胖客户端或 Web 服务,该怎么办?那你会怎么做?为每种形式的编码创建单独的 DTO 或域类是恕我直言的糟糕设计。
    • 如果我听起来很困惑,我很抱歉,但我不确定我是否理解。简而言之,您的意见是应该在客户端上完成格式化,无论是 JSTL 还是 Javascript。我对么?另外,您提到的 c:out 标签,它如何独立于视图?它是在视图中声明的,不是吗?所以,总而言之,在我的大部分数据来自 AJAX 调用的情况下,数据的所有格式都应该在 Javascript 中完成?
    • @alex,JSTL 在服务器上运行。 c:out 标签不独立于视图。它独立于模型,并且允许模型不关心编码。就数据格式而言,我的意见是你应该在“视图”中进行。它可以是浏览器端的 JavaScript,也可以是服务器端的例程,这取决于什么是合适的。这就是我所说的短语-Depending on the context in which the data is used 的意思。您可以在两个不同的层中进行格式化,但出于实际目的,请考虑您的应用程序中只有 1 个视图。
    • 只是为了澄清最后一件事,当有用户输入时,转换为 db 字段也应该在 Javascript 中完成?那么数据先转换再发送到服务器?
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多