1、第11章 MVC模型,11.1 应用程序结构,1.常用三层结构模式,2. MVC模型,MVC模式包括三个部分:模型(Model)、视图(View)和控制器(Controller),分别对应于内部数据、数据表示和输入输出控制部分。 把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层模型层、视图层、控制层。,MVC设计模型,(1)视图(View),视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。 一个应用
2、可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。,(2)模型(Model),模型(Model):就是业务流程/状态的处理以及业务规则的制定。 业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。 业务模型的设计可以说是MVC最主要的核心。,对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出
3、来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。 业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中,(3)控制器(Controller),控制(Controller)可以理解为从
4、用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。 划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。,对MVC关系图的理解,MVC 模式的优缺点,1MVC 模式的优点(1)将数据建模、数据显示和用户交互三者分开,使得程序设计的过程更清晰,提高了可复用程度。(2)当接口设计完成以后,可以开展并行
5、开发,从而提高了开发效率。(3)可以很方便地用多个视图来显示多套数据,从而使系统能方便地支持其他新的客户端类型。 2MVC 模式的缺点(1)由于实施MVC 模式过程而产生的开销。(2)由于设计MVC 模式时分析不够、设计不当而引起相反的效果,把属于一个模块的分开,把不相干的模块聚在一起。,小结MVC (1)MVC的优点,大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。 例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性
6、需求。 MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。,MVC是构筑软件非常好的基本模式,至少将业务处理与显示分离,强迫将应用分为模型、视图以及控制层, 使得你会认真考虑应用的额外复杂性,把这些想法融进到架构中,增加了应用的可拓展性。如果能把握到这一点,MVC模式会使得你的应用更加强壮,更加有弹性,更加个性化。,小结MVC(2),11.2 JSP的两种应用模式,早期的JSP规范提出了两种用JSP技术建立应用程序的方式。这两种方式在术语中分别称作JSP Model 1 和JSP Model 2。 1、JSP Model 1体系JSP页面独自响
7、应请求并将处理结果返回客户。这里仍然存在表达与内容的分离,因为所以的数据存取都是由Java Bean来完成的。,JSP Model 1 体系结构,尽管Model 1体系十分适合简单应用的需要,它却不能满足复杂的大型应用程序的实现。 不加选择地随意运用Model 1,会导致JSP页内被嵌入大量的脚本片段或Java代码。 尽管这对于Java程序员来说可能不是什么大问题,但如果JSP页面是由网页设计人员开发并维护的。 从根本上讲,将导致角色定义不清和职责分配不明,给项目管理带来不必要的麻烦。,2、JSP Model 2,JSP Model 2体系结构,是一种把JSP与servlets联合使用来实现动
8、态内容服务的方法。 它吸取了两种技术各自的突出优点,用JSP生成表达层的内容,让servlets完成深层次的处理任务。,JSP Model 2体系结构图,在这里,servlets充当控制者的角色,负责管理对请求的处理,创建JSP页需要使用的Java Bean和对象,同时根据用户的动作决定把那个JSP页传给请求者。 特别要注意,在JSP页内没有处理逻辑;它仅负责检索原先由servlets创建的对象或JavaBeans,从servlet中提取动态内容插入静态模板。,这是一种有代表性的方法,它清晰地分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工,遵循了MVC设计模式。 事实上,项目越
9、复杂,使用Model 2体系结构的好处就越大。,11.3 JSP Model 2 示例,(1)web.xml 配置servlet,即Controller上面是web.xml文件的片段,在这里定义了一个servlet用于处理请求。,(2)View-Test.jsp,在这个JSP中,并没有直接去调用JSP或JavaBean,而是把请求分送到Servlet中。下面,我们来看看Servlet的代码。,在Servlet中并没有直接处理所提交的请求,而是把请求的处理推后到ArticleCommand类中,通过ArticleCommand对象来执行,如代码(1)。 在处理完请求后,转到相应的页面中,如代码(
10、2)。 下面,我们看一下Medel- ArticleCommand类的代码。,showallarticle.jsp,序列图,首先在Veiw层的test.jsp中提交一个请求/servlet/control/Controller?command=showarticle; 在Controller层的Controller对象中,根据请求的类型来调用相应的业务处理类,在这里,command值为showarticle的请求的业务处理类为ArticleCommand类,所以调用该类的对象的相应函数;,新闻公告系统处理流程,处理流程(2),在Model层的ArticleCommand类主要实现请求的取得所有
11、文章的业务功能,把结果保存在request中,并返回跳转页面作为返回值; 回到Controller层的Controller对象,根据上一步骤的返回值进行页面转发。 转发到View层的showallarticle.jsp页面,这个页面从request中取得结果并进行显示。在这个JSP中虽然也有Java代码,但这些代码只是用于显示结果,并没有涉及到任何业务逻辑。,示例2:用户登录(非真实系统),(1)用户通过登录界面输入验证信息(logon.jsp) (2)Controller(Controller.java)通过判断将请求转发给Model进行身份验证(Logon.java) (3)Model经处
12、理,对不同类型的用户返回不同的页面View(user.jsp,Admin.jsp) (4) View显示用户得到请求结果,13.4 Struts简介,Struts项目作为一个设想是Craig McClanahan在2000年提出的,目标是为利用Java技术开发基于MVC模式的Web应用提供一个标准模式。 Struts 1.0在2001年中期被最终发布,现在成为 Apache Foundation的Jakarta项目的一部分。 Struts是一个高度可配置、高度扩展性的MVC框架,我们几乎可以用它开发任何能想到的用Java技术的Web应用。MVC模式的每一部分在Structs中都有相关对应部分。
13、,1、Struts的组成,Struts可分为以下四个主要部分,其中三个就和MVC模式紧密相关: 模型(Model),本质上来说在Struts中Model是一个Action类,开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config.xml文件描述的配置信息的。 视图(View),View是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用她们我们可以快速建立应用系统的界面。,控制器(Controller),本质上是一个Servlet,将客户端请求转发到相应的Action类。 一堆用来做XML文件解析的工具
14、包,Struts是用XML来描述如何自动产生一些JavaBean的属性的,此外Struts还利用XML来描述在国际化应用中的用户提示信息的。,Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中Controller功能由ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Ac
15、tion处理器对象之间的映射。,View:Struts应用中的View部分是通过JSP技术实现的。Struts提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。,Model: MVC系统中的Model部分从概念上可以分为两类-系统的内部状态,和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是开发者从Struts的
16、Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。,Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。,通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度
17、也可以使用像Entity EJB 和 Session EJB等组件来实现系统状态。Struts建议在实现时把“做什么“(Action)和“如何做“(业务逻辑)分离。这样可以实现业务逻辑的重用。,11.5 Java对象持久化技术,当今越来越多的Web应用是基于MVC设计模式的,此种设计模式提高了应用系统的可维护性、可扩展性和组件的可复用性。 Apache开源组织提供的Struts框架充分体现了MVC架构。Hibernate实际上是一个用对象编程思维来操纵数据库的解决方案,提出了一种基于Struts和Hibernate架构的Web应用开发策略。 MVC架构中的模型部分(数据持久层)用Hiberna
18、te实现,视图和控制器的实现依托于Struts框架。这种策略真正实现了层间的松散耦合。,Hibernate简介,Hibemate是Apache软件基金的一个开放源代码的ORMapping(对象关系映射)框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲地使用对象编程思想来操纵数据库。 Hibernate相当于是对持久层数据处理的一种新的解决方案。 Hibernate完全着眼于关系数据库的OR映射,并且包括比大多数商业产品更多的功能。 Hibernate帮助基于普通的Java对象模型的持久对象的创建,从而允许持久对象拥有复杂的结构如混合类型、集合和属性,还可以拥有用户自定义的
19、类型。,Eclipse + MyEclipse 实例开发Struts,(1)创建一个Web ProjectFile-New-other-J2EE 选择web project ) (2)创建包 (3)创建Struts支持 右键单击你的项目, MyEclipse - Add Struts Capabilities (4)新建两个jsp页 一个名为errors.jsp,另一个为success.jsp,Eclipse + MyEclipse 实例开发Struts(2),(5)创建你的Action File - New - Other. Struts1.1 Form,Action&jsp. use case:用例图名称 Form type选择上图已选选项,(7) use case:写上用例图名称 Form type选择图中已选选项,选中Create JSP form,单击Next,在Forwards 选项卡上加入前述步骤所建的两个页面。 如:name:errors path:errors.jsp (8) 编写Action中的excute()方法,