我被告知MVC是多层架构上表示层的架构模式。我不了解MVC模型的概念。
所以我创建了一个Web应用程序,作为学习MVC模型的方法,只使用JSP和Servlets,我也创建了DataAccess层。
在我的WebContent文件夹中,我放置了所有视图。
在我的src(Java内容)文件夹中,我制作了4个包。
data
presentation.model
presentation.controller
businessEntities
我使用Servlets作为控制器(使用FrontController模式)和JSP用于所有视图。
正如标题所说,我的问题在于模型。
现在,让我们举个例子......
我有两节课。
- Car
- CarLogic
CarLogic是一个类,它调用可能的CarDAO来获取数据并将其返回给任何要求它的人。汽车只是POJO。
我将CarLogic放置在presentation.model和Car on businessEntities中。
我错了吗?我应该把什么放在Model包上?
谢谢!
答案 0 :(得分:3)
当嵌套在多层体系结构的表示层中时,MVC的模型通常只是(可能是增强的)键值映射。
控制器在调用适当的业务层服务后,使用视图必须显示的值来实现新地图。
Spring MVC以此方式实现了MVC模式:了解ModelMap
如何扩展LinkedHashMap
。
当MVC模式嵌套在3层体系结构的表示层中时,请参阅this answer以查看典型的HTTP请求生命周期。
总而言之,我会将CarLogic
放入您的businessEntities
包中,Car
POJO
例如,在新的presentation.bean
包中(因此您不再需要presentation.model
包)。因此,您的控制器会将Car
实例添加为请求的属性,然后该属性将扮演模型的一部分:
request.setAttribute("theBean", yourBeanInstance);
在JSP视图中,只需使用${theBean.anyProperty}
来访问属性(不要忘记bean中的getter)。请注意,EL将按给定顺序扫描以下范围:页面,请求,会话,应用程序;然后将返回第一个找到的匹配。
答案 1 :(得分:3)
Model View Controller本身就是一个非常简单的模式。
来自维基百科的文章:
- 控制器可以向模型发送命令以更新模型的状态(例如,编辑文档)。它还可以将命令发送到其关联的视图,以更改视图的模型表示(例如,通过滚动文档)。
- 模型在其状态发生变化时通知其关联的视图和控制器。此通知允许视图生成更新的输出,控制器可以更改可用的命令集。在某些情况下,MVC实现可能是“被动的”,因此其他组件必须轮询模型以获取更新而不是通知。
- 视图向模型请求向用户生成输出表示所需的信息
至少它是简单的pre-web和pre-SOA。
视图部分仍然很简单,它只是呈现模型。
从控制器的角度来看,网络在其传统的http / html意义上而不是较新的JavaScript / AJAX / websocket意义上,使得控制器与视图的迭代比在Swing应用程序中更加明显。这意味着除了传统角色之外,web-app中的控制器不仅可以与模型交互,还可以对视图有一定的了解。
在模型方面,SOA之前的模型既代表了数据又代表了业务的行为。最近,anemic domain models已经变得流行于在数据表示的单独类中实现的行为,这些行为被传递给逻辑类(服务)。
就是这一点,与我认为你的问题有关的数据和逻辑分离有关。就个人而言,对于简单的系统,我更喜欢具有相同类别的数据和行为的丰富模型,因此包装很简单。但是我很欣赏有时将逻辑与数据分开的好处,在这种情况下,我会创建一个单独的包(可能是一个单独的jar)来包含该逻辑。
答案 2 :(得分:3)
“模型”一词在术语“模型 - 视图 - 控制器”中意味着微妙的不同,当你在诸如你的n层架构中说“模型层”时。从MVC的角度来看,控制器传递输入并从中获取可查看数据的所有内容都是“模型”。
这包括您的域模型(Car
)和业务逻辑(CarLogic
)。您不一定需要构建应用程序以完全匹配您在UI端使用的模式。 (事实上,MVC模式可能不足以覆盖整个应用程序。)
因此,在您的情况下,将Car
放入businessEntities
就可以了。不确定开始使用presentation.model
- 业务逻辑不是表示关注点,并且可能属于某个层。这就是我放CarLogic
的地方。
我根本不知道data
包应该是什么。
此拆分意味着您的应用程序中似乎没有专用的演示模型。这可能是也可能不是问题。在Web应用程序中,表示模型通常做的是封装用户输入,或者将业务实体映射到更适合视图需求的结构 - 扁平化复杂关系等(在经典的Spring MVC中,这些将是{{ 1}}和Command
类。)在一个足够简单的应用程序中,或者使用足够先进的Web框架,可以在视图中直接使用域模型实体。
作为一个独特的表达模型的例子,考虑学校将使用的内部系统。你有一群学生,还有一些他们可以注册的课程。在商业实体层,你可能有一个单独的Model
实体,它可以保存注册日期,成绩等参数。学生进入课堂等等。但是,当应用程序中的视图需要显示学生注册的课程列表时,根本不需要查看Enrollment
对象。因此,有一个只包含Enrollment
个对象列表的表示模型对象Student
是有意义的。 (以及读取业务实体并将其正确映射到此结构的必需代码。)
答案 3 :(得分:2)
模型 - 视图 - 控制器(MVC)是用于实现用户界面的软件模式。它将给定的软件应用程序划分为三个相互连接的部分,以便将信息的内部表示与信息呈现给用户或从用户接受的方式分开。 中心组件即模型由应用程序数据,业务规则,逻辑和函数组成。视图可以是信息的任何输出表示,例如图表或图表。可以使用相同信息的多个视图,例如管理条形图和会计师的表格视图。第三部分,即控制器,接受输入并将其转换为模型或视图的命令。
我突出了一句话,通常不被理解。该模型是一个非常丰富的模型。这意味着,它还包含与数据一起使用的每个逻辑。由您决定是否拥有单独的数据类和逻辑类(将数据类减少为结构或记录),或者是否具有已包含某些业务方法的更丰富的数据类(我更喜欢的方式)。 / p>
也就是说,控制器只是模型和视图之间的交互。在Swing应用程序中 - 例如 - 控制器只是各种监听器(例如ActionListener)。
所以,回答你的问题:拥有一个单独的数据访问层是一件好事。这是您的DAO类所属的位置。数据和逻辑类(模型)属于模型包。我不会为他们创建几个包。
答案 4 :(得分:1)
MVC是许多现代Web框架使用的常见设计模式,例如: GRAILS,Spring MVC或ASP.NET MVC。您会看到MVC模式包含在其名称中;)
对于MVC模式,您实际上需要三个包:
在模型包中,您将放置用于保存数据的类。控制器类包含控制哪个视图被调用以及哪些数据应该在这些视图中使用的逻辑。视图本身包含如何在屏幕上显示数据的信息。不应该有任何伟大的逻辑,比如说。只是JavaScript。业务逻辑应包含在单独的包中。如果您需要此逻辑,则可以从控制器呼叫。
你的包裹(我希望我能正确阅读!):
根据MVC模式建议您使用以下软件包:
答案 5 :(得分:0)
MVC代表模型视图控制器。
模型是存储实体对象的地方 查看存储演示文稿对象 Controller是将模型中存在的属性映射到小部件的位置。
以便将属性设置为小部件输入中的实体对象。