热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IT兄弟连JavaWeb教程MVC设计模式

MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开。MVC把应用程序分成3个核心模块:模型、视

MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开。MVC把应用程序分成3个核心模块:模型、视图和控制器,它们分别担当不同的任务。图1显示了这几个模块各自的功能及它们的相互关系。

1a66e0ae851643c8af9017e45d10d9b5.png

图1  MVC设计模式

 

1  视图

视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型。视图还能接收模型发出的数据更新事件,从而对用户界面进行同步更新。

 

2  模型

模型是应用程序的主体部分。模型表示业务数据和业务逻辑,一个模型能为多个视图提供数据。由于同一个模型可以被多个视图重用,所以提高了模型的可重用性。

 

3  控制器

控制器负责应用的流程控制。所谓流程控制,这里是指接收用户的输入并调用相应的模型和视图去完成用户的需求。当Web用户单击Web界面中的"提交"按钮来发送HTML表单时,控制器会接收请求并调用相应的模型组件去处理请求,然后在调用相应的视图来显示模型返回的数据。

 

4  MVC处理过程

我们来总结一下MVC处理过程,首先控制器接收用户的请求,并决定应该调用那个模型来进行处理;然后模型根据客户请求进行相应的业务逻辑处理,并返回数据。最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。

 

5  MVC的优点

在最初的JSP网页中,像数据库查询语句这样的数据访问代码和像HTML这样的表示层代码是混在一起的。经验比较丰富的开发者会将数据库访问代码从表示层分离开来,但这通常不是很容易做到的,它需要精心的设计和不断地尝试,MVC从根本上强制性地将他们分开。尽管构成MVC应用程序需要一些额外的工作,但是它给开发人员带了的诸多优点是毋庸置疑的。

首先,多个视图能共享一个模型。如今,同一个Web应用程序会提供多种用户界面,例如用户即希望能通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱,这就要求Web网站同时提供Web界面和WAP界面。在MVC设计模式中,模型响应客户请求并返回响应数据,视图负责格式化数据并把他们呈现给用户,业务逻辑和表示层分离。同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。

其次,模型是自包含的,与控制器和视图保持相对独立,所以可以方便地改变应用程序的业务数据和业务规则。如果要把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需更改模型即可。一旦正确地实现了模型,不管数据是来自数据库还是来自LDAP服务器,视图都会正确地显示它们。由于MVC的3个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的松耦合的构件。

此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来连接不同的模型和视图去完成用户的需求,还可以为构造应用程序提供强有力的组合手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型进行处理,然后选择适当的视图将处理结果显示给用户。

 

MVC的适用范围

使用MVC需要精心的设计,并且由于它的内部原理比较复杂,所以需要花费一些时间去理解它,将MVC运用到应用程序中,会带来额外的工作量,增加应用的复杂性,所以MVC不适合小型应用程序。

但对于开发存在大量用户界面,并且业务逻辑复杂的大型应用程序,MVC将会使软件在健壮性和代码可重用性方面上一个新的台阶。尽管最初构件MVC框架会花费一定的时间,但从长远角度看,它会大大提高后期软件开发的效率。

JSP Model1 和 JSP Model2

尽管MVC设计模式很早就出现了,但在Web应用的开发中引入MVC却是步履艰难,其主要原因是在早期的Web应用的开发中,程序代码和HTML代码的分离一直难以实现。例如在JSP网页中执行业务逻辑的程序代码和HTML表示层代码混杂在一起,因而很难分离出单独的业务模型,从而使得产品设计的弹性力度很小,很难满足用户的变化性需求。

在早期的JavaWeb应用中,JSP文件负责处理业务逻辑、控制网页流程并创建HTML页面,JSP文件时一个独立的、能自主完成所有任务的模块,这给Web开发带来一系列问题。

HTML代码和Java程序代码强耦合在一起:JSP文件的编写者必须即是网页设计者,又是Java开发者。但实际情况是,多数Web开发人员那么只精通网页设计,能够设计出漂亮的网页外观,但是编写的Java代码很糟糕;要么仅熟悉Java编程,能够编写健壮的Java代码,但是设计的网页外观很难看。这两种才能介备的开发人员并不多见。

内嵌的流程控制逻辑:要理解应用程序的整个流程,必须浏览所有JSP页面,试想一下拥有100多个网页的网站的流程控制逻辑应该多么错综复杂。

调试困难:除了很糟的外观设计,HTML标记、Java代码和Javascript代码都集中在一个网页中,这使调试变得相当困难。

可维护性差:更改业务逻辑或控制流程往往牵涉相关的多个JSP页面。

可读性差:设想有1000行代码的网页,其编码样式看起来杂乱无章。即使有彩色语法显示,阅读和理解这些代码仍然比较困难。

为了解决以上问题,SUN公司先后制定了两种设计模式,分别为JSP Model1和JSP Model2,虽然JSP Model1在一定程度上实现了MVC中的视图和模型,但是它的运用并不理想,这种状况直到基于JavaEE的JSP Model2问世才得以改观。JSP Model2用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean技术实现模型的功能。

JSP Model1和JSP Model2的本质区别在于负责流程控制的组件不同。在Model1中,JSP页面负责调用模型组件来响应客户请求,并将处理结果返回给用户,JSP既要负责流程控制,还要负责产生用户界面,因此他要同时充当视图和控制器的功能。所以未能实现这两个模块之间的独立和分离。尽管Model1十分适合简单应用的小,但它不适合开发复杂的大型应用程序。不加选择地随意运用Model1,仍然会导致JSP页内嵌入大量的Java代码。尽管这对于Java程序员来说可能不是什么大问题,但如果JSP页面时有网页设计人员开发并维护的(通常这是开发大型项目的规范),这就确实是个问题了。从根本上讲,这将导致角色定不清和职责分配不明,从而给项目管理带来很多麻烦。

JSP Model2体系结构,是一种联合使用JSP与Servlet来提供动态内容服务的方法。它吸取了JSP和Servlet两种技术各自的突出优点,用JSP生成表示层内容,让Servlet完成深层次的处理任务。在这里,Servlet充当控制器的角色,负责处理客户请求,创建JSP页面需要使用的JavaBean对象,并根据客户请求选择合适的JSP页面返回给用户。在JSP页面没有流程控制逻辑,它仅负责检索原先由Servlet创建的JavaBean对象,并把JavaBean对象包含的数据作为动态内容插入到静态模板中。这是一种有突破性的软件设计方法,它清晰地分离了数据展示、数据处理和流程控制,明确了角色定义及软件开发者与网页设计者的分工。事实上,项目越复杂,使用Model2设计模式的好处就越多。


推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
author-avatar
潮流Fee_750
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有