Java开发中的Model1与Model2

对于Java的动态Web编程技术而言,则经历了所谓的Model1和Model2时代。

       Model1模式

       在Web早期的开发中,通常采用的都是Model1。Model1设计模式中,主要分为两层,视图层和模型层。那

么,项目中的业务流程该如何处理呢?实际上,Model1模式中就充当了这个角色,也就是说一切的业务逻辑都是由

JSP来处理的,通常是通过JSP直接调用模型来处理相关的业务,Model1是以JSP为中心的。

       举个例子,比如我们用Model1模式开发了一个网站,该网站可以注册会员,那么当我们在注册页面中点击提交

时,我们在页面中输入的数据就直接提交给一个JSP对象了,然后由该JSP对象直接调用DAO类对象,往数据库中插

入一条注册记录,实际上,JSP对象可以直接就是展示注册页面给我们的JSP。

      好了,看完例子,我们是否会觉得Model1的设计模式在逻辑上混乱呢?我想答案是肯定的,要不然也不会引

出现在正流行的MVC设计模式了。然而,Model1也还是有其自己点的。那就是,对于一个小项目而言,采用M

odel1模式来开发,开发效率往往会更高。但是,Model1开发模式所带来的问题是,使用该模式开发的项目难以扩

展,难以维护,代码重用率也相当低。 

  (1)传统的Model1模型

       Jsp是独立的,自主完成所有的任务。

       

  (2)改进的Model1模型

       Jsp页面与JavaBean共同协作完成任务。

       

       Model1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页

面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用

的扩展性和维护的难度。早期有大量ASP和JSP技术开发出来的Web应用,这些Web应用都采用了Model1架构

       Model1就是使用JSP+JavaBean技术,将页面显示和业务逻辑处理分开,使用JSP实现页面的显示,JavaBean对

象用来保存数据和实现业务逻辑,大概可以用下图来反映:

              

       Model1开发模式在JSP页面中嵌入了流程控制以及调用了JavaBean的方法,随着业务逻辑复杂度的增加,使用

Model1模式在开发及维护上都是非常复杂的,而一个软件的维护成本是非常高的,所以Model不能满足大型的应用

需求,这是就应该使用Model2的开发模式。

        Model1优点:

        简单,快速开发,适用小规模开发。

        Model1缺点:

        业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离,JSP负载太大。所以非常不利于应用系统业务的重用

和改动,不便于维护。

        Model2模式

        由于现在人对软件质量的要求越来越高,软件项目的规模也越来越大,所以Model1设计模式绝对不再适用于现

在的软件开发。现在的软件开发是以工程的思想进行的,因此,Model2,也就是MVC模式,自然而然就受到了人们

的追捧了。Model2设计模式,把一个Web软件项目分成三层,包括视图层、控制层、模型层。这样的分层思想,不

仅提高的代码的重用率、项目的扩展性,而且大大降低了项目的维护成本。此外,Model2设计模式的这种分层思

想,在逻辑上相当的清晰,易被人们接受,而且便于开发人员的分工合作,因此,大大提升了开发效率。现在,具体

谈一下Model2的三层结构是如何完成一个业务流层的吧。

       首先,要先介绍一下,Model2中的三层结构都包含了那些内容:

       视图层:包括JSP、HTML、CSS、JavaScript、图片等;

       控制层:由Servlet构成;

       模型层:由JavaBean构成(包括DAO等)。

       其次,对于一个具体的业务请求,这三层结构到底是如何配合完成的呢?举个例子,为了跟Model1模式做比

较,我们还是引用注册会员的例子。当我们点击注册页面上的提交按钮时,客户端的注册请求不再是传给一个JSP对

象了,而是传给了一个Servlet对象(控制层,我们定义该Servlet对象做为主控Servlet,由它来接收所有的业务请求,

然后决定交给哪个action对象来处理,最后由它来接收action对象返回的数据并跳转到指定的url),然后由该Servlet

对象决定将业务请求交给哪个具体的action对象来处理,然后当action对象处理完请求后,便返回一个url给该Servlet

对象,由该Servlet对象根据返回的url决定跳转到哪个页面(即决定将哪个页面展示给客户端)。另外,需要提到的

点就是,刚刚提到的action对象实际上是Model2模型中最关键的部分,因为它是model2中真正干活的组件,它解

的是做什么的问题,然后由它通过调用相关的业务组件(模型)来完成相应的业务,业务组件解决的是如何做的问

题。对于action对象该划分到控制层还是模型层的问题,其实这是有所争议的。个人比较赞成把它归到控制层中去,

因为它实际上并不执行具体的业务,只是调用相关的业务模型对象来处理罢了,换句话说,它不应该包含过多的业务

逻辑,而应该只是简单地收集客户端传过来的数据,并将这些数据传给具体的业务处理对象来处理,最后,由它决定

跳转到那个url,并由主控Servlet执行跳转。确切的来说,我认为它可以理解为是控制层与具体Model对象的适配

器。

        Model2开发模式是在Model1开发模式的基础上改进而来,具体就是我们将Model1开发模式中JSP中嵌入的调

用JavaBean代码及部分流程控制程序抽取出来,放到单独的组件处理,这个组件就是控制器,这样就从Model1模式

