990 likes | 1.41k Views
J2EE 入门培训. 内容提要. J2EE 概述 J2EE 存在的意义 J2EE 的基本概念 J2EE 基础技术标准 JavaBEAN, JDBC, JNDI, RMI J2EE 进阶技术标准 Servlet / JSP JAF JavaMail 进一步说明 J2EE 事务处理分析 JNDI 的扩展使用 参考资料. 严格的说, JavaBEAN 与 JDBC ,是 J2SE 的规范与 标准,在 J2EE 中得到了更好的扩展;. EJB JTA JMS. JAAS WebService 其他技术标准. RMI 与 CORBA.
E N D
内容提要 • J2EE概述 • J2EE存在的意义 • J2EE的基本概念 • J2EE基础技术标准 JavaBEAN, JDBC, JNDI, RMI • J2EE进阶技术标准 • Servlet/ JSP • JAF • JavaMail • 进一步说明 • J2EE事务处理分析 • JNDI的扩展使用 • 参考资料 严格的说,JavaBEAN与JDBC,是J2SE的规范与 标准,在J2EE中得到了更好的扩展; • EJB • JTA • JMS • JAAS • WebService • 其他技术标准 • RMI与CORBA
J2EE概述 • J2EE存在的意义 • J2EE的基本概念
J2EE概述 – J2EE存在的意义 在传统的开发模式(单层应用结构)下,应用普遍存在以下致命缺点: - 数据、页面和业务逻辑在一个逻辑层次中,功能紧密耦合; - 代码重用性极低,可维护性差; - 应用耦合度高,完全没有可扩展性; - 任何一个细小功能的更新,需要对整个应用进行重新部署; - 后台数据结构的改动,将导致所有相关代码的改动; - 数据库连接管理是个很大的瓶颈;
J2EE概述 – J2EE存在的意义 因此,在很长一段时间内,导致企业级应用开发过程一直存在着以下瓶颈: - 应用与功能的分布式; - 功能模块的可移值性与可重用性; - 快速的WEB页面的开发; - 应用逻辑层次的分离,避免耦合; - 功能的安全性与事务性; - 可扩展与可维护性;
J2EE概述 – J2EE存在的意义 所以,企业需要满足以下条件的应用体系结构: - 分布式的、可移植组件的框架与结构; - 简化服务端中间件的设计(包括事务处理,安全性等等); - 为组件、应用、以及服务端提供标准、开放的API;
J2EE概述 – J2EE存在的意义 又因此,J2EE诞生了: - 1996年6月,JavaOne年度峰会上,SUN公司发布了J2EE第1版本; J2EE的2个初衷: - 对于企业用户,J2EE是一套开放标准平台,加入这个平台,企业内所有的 业务系统就可以运行在不同的操作系统,不同的环境下,从而形成一整套 企业应用体系; - 对于开发者,J2EE是一套现成的解决方案,开发过程中的许多瓶颈(如事 务处理,安全性,可移值性等)就会迎刃而解,真正实现逻辑上的层次分 离,实现分布式应用;
J2EE概述 – J2EE的基本概念 J2EE的定义: - 是开放的、基于标准的平台; - 是用于开发、部署与管理N层结构、是面向WEB、以服务器为中心的企业级 应用体系;
J2EE概述 – J2EE的基本概念 J2EE架构图:
J2EE概述 – J2EE的基本概念 一个典型J2EE应用结构图:
J2EE基础技术标准 • JavaBEAN • JDBC • JNDI • RMI 严格的说,JavaBEAN与JDBC,是J2SE的规范与 标准,在J2EE中得到了更好的扩展;
J2EE基础技术标准 – JavaBEAN 先来了解一下JavaBEAN: - JavaBEAN是在编程环境中能够被可视化处理的可重用组件; 这里所指编程环境包括:IDE(如Eclipse)等; 一个JavaBEAN简单来说就是一个Java类,只有遵守了JavaBEAN的技术规范,才能 被称之为JavaBEAN,规范如下: - 该类必须为公共类,并且可序列化,即实现java.io.Serializable接口; - 若有构造函数,必须是无参的,类中不能出现main函数; - 所有属性必须通过set,get方式来操作(如setName,getName,若是布尔型 则使用isName),所有属性都必须是私有的(private),这种方式称为setters 与getters方法对; - 包含必要的事件处理方法;(若不需要事件机制,可忽略)
J2EE基础技术标准– JavaBEAN 结合JavaBEAN规范,可以将JavaBEAN的元素归纳为:属性、方法、事件; JavaBEAN属性有4种类型: - Simple属性:表示具有setter与getter方法对的属性(field); - Indexed属性:表示数据值,同样具有setter与getter,可设置或获取数组中的 某个值,也可以一次设置或获取整个数组; - Bound属性:属性值发生变化时,会触发其他相关的JavaBEAN,至于被触发 的JavaBEAN应做什么动作,由其自己定义; - Constrained属性:属性值将要发生变化时,与该属性建立关系的其他Java对 象可以否决该属性值的改变;
J2EE基础技术标准 – JavaBEAN JavaBEAN事件; 通过事件机制,JavaBEAN既是事件发起者,也是接收者,不同的组件就可以组合在 一起,组件之间通过事件传递进行通信,这样就可构成了最简单的应用; 在事件模型中,包括以下构成部分: - 事件状态对象、事件监听者接口、事件监听者; - 适配类:核心部分,用于选择并指派事件的响应者(JavaBEAN);
J2EE基础技术标准 – JavaBEAN 结合JavaBEAN的元素与规范,可以将JavaBEAN的特征归纳为: - 定制:对属性、方法、事件的设计定制; - 持久性:可以保存与恢复JavaBEAN的属性值,通过可序列化来支持持久性; - 通信:以事件方式与外部进行通信; - 自检:开发工具通过该机制来分析JavaBEAN的结构,确定可支持的元素; 其他: - JavaBEAN完成后,会被打包成jar文件,把所需求资源都打包在同一个文件中; - 在jar的MANIFEST文件中指定所有的JavaBEAN文件; - jar文件在网络传输过程中将会极大减少数据流量;
J2EE基础技术标准 – JavaBEAN 一个简单JavaBEAN例子: public class TestBean { private String name; private boolean man; public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isMan() { return man; } public void setMan(boolean man) { this.man = man } //... ... }
J2EE基础技术标准 – JDBC JDBC的定义: - Java Database Connectivity Standard,是用于执行SQL的Java API,为Java提 供了通用的访问不同关系型数据库(DBMS)的方法与接口,几乎所有的DBMS 厂商都提供了JDBC的服务或驱动;
J2EE基础技术标准 – JDBC 在最新的J2SDK6中,JDBC API目录已有4.0: - 核心API定义在java.sql包中; - 扩展API定义在javax.sql包中; 主要的JDBC对象与接口如下: - java.sql.DriverManager:用于管理JDBC驱动的服务类,当JDBC驱动加载至内存后,DriverManager 会自动注册JDBC驱动,然后通过getConnection方法建立Java应用至 DBMS的连接; - java.sql.Connection:数据库连接对象,通过createStatement创建SQL申明; - java.sql.Statement:SQL语句接口,通过executeQuery或executeUpdate执行一个静态的SQL语句; - java.sql.ResultSet:SQL语句执行结果对象,包含了若干维护表记录的操作方法; - java.sql.SQLException:SQL操作期间的异常处理,所以异常均通过该类抛出;
J2EE基础技术标准 – JDBC JDBC连接生命周期如下:
J2EE基础技术标准 – JDBC JDBC驱动共有4种类型: - 类型 1:将JDBC映射到其他类型的数据访问接口上,最为典型的是JDBC-ODBC Bridge,利用ODBC提供JDBC的访问(如访问MS Access),但必须在 每台客户机上都配置ODBC驱动(所以这种方式不适用于单独的Java 应用),适用于服务端应用程序,只需配置一次ODBC即可;
J2EE基础技术标准 – JDBC - 类型 2:基于本地API与厂商的驱动程序实现,不同DBMS厂商提供了不同的驱 动实现(遵照JDBC标准实现),JDBC驱动会将本地API的操作转换成 具体厂商的JDBC操作; 如,Oracle提供的JDBC JAR为:classes12.jar
J2EE基础技术标准 – JDBC - 类型 3:完全由Java实现,将JDBC转换为与DBMS无关的网络协议,然后该协 议被中间件服务器转换为不同的DBMS协议(由中间件服务提供与数 据库之间的操作映射); 比如,银行项目中常用的SOP协议,由中间件服务提供SOP协议规范 ,然后再将该协议转换成不同的DBMS通讯协议;
J2EE基础技术标准 – JDBC - 类型 4:与第3种类型相似,唯一不同的是,在本地实现与不同DBMS通讯的协 议,因此缺点显然易见,需要在本地API中实现不同的DBMS协义,所 以,使用场合较少;
J2EE基础技术标准 – JDBC JDBC连接池: - 简单来说,是管理JDBC连接生命周期的容器,确保连接使用的安全性; - 一般通过org.apache.commons.dbcp包实现; - 可以为同一个或不同DB创建多个连接池;
J2EE基础技术标准 – JDBC JDBC的事务支持 - 所有的JDBC驱动都支持事务; - 事务操作:提交,回滚; JDBC、JAVA、SQL三者之间对于相同数据类型具有不同定义,下表罗列了一些:
J2EE基础技术标准 – JNDI JNDI的定义: - Java Naming and Directory Interface(Java命名目录服务接口),是命名目录 服务的抽象接口集合,为企业级应用提供了统一的标准化连接,使Java能够无 缝的获取任何可目录化的企业信息; - 是数据的最基本服务之一,常见的目录服务有LDAP Server、RMI等; - 通过names与objects的绑定,形成唯一的描述字符串,以此获得目录条目,类 似于DNS通过主机名来获得IP; - JNDI包含API与SPI(服务提供接口),JNDI SPI用于命名目录服务的设计与实 现,使各类数据服务标准化;因此Java能够通过JNDI API快速方便的访问任何 目录服务;
J2EE基础技术标准 – JNDI Java应用与JNID API、JNDI SPI,以及各类目录服务的关系结构图如下:
J2EE基础技术标准 – JNDI JNDI由3个包组成: - javax.naming:定义了命名服务的类型,以及所有存取标准接口; - javax.naming.directory:是javax.naming的扩展,提供了所有对于目录服务的 访问标准操作与接口; - javax.naming.spi:定义了命名目录的服务接口,遵循这些标准接口,开发者 能够为不同数据服务编写出统一的命名目录服务; 目录较为成熟的JNDI实现包厂商有:SUN、IBM、Netscpe; 关于JNDI开发的详细说明,可以参考“JNDI_TRAINING.ppt”;
J2EE基础技术标准 – RMI 首先来说明一下“分布式”这个概念: - 大多数传统方式的Java应用,所有的对象、程序都在同一台服务器上,并且在 同一个JVM或进程中; - 而在“分布式”计算中,对象和程序可以在同一台服务器上的不同进程中,也可 存在于不同的机器上;
J2EE基础技术标准 – RMI 分布式的结构与优势: - 客户端层:UI与后台的业务处理完全分开,使客户端运行更“瘦”,更高效; - 业务逻辑层:又称“对象有服务层”,负责处理各类逻辑对象,如线程,连接 池,具体的业务对象等; - 数据及服务层:只负责具体的数据及服务运算; - 分布式计算能够充分利用多个系统组合的计算能力,能够解决在单机环境中无 法实现的计算功能;
J2EE基础技术标准 – RMI 为什么“分布式”能够在Java平台上得到很好的实现,最主要的3点如下; - 跨平台性:Java为所有的系统平台都实现了统一的基本类型; - 可序列化:Java对象支持可序列化,符合远程调用的要求; - 性能优势:综上2点,使得Java的远程交互极为简单高效; 所以,便产生了RMI(Java Remote Method Invocation),
J2EE基础技术标准 – RMI RMI的定义: - 基于TCP/IP套接字方式的分布式调用,是Java开发分布式应用的基础; 其实RMI本身并没有添加任何新的概念和技术,其核心还是“接口(Interface)”, 简单来说,就是把“接口”与“实现(对象)”从本地移到了远端的服务器上而已,实 现了“接口”与“实现”的分布式调用;
J2EE基础技术标准 – RMI 举个简单的例子说明: - 假设,我们在服务端定义了一个Interface,并且为该Interface编写了实现(对 象),然后在客户端编写了调用该Interface的Class,这样就构成了一个简单的 “客户/服务模型”,所以对于客户端而言,重要的不是Interface的实现,而是 Interface;
J2EE基础技术标准 – RMI 从上页的图中,我们可以了解到RMI的部署与运行过程: - 首先定义RMI服务端能够提供的服务,也就是Interface; - 这些Interface需要生成调用入口,让客户端知道有哪些服务可以调用; - 然后,在服务端编写Interface的实现类; - 注意,还需要编写RMI注册机制,以便在RMI服务启时,能够正确加载服务; - 启动初始化RMI服务,注册机制会自动加载所以接口(服务); - 最后,客户端就可以方便的进行服务的调用; 当然,由于是依靠网络运行,所以也需要必要的安全校验机制,这里就不进行描述 了,可以根据实际的运行环境定制,比如,在客户端/服务端交互时,加入必要的 身份验证部分,或进行IP地址限制等;
J2EE基础技术标准 – RMI 现在再来了解一下RMI的开发过程: 1- 定义服务接口,扩展java.rmi.Remote接口; public interface RMISample extends Remote 2- 编写接口的实现类,除了实现Interface外,必须扩展UnicastRemoteObject, 说明该服务不可复制,并且只在服务运行时有效; public class RMISampleImpl extends , implements RMISample 3- 创建RMISampleImpl的stub,通过J2SDK的命令,rmicRMISampleImpl; stub就是刚才所提到的服务调用入口,名称为RMISampleImpl_Stub; 在JDK1.2以前,还需要生成skeleton,负责服务的定位,及参数的解析交互;
J2EE基础技术标准 – RMI 4- 编写RMI注册机制,若名称为RMISampleServ以下是在main函数中的代码: //创建与安装安全管理程序 System.setSecurityManager(new RMISecurityManager()); //实例化远程对象 RMISampleImpl o=new RMISampleImpl(); //远程对象注册到RMI注册表 Naming.rebind("rmi://localhost/rmiSample",o); 5- 编写客户端,若名称为RMISampleClient; RMISample server=(RMISample)Naming.lookup("rmi://localhost/rmiSample"); server.方法(); 或者也可以直接实例化RMISampleImpl_stub进行服务连接与调用; 6- RMI注册:rmiregistry port RMI服务启动:java RMISampleServ RMI客户端运行:java RMISampleClient
J2EE基础技术标准 – RMI RMI典型的运行结构图如下:
J2EE进阶技术标准 • EJB • JTA • JMS • JAAS • WebService • 其他技术标准 • Servlet / JSP • JAF • JavaMail
J2EE进阶技术标准 – Servlet / JSP Servlet的定义: - 是部署在Java的Web服务器上的组件,整个Java服务端程序都构建在Servlet 之上,以多线程方式提供服务,具有效率高,可扩展,可移植的特点; JSP的定义: - Java Server Page,所有JSP页面在执行时都会被编译成Servlet,由JSP页面 生成的Serlvet叫作“JSP页面实现类”,甚至可以把JSP认为是嵌入了Java语 句的HTML页面文件; Servlet / JSP的关系: - 在页面展现上,Servlet通过输出HTML语句来实现动态页面,如果SUN不推 出JSP标准,那么Java的Web页面开发(动态页面的交互过程)将会十分痛苦;
J2EE进阶技术标准 – Servlet / JSP Servlet / JSP 的生命周期: JSP页面第一次运行时,可能较慢,原因就在于需要进行装载和编译,以后将不 不会再重新编译,即使是应用重启;
J2EE进阶技术标准 – Servlet / JSP Servlet请求处理过程涉及到3个概念:HTTP请求对象,HTTP响应对象,HTTP会话; 关系图如下:
J2EE进阶技术标准 – Servlet / JSP Servlet请求处理过程: 当请求并发时,Servlet以多线程方式提供服务:
J2EE进阶技术标准 – JAF JAF的定义: - JavaBEAN Activation Framework,提供了统一处理不同的数据格式的方法( 如,文字,图片,声音,视频等等); 经常会使用JAF的场景:Web应用,JavaMail; - 数据与编码是最普遍也是最头痛的问题,在以上2个场景中,数据的自动处理显 得尤为重要,否则Web页面或邮件内容将会是乱码; 这里要引入一个概念:“自动发现机制”,JAF就是基于此概念开发的; “自动发现”是指:能够动态找到正确的组件(JavaBEAN)来处理相应的请求;
J2EE进阶技术标准 – JAF JAF“自动发现”机制的实现: - JAF能够不同数据类型,找到相应的组件(JavaBEAN)来处理任意类型的数据; - JAF中存在“注册”机制,简单来说,就是把每一种文件类型与相应的处理组件 进行映射,这样JAF就实现了所谓的“自动发现”机制;
J2EE进阶技术标准 – JAF JAF的组成: 1)- java.activation.DataHandler,是JAF的核心部分,共有3个构造函数: Public DataHandler(Object obj, String mimeType) Public DataHandler(DataSource ds) Public DataHandler(URL u) 使用第1个构造函数时,会根据mimeType动态发现相应的数据处理组件; 使用第2,3个构造函数时,则会使用当前的数据类型处理组件; 2)- java.activation.DataContentHandler:此接口用于实现数据流的处理,负责 Java对象流与数据流的互转,唯一的限制是,对象类型与数据流的转换关系 是一对一的; 3)- java.activation.DataSource:包含了数据处理的所有逻辑,与DataContentHandler 不同的是,DataSource只处理数据流(InputStream),具有很大的通用性, JAF定义了2个标准的DataSource对象,FileDataSource与URLDataSource
J2EE进阶技术标准 – JAF 在JAF的JAR包中,包含mimetype.default文件,定义了所有适用的数据类型; JAF的处理逻辑如下:
J2EE进阶技术标准 – JavaMail JavaMail的定义: - 是一个电子邮件操作的标准Java API,用于建立标准的邮件客户端,包括了各 种标准的Internet协议(如SMTP,POP,IMAP,MIME等); - 与JAF有着紧密的联系,JavaMail运行依赖于JAF,比如,JavaMail依赖于JAF 处理MIME编码的附件等; JavaMail包含4个主要的部分: 1)- 会话管理: java.mail.session:用于定义并建立与远程邮件服务器的邮件通讯会话; javax.mail.Authenticator:用于处理在建立Session时的相关身份验证;
J2EE进阶技术标准 – JavaMail 2)- 消息管理: 邮件消息有“头”与“内容”2部分组成; 邮件头中包括了MessageID,From,To,Subject等内容; javax.mail.Message:用于封装一条抽象邮件消息类,其中包括了一个实现 类MimeMessage; javax.mail.Part:是实现Message的元子组件,相互之间可嵌套,因此最终 可以一个递归结构; 3)- 存储与检索,以文件夹的形式进行邮件的存储与检查,主要的组件如下: javax.mail.Store:为文件夹形式的提供的操作方法; javax.mail.Folder:为Message的提供了管理所必须的方法,包括检索,复 制,移动,删除等等;
J2EE进阶技术标准 – JavaMail 4)- 传递(发送): javax.mail.Transport:提供邮件发送功能; JavaMail的逻辑结构图:
J2EE进阶技术标准 – EJB EJB(Enterprise JavaBean)是J2EE核心组件,其定义如下: - 是Java服务端软件框架规范,提供了让客户端使用远程分布式对象的框架,简 化了大型企业级应用的开发; EJB规范的定义: - 规定了EJB组件与EJB容器进行交互的方式; EJB容器的定义: - 是管理EJB实例的抽象组件,遵循EJB规范来调用业务逻辑所需要的EJB实例; EJB服务: - 管理EJB容器的应用程序,并提供对其他系统服务的访问,如JDBC,JNDI等,