J2EE架构设计1.1


J2EE应用架构与设计 程秀野 Eric --hideno@163.com 架构师  可视化系统的行为  创建系统的蓝图  定义一系列的系统元素以及他们如何协作  定义功能性需求与非功能性需求  负责整合非功能性需求 软件架构师必备的技能  软件建模、分析与设计能力  掌握设计模式并熟练应用与各个场合与场景  常用的架构模式、分层设计,掌握流行的开源框架, 并有扩张这些架构的能力。 架构原则 J2EE 架构 J2EE关注 软件开发方法  Method组成  ModelingConcept建模概念  Notation表示法  DevelopmentProcess开发过程  Rule经验法则 什么是UML  统一建模语言  UML是什么  图形、符号、标记  独立于编程语言  UML不是什么  不是一种建模方法,而是一种表示法  错误观点  UML会帮助我们对系统进行分析和建模  UML是一门开发语言 UML中的视图  静态图  用例图  类图  对象图  组件图  部署图  包图  动态图  状态图  时序图  协作图  活动图 分析类  分析类:一组备选的、能够执行用例中所说明的行为 的模型元素。  类建模:不是一个确定的过程,类设计的重要因素  类建模的知识  对应用领域的理解  相似的和成功经验  由用例图分析出类,分析阶段的类图可能比较简单, 以说明问题为主  实体类  边界类  控制类  早期可以没有边界类与控制类 边界类 边界类帮助系统接口与系统外部进行交 互 边界类种类:  用户界面类:帮助与系统用户进行通信的类。  关注展示给用户的信息  系统接口类:帮助与其他系统进行通信的类 。  设备接口类:为用来监测外部事件的设备(如传感器) 提供接口的类 边界类位置 实体类  实体类是用于对必须存储的信息和相关行为建模的 类。实体对象(实体类的实例)用于保存和更新一些 现象的有关信息。  从词汇表(在需求阶段制定)和业务领域模型(如果 进行了业务建模,则在业务建模阶段中建立)中找寻 到实体类的。 控制类  控制类用于对一个或几个用例所特有的控制行为进 行建模。控制对象(控制类的实例)通常控制其他 对象,它们的行为具有协调性质。控制类将用例的 特有行为进行封装。  控制类并不能处理用例需要执行的一切事务。相反, 它协调其他用来实施此功能的对象的活动。控制类 将工作委派给已被指定负责此项功能的对象。  控制类有效地将边界对象与实体对象分开,让系统 更能适应其边界内发生的变更  控制类还将用例所特有的行为与实体对象分开,使 实体对象在用例和系统中具有更高的复用性。  较复杂的用例一般都有一个或者多个控制类。  对于主要是为了输入、检索、显示或修改信息的简 单事件流来说,通常不必单独使用一个控制类,将 由边界类负责协调用例  可以先在用例里确定一个控制类。  控制类最多只与一个Actor交互(通过边界类) 类与类之间的关系  关联  一般关联  聚合  组合  依赖  泛化  实现 数量关系与方向性  一对多  一对一  多对多  关联属性  单向  双向 需要多少类  许多而简单的类  封装了整个系统的较小部分  更可能重用  更容易实施  较少而负责的类  封装整个系统的较大部分  不太可能被重用  更难以实施  一个类应当有一个简单的良好聚焦目的。  一个类应当做一件事情并把它做好 分配原则  边界类  包含一个参与者的通信的行为  实体类  包含在抽象中被封装数据的行为  控制类  特定于一个用例或一个非常重要的事件流部分的行为  谁有需要用来执行某个职责的数据  如果一个类有这个数据,就将职责与这个类放一起  如果多个类有这个数据  将职责与一个类放在一起,并对其他类增加一个关系  创建一个新类,将职责与新类放在一起,并对需要执行职责的 类增加关系  将职责放在控制类中,并对需要执行职责的类增加关系 SERVLET技术  服务器端小程序:用于处理动态的http响应。用java 代码来处理动态的内容,但静态的HTML代码要嵌 入到java的类中。  生命周期方法 init方法,负责初始化Servlet对象 service方法,负责响应客户的请求 destory方法,当Servlet退出生命周期时,负责释放 占用的资源。 HTTPSERVLET  WEB应用中更多使用HttpServlet,根据客户发出的 HTTP请求,生成相应的HTTP响应结果。  通过HttpServletRequest来封装HTTP的请求。  通过HttpServletResponse来封装HTTP的响应  HttpServlet中使用doGet和doPost来处理get请求和 post请求  单个实例来处理所有的请求,所以成员变量是共享的。  增加一个请求就会增加一个线程。 SERVLET的配置  Servlet需要通过web.xml来配置   通过url-pattern来配置Servlet的请求路径 会话跟踪  HttpSession  ServletContext JSP页面构成  JSP脚本<%%>  JSP指令<%@page%>  JSP声明<%!%>  JSP表达式<%=%>  JSP动作 JSP指令  <%@page import=“java.util.*”%>  <%@include file=“banner.html”%> 静态包 含  <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%> JSP动作  动态包含  页面转向  JSP注释 <%-- this is a comment ... --%> or <% /** this is a comment ... **/ %> or JAVABEAN  封装商业逻辑,数据表示。减少JSP页面中的java代 码。  页面中使用JavaBean  DIFFERENT SCOPE  application  session  request  page 代码 <% numberguess.NumberGuessBean numguess = (numberguess.NumberGuessBean) session.getAttribute(“numguess”); if(numberguess == null){ numguess = new numberguess.NumberGuessBean(); session.setAttribute(“numguess”, numguess ); } %> 设置JAVABEAN的属性  ”/> 得到JAVABEAN的属性  <%=numguess.getHint()%> 异常处理  <%@ page errorPage=“errorpage.jsp”%> <%@page isErrorPage=“true”%> <%=exception.toString()%> 404 /notFound.html ExceptionType /error.jsp 隐式对象 CONFIG testconfig /config.jsp count 1000 testconfig /config_count PAGECONTEXT forward() getException() getRequest() getResponse() getServletConfig() getServletContext() getSession() findAttribute() setAttribute() getAttribute() removeAttribute() 中文处理  <%@page pageEncoding=“GBK”%>  <%@page contentType=“text/html;charset=GBK”%>  ServletResponse.setCharacterEncoding(“GBK”);  ServletResponse.setContentType(“text/html; charset=GBK”);  ServletRequest.setCharacterEncoding(“GBK”);  new String(s.getBytes(“ISO-8859-1”),”GBK”) CUSTOMER TAG  tld  class  how to use TAG CLASS HOW TO WRITE  JSP 1.2 tag handler class  Implements javax.servlet.jsp.tagext.Tag, javax.servlet.jsp.tagext.IterationTag or javax.servlet.jsp.tagext.BodyTag  Usually extends javax.servlet.jsp.tagext.TagSupport or javax.servlet.jsp.tagext.BodyTagSupport  JSP 2.0 simple tag handler class  Implements javax.servlet.jsp.tagext.SimpleTag  Usually extends javax.servlet.jsp.tagext.SimpleTagSupport EL(EXPRESSION LANGUAGE)  处理<%=%>的操作  用.访问对象的属性 EL中的隐式对象  pageContext—the pageContext object  pageScope—a Map that maps page-scoped attribute names to their values  requestScope—a Map that maps request-scoped attribute names to their values  sessionScope—a Map that maps session-scoped attribute names to their values  applicationScope—a Map that maps application-scoped attribute names to their values  param—obtained by calling ServletRequest.getParameter(String name)  paramValues—obtained by calling ServletRequest.getParameterValues(Stringname)  header—obtained by calling ServletRequest.getHeader(String name)  headerValues—obtained by calling ServletRequest.getHeaders(String name)  cookie—a Map that maps cookie names to a single Cookie object  initParam--obtained by calling ServletContext.getInitParameter(String name) JSTL  Core (prefix: c)  Internationalization (I18N) (prefix: fmt)  XML (prefix: x)  Database (prefix: sql)  Functions (prefix: fn)  <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>  <%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt> CORE  value to be set  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
     