升级到了Model2模式了,Model2模式符合MVC模型。

        MVC模型是指的模型-视图-控制(Model-View-Controller),MVC模型可以将应用程序分割为三个组件,使得

序设计更容易,并且使各个组件之间的耦合度降低,具体来说:

       模型(Model):模型代表应用程序的数据以及用于访问控制和修改这些数据的业务规则。

       视图(View):视图用来组织模型的内容,视图对象使用对象模型的查询方法以获得数据,并将数据显示给用户,

体一点就是与用户交互的界面,对于Web应用来说,可以简单的理解为HTML。

       控制器(Controller):就是一个分发器,控制器并不做任何的数据处理,控制器定义了应用程序的行为,他负责对

来自视图的用户请求进行解析,并把请求映射成相应的行为,这些行为由模型负责实现。

       Model2的架构图如下图所示:

       

       在Model2模式中,JSP作为视图仅负责页面呈现,JavaBean作为模型负责业务逻辑,持久化操作,servlet作为

控制器负责流程控制,Model2模式的优点一是彻底分离了业务逻辑于表现逻辑,进一步简化了JSP页面。二是servlet

统一控制了页面的跳转于业务调用流程,极大地方便了维护!

       Model2中使用了三种技术:

       Jsp负责生成动态网页,只用做显示页面。

       Servlet负责流程控制,用来处理各种请求的分派。

       JavaBean负责业务逻辑,对数据库的操作。

       Model2的交互过程:

       

        用户通过浏览器向Web应用中的Servlet发送请求,Servlet接受到请求后实例化JavaBean对象,调用JavaBean

象的方法,JavaBean对象返回从数据库中读取的数据。Servlet选择合适JSP,并且把从数据库中读取的数据通过这

JSP进行显示,最后JSP页面把最终的结果返回给浏览器。

       Model2已经是MVC设计思想下的架构,由于引入了MVC模式,使Model2具有组件化的特点,更适用于大规模

应用的开发,但也增加了应用开发的复杂程度。
       Model2优点:

       1)消除了Model1的缺点

       2)该模式适合多人合作开发大型的Web项目

       3)各司其职,互不干涉

       4)有利于开发中的分工

       5)有利于组件的重用

       Model2缺点:

       Web项目的开发难度加大,同时对开发人员的技术要求也提高了。

已标记关键词 清除标记
JAVA开发人员必备是HTML格式 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需类和 applet 用来其 applet 上下文通信类。 java.awt 包含用于创建用户界面和绘制图形图像所有类。 java.awt.color 提供用于颜色空间类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统都会遇到它,它提供了一种机制,能够在两个 GUI 显示元素逻辑相关实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发各类事件接口和类。 java.awt.font 提供字体相关类和接口。 java.awt.geom 提供用于在二维几何形状相关对象上定义和执行操作 Java 2D 类。 java.awt.im 提供输入方法框架所需类和接口。 java.awt.im.spi 提供启用可以 Java 运行时环境一起使用输入方法开发接口。 java.awt.image 提供创建和修改图像各种类。 java.awt.image.renderable 提供用于生成呈现无关图像类和接口。 java.awt.print 为通用打印 API 提供类和接口。 java.beans 包含开发 beans 有关类,即基于 JavaBeansTM 架构组件。 java.beans.beancontext 提供 bean 上下文有关类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上程序服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上垃圾回收器之间交互。 java.lang.reflect 提供类和接口,以获得关于类和对象反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器缓冲区,并提供其他 NIO 包概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作实体(如文件和套接字)连接;定义了用于多路复用、非阻塞 I/O 操作选择器。 java.nio.channels.spi 用于 java.nio.channels 包服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包类和接口已经被 java.security 包类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径类和接口。 java.security.interfaces 提供接口用于生成 RSA Laboratory Technical Note PKCS#1 定义 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST FIPS-
相关推荐
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、级、高级等,详情看源码列表,需要可以直接下载! 这些源码反映了那时那景笔者对未来盲目,对代码热情、执着,对IT憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本音乐编辑功能。编辑音乐软件朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机流程及操作:获取系统属性,初始化JNDI,取得Home对象引用,创建EJB对象,并将当前计数器初始化,调用每一个EJB对象count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除,从账户取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化上下文,用clientgetHome()函数调用Home接口函数得到远程接口引用,用远程接口引用访问EJB。 EJBJNDI使用源码例子 1个目标文件,JNDI使用例子,有源代码,可以下载参考,JNDI使用,初始化Context,它是连接JNDI树起始点,查找你要对象,打印找到对象,关闭Context…… ftp文件传输 2个目标文件,FTP目标是:(1)提高文件共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间文件存储系统导致变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它主要作用是供程序使用。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 不同需求。例如,容易实现协议设计。 Java EJB有、无状态SessionBean两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象引用,创建EJB对象,计算利息等;在有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前计数器初始化,调用每一个EJB对象count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket使用。 Java 组播组发送和接受数据实例 3个目标文件。 Java读写文本文件示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送是公钥数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后公钥,将其解码,李四用张三公钥加密信息,并发送给李四,张三用自己私钥解密从李四处收到信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子21个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数因子 如题。 Java生成密钥实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件得到公钥编码字节数组、如何从字节数组解码公钥。 Java数据压缩传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页