420 likes | 566 Views
第 1 0 章 框架式编程和设计模式. 孙焘. 1. 2. 3. MVC 编程思想. structs 概述与举例. 框架式编程. 重点:. 1. 2. structs 流程. MVC 编程思想理解. 难点:. 10.1 框架式编程. 什么是模式 什么是框架 为什么要用模式 为什么要用框架 常见的设计模式 常见的 java 框架. 10.1 框架式编程. 10.1.1 什么是模式 模式,即 pattern 。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。
E N D
1 2 3 MVC编程思想 structs概述与举例 框架式编程 重点:
1 2 structs流程 MVC编程思想理解 难点:
10.1 框架式编程 • 什么是模式 • 什么是框架 • 为什么要用模式 • 为什么要用框架 • 常见的设计模式 • 常见的java框架
10.1 框架式编程 • 10.1.1 什么是模式 • 模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。 • Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。
10.1.2 什么是框架 框架,即framework。是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。 框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 10.1 框架式编程
10.1 框架式编程 • 10.1.3 为什么要用模式 • 因为模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。
10.1 框架式编程 • 10.1.4 为什么要用框架 • 因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。 框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。
10.1 框架式编程 • 10.1.5 常见的设计模式 • 最常见的MVC模式。 MVC模式是1996年由Buschmann提出的: 模型(Model):就是封装数据和所有基于对这些数据的操作。 视图(View):就是封装的是对数据显示,即用户界面。 控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等。
10.1 框架式编程 • 10.1.6 常见的JAVA框架 (1)WAF: 全称:WEB APPLICATION FRAMEWORK 主要应用方面:EJB层,(WEB层也有,但是比较弱)。 主要应用技术:EJB等 出处:http://java.sun.com/blueprints/code/index.html简述:这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系统)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现了 MVC和其他良好的设计模式。SUN的网站上有技术资料,最好下载PetStore来研究,WEBLOGIC里自带此系统,源码在bea\weblogic700\samples\server\src\petstore。这是学习了解J2EE的首选框架。 免费。
10.1 框架式编程 • 10.1.6 常见的JAVA框架 (2) Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。
10.1 框架式编程 • 10.1.6 常见的JAVA框架 (3)Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R mapping解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。
10.1 框架式编程 • 10.1.6 常见的JAVA框架 (4)Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
10.2 MVC编程思想 • MVC是什么 • MVC设计模式 • MVC的优点 • MVC的缺点 • MVC例子
10.2 MVC编程思想 • MVC是什么 MVC是一种目前广泛流行的软件设计模式,早在70年代,IBM就推出了Sanfronscisico项目计划,其实就是MVC设计模式的研究。近来,随着J2EE的成熟,它正在成为在J2EE平台上推荐的一种设计模型,也是广大Java开发者非常感兴趣的设计模型。MVC模式也逐渐在PHP和ColdFusion开发者中运用,并有增长趋势。随着网络应用的快速增加,MVC模式对于Web应用的开发无疑是一种非常先进的设计思想,无论你选择哪种语言,无论应用多复杂,它都能为你理解分析应用模型时提供最基本的分析方法,为你构造产品提供清晰的设计框架,为你的软件工程提供规范的依据。
10.2 MVC编程思想 • MVC设计模式 MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层
10.2 MVC编程思想 • MVC设计模式 模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。
10.2 MVC编程思想 • MVC设计模式 视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。
10.2 MVC编程思想 • MVC设计模式 控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
10.2 MVC编程思想 • MVC的优点 1.低耦合性。视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。 2.高重用性和可适用性 3.较低的生命周期成本 4.快速的部署 5.可维护性。分熟视图层和业务逻辑层也使得WEB应用更易于维护和修改 6.有利于软件工程化管理
10.2 MVC编程思想 • MVC的缺点 MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。 MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。 MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
10.2 MVC编程思想 • MVC的例子 servlet.java(MVC中的C) package zz; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class servlet extends HttpServlet{ public voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{ HttpSession session=request.getSession(); NameBean nameBean=new NameBean(); String name=request.getParameter("name"); nameBean.setname(name); session.setAttribute("nameBean",nameBean); String add="/WEB-INF/classes/ShowName.jsp"; RequestDispatcher dispatcher=request.getRequestDispatcher(add); dispatcher.forward(request,response); }}
10.2 MVC编程思想 • MVC的例子 NameBean.java(MVC中的M) package zz; public class NameBean{ private String name; public NameBean(){} public NameBean(String name){ setname(name); } public String getname(){ return name; } public void setname(String name){ this.name=name; }} 10.2 MVC编程思想
10.2 MVC编程思想 • MVC的例子 ShowName.jsp(MVC中的V)<%@ page session="true"%><HTML><HEAD><TITLE></TITLE></HEAD><BODY> <jsp:useBean id="nameBean" type="zz.NameBean" scope="session"/><jsp:getProperty name="nameBean" property="name"/></body></html>
10.3 struts概述与举例 • Struts 1 简介及存在的问题 • WebWork简介 • Struts2框架处理流程 • Struts2和Struts1的对比 • Struts2框架开发应用的过程 • Struts2编写Action • Struts2配置Action • Struts2下的helloworld
10.3 struts概述与举例 • Struts 1 简介及存在的问题 1.Model部分 模型主要由底层的业务逻辑组件充当,它们提供数据库访问和业务逻辑的实现。可以是javaBean、EJB组件或者WebService服务,struts1没有为实现Model组件提供任何支持 2.View部分 采用JSP实现,Struts1提供了丰富的标签库,减少JSP脚本的使用 3. Controller 由核心控制核心控制器-ActionServlet和用户自定义Action组合,由struts1框架提供支持 缺陷 1. 支持表现层技术单一 只支持JSP,不提供与其它表现层技术整合,如FreeMarker\ Velocity 2.与Servlet Api 严重耦合,难于测试 Action类包括HtttpServletRequest、HttpServletResponse 3.代码严重依赖于Struts1 Api,属于侵入式设计 Aciton类必须继承Action的基类
10.3 struts概述与举例 • WebWork简介 struts2是webwork的升级,webwork到struts2是一次平滑的过渡。 它来自另一个开源组织:opensymphony(交响乐) 1.View 它支持更多的表现层技术:velocity、freeMarker和xslt等 2.Controller 提供核心控制器ServletDispatcher 业务逻辑Action:,无需与servlet api耦合,由Action拦截器负责数据初始化,它只是一个普通的实现了webwork Action接口的POJO(包含了一个execute方法)
10.3 struts概述与举例 • Struts2框架处理流程
10.3 struts概述与举例 • Struts2框架处理流程 1.用户请求 2.核心控制器FilterDispatcher根据请求决定调用的Action 3.struts2拦截器链自动对请求应用通用功能 4.回调Action的execute方法 5.execute方法返回处理结果
10.3 struts概述与举例 • struts2和struts1的对比 1、Action类 struts1要继承一个抽象基类,属于抽象类编程而不是接口;struts2中Action实现接口是不必需的,只要一个包含execute的POJO类就要以作struts2的Action 2、线程模式 struts1的Action是单例模式并且必须是线程安全的,它用一个Action实例处理所有的请求;Struts2为每一个请求产生一个实例,没有线程安全的问题 3、Servlet依赖 struts1的Action严重依赖Servlet Api,使得测试要依赖web容器 4、封装请求参数 struts1使用ActionForm对象封装用户请求参数,虽然支持使用动态的ActionForm来简化ActionForm开发,但依然要在配置文件中定义ActionForm;struts2可以直接使用Action的属性来封装用户请求参数,也可以使用Model对象来封装请求参数,Model却只是一个POJO 5、执行控制 struts1一个模块对应一个请求,Action的资源必须是线程安全的,模块中的Action共享相同的生命周期;struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期(Action不是单例的) 6、表达式语言 struts1整合了JSTL,可以使用JSTL表达式语言。struts2可以使用JSTL,还整合了一种更强大和灵活的语言:OGNL(object graph notation languae)
10.3 struts概述与举例 • Struts2框架开发应用的过程 第一步:创建Web工程 第二步:引入Struts的类库,核心的类库有ognl.jar、freemarker.jar、struts2-core.jar、webwork.jar,common-logging,这些类库最终都应该在web-inf/lib下面。 第三步:在web.xml中声明中心控制器。 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 通过这样的配置,所有的请求都会发送给中心控制器。 第四步:在工程中创建struts2的配置文件struts.xml。配置我们编写的每个Action,还 有请求与Action对应关系,执行结果(字符串)与响应界面的对应关系。一般从其他地方拷贝,不要自己写。 第五步:编写Action,配置Action。在开发过程中主要是这一步。
10.3 struts概述与举例 • Struts2编写Action Action类可以是普通的类,可以是实现Action接口的类,可以是继承ActionSupport的类。Action接口是execute方法和几个常量,通常不使用。ActionSupport实现了Action接口,并且封装了对国际化和验证的支持,如果项目需要使用验证和国际化等功能,可以继承该类。 Action类中的方法(控制方法),方法的返回值是字符串,是逻辑名字,表示某个输出界面。方法没有参数。对应每个请求都应该有这样一个方法。 为了获取输入信息,需要定义与输入元素名字相同的成员变量,并提供set方法。为了输出,需要编写成员变量来表示这些输出信息(在控制方法中对成员变量赋值),并提供get方法供框架调用。
10.3 struts概述与举例 • Struts2配置Action 在struts.xml中配置。主要包括两部分:请求与具体的Action的方法的对应关系;Action中的控制方法返回的字符串与具体的响应界面的对应关系。 请求与Action方法的对应关系: <action name="login" class="action.UserAction" method="login"> name指出请求的名字,class指出Action类的名字,method指出方法的名字 <action name="login" class="action.UserAction"> 如果没有指定method方法,默认找Action中的execute方法 也可以在请求中指定方法的名字 login!login.action,“!”之前是请求的名字,“!”之后是方法的名字,这样在配置的时候就可以不指定方法的名字。 执行结果的配置: <result name="success">/success.jsp</result>
10.3 struts概述与举例 • Struts2下的helloworld 使用:JDK 1.5.0_17 + eclipse-jee-europa-winter-win32 + Tomcat 5.5 + struts-2.0.14-ga 下是Struts2 Hello World实例的文件内容。在eclipse中新建一个动态Web工程,命名为hello。
10.3 struts概述与举例 • (HelloWorld.java) package tutorial; // 导入创建一个Struts2 action必须扩展的一个类 import com.opensymphony.xwork2.ActionSupport; /** * 创建一个action HelloWorld * 创建一个Struts2 action必须扩展ActionSupport类 */ publicclass HelloWorld extends ActionSupport { publicstaticfinal String MESSAGE = "Hello World"; // action被请求时执行的方法 public String execute() throws Exception { setMessage(MESSAGE); // 常量“SUCCESS”是在ActionSupport所实现的Action接口中定义的action的返回结果 returnSUCCESS; } private String message; // 设置消息内容 publicvoid setMessage(String message){ this.message = message; } // 取得消息内容 public String getMessage() { return message; } }
10.3 struts概述与举例 • HelloWorld.jsp <%@ taglib prefix="s" uri="/struts-tags" %> <!-- 第一行引用了Struts2的标签库 --> <html> <head> <title>Hello World!</title> </head> <body> <!-- 使用Struts标签获得action的属性值,通过action属性的setters和getters --> <h2><s:property value="message" /></h2> </body> </html>
10.3 struts概述与举例 • Web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="StrutsWeb" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- Struts2的核心Filter:名字和实现类--> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <!-- 配置拦截器所要拦截的URL,/*的意思是拦截所有请求--> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Web应用的默认页面--> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
10.3 struts概述与举例 • struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "struts-2.0.dtd"> <!-- Eclipse提示找不到这个struts-2.0.dtd --> <!--可以从struts2-core-2.xxxx.jar解压出struts-2.0.dtd,和struts.xml放在一起--> <struts> <!-- 包的定义,包名和Action类所在的包没有联系 --> <!-- extends定义了包要扩展的包,包tt继承了包struts-default中的拦截器和Action --> <package name="tt" extends="struts-default"> <!-- HelloWorld Action的定义:名字和实现类--> <action name="HelloWorld" class="tutorial.HelloWorld"> <result>/HelloWorld.jsp</result> </action> </package> </struts>
10.3 struts概述与举例 • 至此,可以启动Tomcat服务器,使用http://localhost:8080/tutorial/HelloWorld.action访问action,页面上会显示“Hello World”。基本的运行过程如下: 1.容器接到“HelloWorld.action”请求。根据web.xml中的配置,所有请求被转发到拦截器FilterDispatcher。FilterDispatcher是Struts2框架的入口。 2.Struts2框架再struts.xml中找到 action映射,从而知道了"HelloWorld" action的定义。框架实例化该action并执行action的excute方法。 3.action的excute方法设置消息内容,并返回SUCCESS。框架从action映射找到返回结果SUCCESS对应的页面文HelloWorld.jsp。框架告诉Tomcat容器,把HelloWorld.jsp作为HelloWorld.action请求的response。 4.HelloWorld.jsp被处理时,Struts2的标签<s:property value="message" />调用action的getMessage方法,标签将消息内容添加到response。 5.浏览器流到一个纯HTML response。