【问题标题】:Have I implemented a n-tier application with MVC correctly?我是否使用 MVC 正确实现了 n 层应用程序?
【发布时间】:2010-10-28 08:10:03
【问题描述】:

由于对设计模式和架构非常陌生,我很难向其他人解释我的最新应用程序是如何设计的。我已经在认为它是纯 n 层、纯 MVC 和表示层中带有 MVC 的 n 层之间切换。目前我认为后者是正确的,但我想从更有经验的开发人员那里得到想法。

工作原理:

  1. 浏览器向 Tomcat 发送 HTTP 请求。通过 web.xml 将请求映射到一个 servlet(我称之为控制器)
  2. 控制器实例化一个或多个业务对象并在这些对象上调用方法,即customerBO.getById(12),这将在调用一个或多个DAO方法之前再次执行业务逻辑/验证,即customerDAO.getById(12)。 BO 将 CustomerVO 列表返回给控制器
  3. 控制器为视图 (JSP) (request.setAttribute("customers", customers);) 准备属性并选择要使用的 .jsp 文件,该文件反过来将迭代列表并将 XHTML 呈现回浏览器。

结构(我的建议/理解)

表示层:目前使用的是我认为的 MVC Web 实现:servlet(控制器)、jsp(视图)和我自己的 OO XHTML 表单实现(即 CustomerForm)就在这里。应该可以通过切换此表示层来使用 Swing/JavaFX/Flex GUI,而无需更改下面层上的任何内容。

逻辑层:分为两层,顶部是业务对象 (BO)。负责业务逻辑,但除了输入验证外,我没有发现太多可放在这里的内容,因为应用程序主要由简单的 CRUD 操作组成……在许多情况下,这些方法只是调用 DAO 层上具有相同名称的方法。

带有 CRUD 方法的 DAO 类,它再次与下面的数据层联系。还有一个 convertToVO(ResultSet res) 方法,它们从数据库执行 ORM 并到(列表)值对象。所有方法都将值对象作为输入,即 customerDAO->save(voter) 并在成功时返回更新的投票者,在失败时返回 null。

数据层:在底层,数据存储在数据库中或作为 XML 文件。除了一些 MySQL 存储过程和触发器,我没有在这里“编码”任何东西。

问题(除了标题中的问题):

  1. MVC 中的 M。我不确定当模型是从逻辑层中的业务对象返回的列表/VO 时是否可以调用此 n 层 MVC?当控制器/视图在这里时,模型是否需要驻留在表示层中?表示层中的表单模板可以称为模型吗?如果是这样的话; BO 中的表单和列表是否都被视为 MVC 中的 M?
  2. 据我了解,在 MVC 中,视图应该观察模型并根据更改进行更新,但这在视图是呈现 XHTML 页面的 Web 应用程序中是不可能的?这反过来又让我想到了一个问题:Web 应用程序与常规桌面应用程序的 MVC 实现方式是否不同?
  3. 当所有 HTTP 请求都显式映射到 web.xml 时,我没有使用前端控制器模式,对吗?要使用前端控制器,我需要将所有请求转发到标准 servlet/控制器,然后由后者评估请求并调用另一个控制器?
  4. 在我的应用程序中,业务层感觉有点“无用”。您通常在此层/对象中放置什么?是否应该始终有一个业务层?我知道它应该包含“业务逻辑”,但这究竟是什么?我只是执行输入验证并实例化一个或多个 DAO 并在它们上调用适当的方法...

我意识到存在 MVC 框架,例如 Struts for Java,但自从这是我的第一个 Java Web 应用程序以来,我试图更深入地了解事物的工作原理。回想起来,我希望你能回答我偶然发现的一些问题。

【问题讨论】:

标签: java model-view-controller architecture web-applications n-tier-architecture


【解决方案1】:

当模型是从逻辑层中的业务对象返回的列表/VO 时,我不确定是否可以调用此 n 层 MVC

这些都是非常好的模型。我还认为 Struts 中的 ActionForms 是模型。 ActionForms 是 Struts 用来表示/建模 HTML 表单的。

在 MVC 中,视图应该观察模型并根据变化进行更新,但这在 Web 应用程序中是不可能的

是的,关于您是否可以在 Web 应用程序中使用真正的 MVC,这是一个有争议的问题。

是否应该始终有一个业务层?

这取决于应用程序的类型。一些应用程序是数据库驱动的,本质上是数据库的 UI。在这种情况下,只需要很少的业务逻辑。

数据层:

存储过程实际上并不是数据层代码的一部分。您应该创建由业务对象调用的数据访问对象 (DAO)。 DAO 调用存储过程。此外,DAO 接口不应向业务对象提示数据存储在何处,无论是数据库、文件系统还是来自某些 Web 服务。

【讨论】:

    【解决方案2】:

    我认为您对术语感到困惑。 MVC 模式(我相信)早于您描述的经典 Web 应用程序架构。过去人们将其称为 web app arch MVC 2(Model 2 等)以将其与原始 MVC 模式区分开来......

    查看此链接 > http://www.javaranch.com/drive/servlet/#mvc2

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2012-03-04
      • 2020-10-16
      • 1970-01-01
      • 2017-01-04
      • 2013-07-20
      相关资源
      最近更新 更多