侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MVC模式

coydone
2022-02-04 / 0 评论 / 0 点赞 / 395 阅读 / 3,767 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

JavaWeb中所需的技术

JavaEE API 文档:

java_ee_api_中英文对照版.chm

MVC模式

概述

MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 模式的目的是实现一种动态的程序设计,简化后续对程序的修改和扩展,并且使程序某一部分的重复利用成为可能。除此之外,MVC 模式通过对复杂度的简化,使程序的结构更加直观。软件系统在分离了自身的基本部分的同时,也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长进行相关的分组:

  • 模型(Model):程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能);

  • 控制器(Controller):负责转发请求,对请求进行处理;

  • 视图(View):界面设计人员进行图形界面设计。

MVC模式中三个组件的详细介绍如下:

  • 模型(Model):用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“Model”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,由此,View 可以了解在数据 Model 上发生的改变。(比如:观察者模式(软件设计模式));

  • 视图(View):能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册;

  • 控制器(Controller):起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。

从MVC模式的一般理解来看,视图层与模型层是存在直接联系的,并且模型层的变化会通过视图层反映出来,这确实是MVC模式的标准理解,不过在我目前接触到的实际应用中,更多的情况时,视图层与模型层是通过控制层联系起来的,两者之间并无直接的联系。

MVC模式的优缺点

优点

1、低耦合。

通过将视图层和业务层分离,允许更改视图层代码而不必重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变,只需要改动MVC的模型层(及控制器)即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。模型层是自包含的,并且与控制器和视图层相分离,所以很容易改变应用程序的数据层和业务规则。如果想把数据库从 MySQL 移植到 Oracle,或者改变基于 RDBMS 的数据源到 LDAP,只需改变模型层即可。一旦正确的实现了模型层,不管数据来自数据库或是 LDAP服务器,视图层都将会正确的显示它们。由于运用 MVC 的应用程序的三个部件是相互独立,改变其中一个部件并不会影响其它两个,所以依据这种设计思想能构造出良好的松耦合的构件。

2、重用性高。

随着技术的不断进步,当前需要使用越来越多的方式来访问应用程序了。MVC模式允许使用各种不同样式的视图来访问同一个服务端的代码,这得益于多个视图(如WEB(HTTP)浏览器或者无线浏览器(WAP))能共享一个模型。比如,用户可以通过电脑或通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式(流程)是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面(视图)使用。例如,很多数据可能用 HTML 来表示,但是也有可能用 WAP 来表示,而这些表示的变化所需要的是仅仅是改变视图层的实现方式,而控制层和模型层无需做任何改变。由于已经将数据和业务规则从表示层分开,所以可以最大化的进行代码重用了。另外,模型层也有状态管理和数据持久性处理的功能,所以,基于会话的购物车和电子商务过程,也能被Flash网站或者无线联网的应用程序所重用。

3、生命周期成本低。MVC模式使开发和维护用户接口的技术含量降低。

4、部署快。使用MVC模式进行软件开发,使得软件开发时间得到相当大的缩减,它使后台程序员集中精力于业务逻辑,界面程序员集中精力于表现形式上。

5、可维护性高。分离视图层和业务逻辑层使得WEB应用更易于维护和修改。

6、有利软件工程化管理。

由于不同的组件(层)各司其职,每一层不同的应用会具有某些相同的特征,这样就有利于通过工程化、工具化的方式管理程序代码。控制器同时还提供了一个好处,就是可以使用控制器来联接不同的模型和视图,来实现用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

缺点

1、没有明确的定义。

完全理解MVC模式并不是很容易,使用MVC模式需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考软件的架构。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。

2、不适合小、中型应用程序。花费大量时间将MVC模式应用到规模并不是很大的应用程序通常会得不偿失。

3、增加系统结构和实现的复杂性。

对于简单的界面来说,非要严格遵循MVC模式,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

4、视图对模型数据的低效率访问。

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

**说明:**如果通过控制器访问模型层(而非视图层直接访问),则避免对未变化数据的不必要的频繁访问,从而解决此问题。

MVC模式在JavaWeb项目中的体现

JavaWeb模式演变

JavaWeb的经历了JSP Model1、JSP Model1二代、JSP Model2三个时期。

JSP Model1第一代

JSP产生之后,有一段时间,放弃servlet。使用html+java+jsp标签。

JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低。Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。

Model1体现:

JSP负责:连接数据库、jdbc、封装响应、控制页面、响应客户端请求。

JSP Model1第二代

又称model2第一代。JSP Model1第二代有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(控制器)的工作耦合在一起了。

JSP:通过调用JavaBean提供数据库操作方法,实现数据的管理。

扮演两个人角色:负责数据的收集和显示、控制器实现页面的转发和重定向、Service调用。

JSP Model2

JSP Model2模式已经可以清晰的看到MVC完整的结构了。

  • JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;

  • Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;

  • JavaBean:模型层,完成具体的业务工作,例如:开启、转账等。

JSP响应客户端请求:Servlet处理的数据结果以一种较为美好的格式显示,便于阅读。

JavaWeb技术:crud main→Servlet+JSP,提升程序扩展性和维护性。

JSP Model2适合多人合作开发大型的Web项目,各司其职,互不干涉,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发人员的技术要求也提高了。

JavaWeb经典三层框架

JDBC整合基于三层框架

  • Domain:数据库中所有的表转换出来的Java类,也称JavaBean。

  • Dao:数据库sql语句执行的代码insert update

  • Service:业务逻辑层(需求)调用DAO功能获取数据库的数据,然后执行相应需求。

  • 控制器:Servlet获取客户端提交的数据,调用Service方法得到处理的结果,存储域对象,转发或者重定向JSP。

  • 界面层:JSP获取用户输入的数据,EL表达式显示数据。

我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的。

所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access)。

  • WEB层:包含JSP和Servlet等与WEB相关的内容;

  • 业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;

  • 数据层:封装了对数据库的访问细节;

注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层。

0

评论区