${book.id}${book.name}${book.price}
COLLECTION TYPES  java.util.Collection  java.util.Map Value of var attribute should be of type java.util.Map.Entry 国际化 <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> XML Tags name
gender
birthday
name
gender
birthday
FILTER、LISTENER  过滤器  监听器 表示层设计的不佳实践  视图中包含了控制代码  胖控制器  将表现层数据结构(HttpServletRequest)暴露给业务 层或业务对象  敏感资源暴露给客户端直接访问 表现层重构  控制器  隔离不同的逻辑,高聚合(验证、动作、助手)  表现层对象与业务对象解耦 WEB应用常用架构  JSP中有关于界面的代码、数据的代码、逻辑的代码、并且互 相交错  不利于阅读和维护 改进  把数据访问的代码与JSP页面分离,封装在JavaBean中。  符合面向对象的分析和设计。可以通过O-R mapping技术来映 射  JSP页面中可以通过来得到数据 再改进  将逻辑控制代码与JSP分离,由一个单独的控制器来实现中心 控制。  用servlet来作为中心控制器  使JSP只负责客户端页面的显示 什么是MVC?  M--model模型层(一般为数据表示)由JavaBean来实现  V--view视图层(用户界面)由JSP来实现  C--Controller控制层(控制逻辑处理)由Servlet来实现 如何实现MVC?  如何区分静态请求(下载、图片等)和动态请求(需要处理)  如何根据不同的请求来做不同的操作。  逻辑处理完以后如何显示用户需要的页面  页面中如何得到模型层中的数据 综合实例 Buys Books Customer Places Order Browsers Books Adds to Cart Removes from Cart Checks Cart 综合实例 控制层分层设计  接受请求  封装数据  验证考虑  数据获取  数据访问 常用设计模式 • 烧菜(宫保鸡丁) – 不断实践、思考、总结,最后得到最佳的烹饪方法。当 后人需要烧这道菜,用同样的烹饪方法。 • 类似的例子:捕鱼、打井等等都有方法 • 程序设计中也有方法--设计模式 – 并非与生俱来 – 不是一种发明 – 利用前人的经验,使解决问题不需要从头解决 – 重用性和可维护性提高 • 设计模式的好处 – 独立于语言,任何面向对象的语言都能使用模式 – 为软件架构提供指导 设计模式的分类  通用责任分配软件系列模式(GRASP)  着重考虑类的设计原则和如何分配类的功能  面向对象的设计模式GoF(23种)  着重考虑设计的实现、类的交互及软件质量  根据目的分类  Creational(创建型):与对象的创建有关  Structural(结构型):处理类或对象的组合  Behavioral(行为型):描述类或对象如何进行交互和如何分 配职责  模式以用意为划分 简单工厂  工厂生产产品  一个工厂生产所有的产品 特点 • 优点 – 对Client来说封装了产品创建的过程 – 不论创建哪种对象,只需要通过工厂类的createCar()方 法就可以 – 明确了各自的职责和权力,有利于整体软件体系结构的 优化 • 常用领域 • Dao数据访问对象 • 缺点 – 工厂类是一个具体的工厂,所有的创建对象都必须放在 这个工厂类中。 – 创建方法中含有很多if-else-的判断。 – 当产品不断增多或淘汰时,每次都需要来修改这个工厂 类。扩展性和可维护性都比较差 • 如何改进 工厂方法  一个具体的工厂生产一个具体的产品 特点  优点  可扩展性强  可维护性强  缺点  当产品和工厂都比较简单时,感觉杀鸡用牛刀。 单例 • 三个要点,考虑如何来实现他们 – 某一个类只能有一个实例,不能让客户随意创建实例对 象 – 必须自行创建这个实例 – 必须向整个系统提供这个实例 • 饿汉式实现 – 缺点 – 如何改进 • 饱汉式实现 • 应用 – 自动增长生成唯一键 – 简单工厂中的工厂类一般是单例的 门面  提供一个统一的接口去访问多个子系统的多个不同的 接口,从而控制访问的粒度 特点  优点  提供一个简单公用的接口来处理复杂的子系统,掩盖了 子系统的复杂性,使细粒度的访问变成粗粒度的访问  缺点  限制了客户的自由度,减少了可变性 代理  当客户有一个请求时,Proxy实例化真实的对象,并将请 求传递给真实的对象。Proxy可以用于实现前置操作或后 置操作。 特点  AOP应用 策略  有一组算法,将每一个算法封装到具有共同接口的独立的类中, 从而使他们可以相互替换,让算法在不影响到客户端的情况下 发生变化。  环境Context:持有一个Strategy类的引用  抽象策略Strategy:具体接口类所需的接口  具体策略ConcreteStrategy:包装了相关的算法或行为 特点  使用何种策略需要客户知道 观察者  定义了一种一对多地依赖关系,让多个观察者对象同 时监听某一个主题对象。主题对象在状态上发生变化 时,会通知所有观察者对象,使他们能够自动更新自 己。 观察者  定义了一种一对多地依赖关系,让多个观察者对象同 时监听某一个主题对象。主题对象在状态上发生变化 时,会通知所有观察者对象,使他们能够自动更新自 己。 模板方法  准备一个抽象类,将部分逻辑以具体方法以及构造函 数的形式实现,声明一些抽象方法来迫使子类实现剩 余的逻辑。不同的子类可以以不同的方式实现这些抽 象方法,从而对剩余的逻辑有不同的实现  是所有模式中最常见的模式之一  模板方法模式的结构和用法是面向对象设计的核心 模板方法  准备一个抽象类,将部分逻辑以具体方法以及构造函 数的形式实现,声明一些抽象方法来迫使子类实现剩 余的逻辑。不同的子类可以以不同的方式实现这些抽 象方法,从而对剩余的逻辑有不同的实现  是所有模式中最常见的模式之一  模板方法模式的结构和用法是面向对象设计的核心 设计模式综合应用  银行账户管理系统  账户分为两种:FixedAccount、CurrencyAccount  模板方法  对帐户的操作需要记录到日志中,日志有两种:记录到 文件、记录到数据库  策略  Logger负责记录  单态  帐户的余额变化需要即时通知客户  观察者  可以根据用户的需求创建两种帐户  工厂方法  存款取款前需要验证  代理  提供出纳统一的接口来实现操作  门面 业务层设计的不佳实践  在表现层保存会话状态,只局限于Web用户  每一个用例映射成一个SessionBean  客户端包括服务寻址代码  通过getter/setter方法暴露EJB的所有属性  Ejb Finder方法返回大型结果集  客户端负责聚合来自业务组件的数据  把EJB用于长时间持续的事务 业务层重构  业务代表  业务逻辑移植SessionBean  组合EntityBean  分离数据访问代码  使用连接池 第一个EJB的例子  Remote接口,定义业务方法  Home接口,创建和发现RemoteObject  EJB类,实现类  ejb-jar.xml,部署描述文件  打包jar文件  部署jar  客户端测试 REMOTE INTERFACE package session.ejb; import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Hello extends EJBObject{ public String greeting(String user) throws RemoteException; } HOME INTERFACE import javax.ejb.EJBHome; import java.rmi.RemoteException; import javax.ejb.CreateException; public interface HelloHome extends EJBHome{ public Hello create() throws RemoteException, CreateException; } BEAN CLASS import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.ejb.CreateException; public class HelloBean implements SessionBean{ public HelloBean(){} public void ejbCreate() throws CreateException{} public void setSessionContext(SessionContext sctx){} public void ejbActivate(){} public void ejbPassivate(){} public void ejbRemove(){} public String greeting(String user){ return "Hello, " + user; } } 部署描述文件 HelloEJB session.ejb.HelloHome session.ejb.Hello session.ejb.HelloLocalHome session.ejb.HelloLocal session.ejb.HelloBean Stateless Bean CLIENT import javax.naming.*; import javax.ejb.*; import session.ejb.*; import java.util.Properties; import javax.rmi.PortableRemoteObject; public class HelloClient{ public static void main(String[] args) throws Exception{ //设置JNDI的环境 Properties jndiEnv = new Properties(); jndiEnv.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); jndiEnv.setProperty(Context.PROVIDER_URL, "t3://localhost:7001"); Context ctx = new InitialContext(jndiEnv); //找到Home interface Object obj = ctx.lookup("ejb/Hello"); HelloHome home = (HelloHome)PortableRemoteObject .narrow(obj, HelloHome.class); //调用Home interface的create方法获得component interface引用 Hello h = home.create(); //调用component interface中的商业方法 System.out.println(h.greeting("George")); //(可选)调用component interface中的remove方法 h.remove(); EJB中的STUB和SKELETON 实例池 无状态SESSIONBEAN生命周期 有状态SESSIONBEAN生命周期 实体BEAN 实体BEAN中的实例池 BMP的生命周期 CMP的生命周期 消息驱动 消息服务客户视图 两种消息处理使用的接口 MDB的生命周期 一对一关系 一对多关系 一对多 一对多 一对多 多对多 多对多 事务  ACID  例如 try{ //从账号1中取款 }catch(Exception e){ //如果出现错误停止操作 return; } try{ //存款到账号2 }catch(Exception e){ //如果出错,停止操作 //并将钱存回到账号1中 return; } 编程型事务  编程型事务 声明型事务 客户端开始的事务 比较 事务的属性 一个事务中多个BEAN操作 不同BEAN的许可类型 PROBLEM SESSION FAÇADE SOLUTION SESSION FAÇADE SOLUTION J2EE PATTERN J2EE PATTERN
还剩115页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

nnpci36

贡献于2014-03-04

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf