当前位置: 首页 > 面试题库 >

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

夏祯
2023-03-14
问题内容

由于对设计模式和体系结构不熟悉,我很难向他人确切说明我的最新应用程序是如何设计的。我已经在认为它是纯n层,纯MVC和表示层中具有MVC的n层之间切换。目前,我认为后者是正确的,但我希望更多有经验的开发人员能有所作为。

  1. 浏览器将HTTP请求发送到Tomcat。通过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中时,我没有使用前端控制器模式,对吗?要使用Front Controller,我需要将所有请求转发到标准Servlet /控制器,该Servlet /控制器进而评估请求并调用另一个控制器?
  4. 业务层在我的应用程序中感觉有点“没用”。您通常在此图层/对象中放置什么?一个人应该总是有一个业务层吗?我知道它应该包含“业务逻辑”,但这到底是什么?我只是执行输入验证并实例化一个或多个DAO,并在其上调用适当的方法…

我意识到存在诸如Java的Struts之类的MVC框架,但是由于这是我的第一个Java
Web应用程序,因此我试图对事物的工作原理有更深入的了解。回顾过去,希望您能回答我偶然发现的一些问题。


问题答案:

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

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

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

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

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

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

数据层:

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



 类似资料:
  • 使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。

  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

  • 我是DSA的初学者,最近几天我一直在尝试使用邻接列表找到图形的正确实现。 下面我给出了我认为邻接列表是如何实现的整个代码。 我从头开始创建了一个SiinglyLinkedlist。并且我正在使用一个Hashmap来改进时间复杂性。 Hashmap中的整数键充当顶点&在其值中包含一个Linkedlist。 在顶点中,我存储了整数ID,在Linkedlist中,我存储了该ID的所有好友名。 图中有3种

  • 每次我在手机上运行应用程序都会崩溃。有什么不对劲吗?它说不幸的是“appname”已经停止工作。我也尝试过其他方法来检查Google Play服务,但它总是崩溃。我更新了我的google play服务,让一个运行良好的google map v2完美运行。这个代码有什么解决方案吗?它在我运行android 4.1.2的手机和我的AVD上崩溃。

  • 问题内容: 我需要检查我的应用程序是否在更新时启动,因为我需要创建一个仅在首次安装该应用程序时才出现的视图,以便在更新后再次出现。 问题答案: 您可以将值(例如,当前应用程序版本号)保存到其中,并在每次用户启动应用程序时对其进行检查。 在迅速-2版本看起来是这样的: 在迅速-3版本看起来是这样的: