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

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

怎么运行的:

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

结构(我的建议/理解)

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

逻辑层 :分为两层,Business Objects(BO)位于顶层。 负责业务逻辑,但除了输入validation之外我还没有找到太多内容,因为应用程序主要由简单的CRUD操作组成……在许多情况下,这些方法只是在DAO层上调用一个具有相同名称的方法。

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

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

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

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

我意识到有一些MVC框架,比如Struts for Java,但是由于这是我的第一个Java Web应用程序,我试图更深入地了解它是如何工作的。 回想起来,我希望你能回答我偶然发现的一些问题。

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

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

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

是的,关于您是否可以使用Web应用程序获得真正的MVC,这是一个争论的问题。

应该总是有业务层吗?

这取决于应用程序的类型。 某些应用程序是数据库驱动的,实际上是数据库的UI。 在这种情况下,需要的业务逻辑非常少。

数据层:

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

我想你会被术语挂掉。 MVC模式(我相信)早于您描述的经典Web应用程序拱。 它被用来称为web app arch MVC 2(Model 2等),以区别于原始MVC模式……

看到这个链接> http://www.javaranch.com/drive/servlet/#mvc2

HTH