代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

我是否正确地使用MVC实现了n层应用程序?

  •  2
  • Mads Mobæk  · 技术社区  · 15 年前

    由于对设计模式和体系结构非常不熟悉,我很难准确地向其他人解释我的最新应用程序是如何设计的。我认为它是一个纯n层、纯MVC和在表示层有MVC的n层。目前我认为后者是正确的,但我想从更有经验的开发人员那里得到一些想法。

    工作原理:

    1. 控制器实例化一个或多个业务对象并调用这些对象上的方法,即。 customerBO.getById(12) customerDAO.getById(12) . BO将CustomerVO的列表返回给控制器
    2. request.setAttribute("customers", customers); )并选择要使用的.jsp文件,该文件将迭代列表并将XHTML呈现回浏览器。

    结构(我的建议/理解)

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

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

    使用CRUD方法的DAO类,它再次与下面的数据层联系。还有一个convertToVO(ResultSet res)方法,可以从数据库和(列表)值对象执行ORM。所有方法都将值对象作为输入,即customerDAO->保存(投票者)并在成功时返回更新的投票者,失败时返回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框架,比如strutsforjava,但自从这是我的第一个javaweb应用程序以来,我就试图更深入地理解事物是如何工作的。回顾过去,我希望你能回答我偶然发现的一些问题。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Gary Kephart    15 年前

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

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

    在MVC中,视图应该观察模型并在更改时更新,但在web应用程序中这是不可能的

    是的,这是一个争论的问题,关于你是否能用web应用程序实现真正的MVC。

    一个人应该总是有一个业务层吗?

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

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

        2
  •  0
  •   Tom    15 年前

    我想你对术语有点迷糊了。MVC模式(我相信)早于您描述的经典web应用程序架构。过去人们称之为web应用程序arch MVC 2(Model 2等)以区别于原始MVC模式。。。

    请参见此链接> http://www.javaranch.com/drive/servlet/#mvc2