




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EJB编程
内容EJB—J2EE的基石EJB的容器和服务器EJB的分类会话bean实体bean消息驱动BeanEJB的三个关键构件EJB的实现与部署回顾EJB—J2EE的基石EnterpriseJavaBeans(EJB)是:
Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。
EJB容器是:一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。
EJB服务器是:管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJB服务器必须提供对可访问JNDI的名字服务和事务服务支持。
注意:EnterpriseBean与JavaBean是两个完全不同的概念。JavaBean是一台机器上同一个地址空间中运行的组件,因此JavaBean是进程内组件。JavaBean是使用java.beans包开发的,它是Java2标准版的一部分。EnterpriseBean是在多台机器上跨几个地址空间运行的组件,因此EnterpriseBean是进程间组件。EnterpriseBean是使用javax.ejb包开发的,它是标准JDK的扩展,是Java2EnterpriseEdition的一部分。JavaBean通常用作GUI对话框小部件,而EnterpriseBean则用作分布式商业对象。EJB服务器和容器EJB容器的责任EJB的分类EntityBeanContainer-ManagedPersistenceEntityBeanBean-ManagedPersistenceEntityBeanSessionBeanStatefulSessionBeanStatelessSessionBean消息驱动Bean实体bean(EntityBean)业务数据模型对业务概念的反映,也称为领域类(domainclass)在持久存储中业务实体的对象视图提供访问和操作数据的对象封装支持多用户共享的数据可以从数据库中存储的属性重新实例化EJB服务器崩溃后仍可重构与数据库中的数据有一样长的生命实体bean的持久性Bean-ManagedPersistence(自管理的持久性)优点:开发者有完全的控制无需复杂的提供商支持缺点:编码复杂在改变时需要重新编码和部署影响可移植性Container-ManagedPersistence(容器管理的持久性)优点:提供商解决,可能会有更好的缓冲和性能在部署描述符中进行改变即可可移植性好缺点:对容器提供商的工具依赖性强可能不易反映复杂的数据关系会话bean(SessionBean)会话bean经常用于涉及多个实体bean的业务处理和控制逻辑。SessionEntityEntityEntity会话bean(SessionBean)(2)相对生命较短(一般与客户同步)在EJB服务器崩溃时被删除不表示数据库中的数据,但可以访问数据作为一个客户的代表执行功能可以加入事务何时使用会话Bean使用会话bean对针对于某一客户的处理或控制对象建模对工作流、任务和管理活动等建模(如订房、购物车等)协调多个实体bean,控制实体bean之间的交互将业务应用逻辑从客户端转移到服务器端会话Bean?实体Bean?会话bean表示一个业务过程每一客户一个实例Short-lived:与客户生命同步暂态的服务器崩溃后丢失可以是事务性的实体bean表示业务数据在多个客户间共享实例Long-lived:与数据库中数据同步持久的服务器崩溃后可重构总是事务性的两种类型的会话bean无状态(Stateless)bean表达一个无状态的服务(如列表,mail)不存储用户相关信息,进行对请求的响应暂态的可用来构造响应频繁而简单的访问的bean池有状态(Stateful)bean维护客户状态一个EJB的三个关键构件作为Bean的开发者,主要关注于三个构件:EJBHome接口(扩展javax.ejb.EJBHome接口):使用了factory设计模式,定义了创建、查找EJB的方法。EJBObject接口(扩展javax.ejb.EJBObject接口):使用了proxy设计模式,定义了在bean中实现的业务逻辑方法。Bean实现类(实现javax.ejb.EntityBean/SessionBean):实现业务逻辑。EJB的实现(举例)—创建远程接口//businessmethodspublicinterfaceAccountextendsEJBObject{ //returntheaccountinformationcorrespondingtothisaccount. publicAccountModelgetDetails()throwsRemoteException; //updatesthecontactinformationforthespecifiedaccount publicvoidchangeContactInformation(ContactInformationinfo) throwsRemoteException;}EJB的实现—创建Home接口publicinterfaceAccountHomeextendsjavax.ejb.EJBHome{ publicAccountcreate(StringuserId, Stringstatus,ContactInformationinfo) throwsRemoteException,DuplicateKeyException,CreateException; publicAccountfindByPrimaryKey(StringuserId) throwsRemoteException,FinderException;}EJB的实现—AccountBean的实现publicclassAccountEJBimplementsEntityBean{//entitystateprivateStringuserId;privateStringstatus;privateContactInformationinfo;//resourcesprivateEntityContextcontext;//implementaccountinterfacebusinessmethodspublicvoidchangeContactInformation(ContactInformationinfo){=info;}publicAccountModelgetDetails(){return(newAccountModel(userId,status,info));}EJB的实现—AccountBean的实现(2)//mustmatchsignaturesofcreatemethodsinHomeinterfacepublicStringejbCreate(StringuserId,Stringstatus,ContactInformationinfo) throwsDuplicateKeyException,CreateException{
//settheinstancedata
this.userId=userId; this.status=status; =info; AccountDAOADAO=newAccountDAO(userId,status,info); try{ ADAO.create();//insertdataindatabase return(userId);//returnprimarykey }catch(java.sql.SQLExceptionse){ thrownewCreateException("SQLExceptionincreate:"+se); }}EJB的实现—AccountBean的实现(3)从客户端看的EJB视图clientGluecontainerserverEJBObjectBeanEJBHomeCreate,findBusinessMethod从更深层次理解EJB视图JDKjavax.ejbBeanProviderxxxContainerProviderEJB的其它方法与生命周期EJB的事务处理EJB服务器的概念使平台提供商可以在可伸缩的、可靠的、分布的事务服务方面提供增值服务。事务提供一个“all-all-nothing”的简单模型来管理工作,即所有对象成功更新,所有工作成功提交,或者一个对象失败而整个工作回滚。bean的客户可以以两种方式驱动事务:在“部署描述符”中声明“公布的事务”(declarativetransactions)使用用户事务API(JTA)来驱动事务EJB构件的实现步骤创建远程接口创建Home接口创建Bean的实现类编译远程接口、Home接口、bean实现类创建部署描述符将以上三个文件与部署描述符文件打包为一个ejb-jar文件部署EJB构件回顾J2EE架构J2EE应用的形式几点体会1.清晰、统一的概念2.标准的接口,屏蔽底层的实现(JDBC,EJB…Java)3.实现方式的多样化——trade-off与充分的选择权CMP,BMPJTA,4.标准vs.扩展(语义的可理解性与可表达性)消息驱动Bean消息驱动Bean被设计用于使用异步的JMS(JavaMessageService)消息,当JMS消息到来时,容器调用消息驱动Bean进行处理。EJB2.0规范中明确指出:使用消息驱动Bean模型的目的是降低开发一个在功能上与JMS客户机相似的企业级Bean的难度每个Bean实例都可以单独向消息驱动Bean发送消息。这就意味着,消息驱动Bean可以并发地接收多个消息,这样就能达到比传统JMS应用程序高得多吞吐量和好得多的可伸缩性。在部署了一个消息驱动驱动Bean后,它就被指派在一个虚拟通道上监听特定主题(Topic)或队列(Queue)中的消息。JMS客户机发送的任何消息(该消息必须符合JMS规范)都将由消息路由器转发给某个虚拟通道上的消息驱动Bean。当消息驱动Bean接收到这条消息时,EJB容器将会从某个实例池中选择该Bean类的一个实例来处理该消息。当bean实例调用其onMessage()方法时,它将会接收到这条消息,并能够以任何它认为合适的方式来处理这条消息。一旦这条消息被使用,则只要事务没有异常中止,这条消息都不会被传送给这个消息驱动bean的任何其他实例。消息驱动Bean也是一种完备的企业级Bean,但它不是RPC组件,因此没有商业接口或home接口,也没有供EJB客户机调用的业务方法。此外消息驱动Bean在很大程度上类似于无状态会话Bean,这两种Bean在两次请求之间都不保持任何状态;但它们都可以有实例变量,这些变量在Bean实例的整个生存期内均保持。
J2EE概述
内
容一、J2EE的由来
√二、J2EE概念三、J2EE编程思想四、J2EE技术框架五、优势*一般知识*一、计算机应用程序的一般特点:
大多数应用,从PC机上的简单报表程序到大型机上的复杂计算,都由三部分组成:用户界面部分:表示层应用逻辑部分:业务逻辑层数据访问部分:数据访问层二、应用程序开发模型的变迁过程:
单层两层三层N层1231231231234一、J2EE的由来1、传统应用程序模型√2、Web应用程序模型3、为什么需要J2EE1、传统应用程序模型(一)数据访问、表示和业务逻辑在一个应用中代码复用、代码可维护性、代码的修改十分困难应用不是分布式的,不具有可伸缩性主机系统或单层结构:主机/终端模式1、传统应用程序模型(二)用户界面和程序逻辑绑在一起,代码难以重用服务器的数据库必须同每一个活动的客户保持连接,消耗大量的运算资源,随着客户数目的增加性能不断下降,且存在死锁及崩溃的可能数据模型“紧耦合”在每一客户端,数据库结构改变将导致全体客户端改变,不利于更新和维护原始数据通过网络传递:加重网络负担客户端应用程序越来越大,对使用者的要求也越来越高客户/服务器结构:“胖”客户端胖客户端:表示逻辑业务逻辑业务数据模型通讯FatclientFatclient一、J2EE的由来1、传统应用程序模型2、Web应用程序模型√3、为什么需要J2EE2、Web应用程序模型(一)传统的Web应用程序模型:三层分布式架构2、Web应用程序模型(一)WWW浏览方式带来的变化:“Browser-based”的客户端与“Internetworking”计算方式向服务器端的集中转化客户端:业务数据模型与UI分开,更“瘦”业务逻辑在中间层,通过:连接池,多线程可以处理多客户端早期应用编程困难且性能比较差:CGI(C/C++,VB,Perl等等),ISAPI,NSAPI传统的Web应用程序模型:三层分布式架构2、Web应用程序模型(二)
采用N层计算结构,从逻辑角度看,系统分成客户端、Web服务器、应用服务器、数据库服务器四层;从物理角度看,应用服务器可以视用户并发数从1到N台进行扩充,以保证客户端用户的响应要求。
N层计算模式的引入2、Web应用程序模型(二)从1层到N层,得到的改进:每一层可以被单独改变,而无需其它层的改变降低了部署与维护的开销,提高了灵活性、可伸缩性引入瘦客户端,计算被集中至服务器端,使性能提高成为可能仍然存在的问题:对企业级应用开发人员的要求太高:需要熟悉分布式协议(IIOP、IIOPS、HTTP、HTTPS、CGI、ISAPI、NSAPI),进行一致性事务处理,负载平衡,考虑安全性……N层计算模式的引入2、Web应用程序模型(三)应用程序各部分之间松耦合,从而应用程序各部分的更新相互独立业务逻辑集中放在服务器上由所有用户共享,使得系统的维护和更新变得简单,也更安全数据库不再和每一个活动的用户保持一个连接,而是由应用程序组件负责与数据库打交道,降低数据库服务器的负担,提高了性能多层应用程序的真正优点一、J2EE的由来1、传统应用程序模型2、Web应用程序模型3、为什么需要J2EE√3、为什么需要J2EE在企业级应用开发中所面临的而且必须解决的问题:分布式可移植旧系统集成支持面向Web可装配满足企业计算要求一致性事务性安全性要有好的特性可伸缩可扩展易维护3、为什么需要J2EEJ2EE提供了一套完整的解决所有这些问题的框架方案:提供了分布式、可移植构件的框架为构件与应用服务器提供标准API简化了服务器端中间层构件的设计3、为什么需要J2EEJ2EE对开发者和用户来说意味着:更短的开发时间可重用构件JSPEJB更简化的连接XML,JDBC,RMI-IIOP一、J2EE的由来1、传统应用程序模型2、Web应用程序模型3、为什么需要J2EE内容一、J2EE的由来二、J2EE概念√三、J2EE编程思想四、J2EE技术框架五、优势J2EE是一个标准中间件体系结构
J2EE不是编程语言!!J2EE是企业分布式应用开发标准
内容一、J2EE的由来二、J2EE概念三、J2EE编程思想√四、J2EE技术框架五、优势组件-容器容器组件组件组件组件J2EE容器和构件:容器处理构件处理分布性可伸缩性可用性事务性安全性生命周期管理表示JSP,Servlet,Applet业务逻辑EJB数据访问逻辑EJB内容一、J2EE的由来二、J2EE概念三、J2EE编程思想四、J2EE技术框架√五、优势J2EE技术架构
J2EE架构:3、J2EE架构及核心技术简介
J2EE核心技术:13种
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBCXML、JMS……3、J2EE架构及核心技术简介
EJB—J2EE的基石:EJB(EnterpriseJavaBeans):EJB不是一个具体的产品,而是一个Java服务器端组件开发的规范,软件厂商根据它来实现EJB服务器。使用EJB,Java程序员可以将一些定义明确的程序块组合到一起,从而方便、快捷地建构分布式应用程序。使用EJB可以使整个程序分块明确,并且EJB可以使用其它EJB或JDBC等服务,从而增强了分布式应用程序的可扩展性和性能;EJB规范在简化分布式应用程序开发复杂性方面做了大量的工作,所以EJB程序员不必太担心事务处理、多线程、资源管理等方面的问题,可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。EJB的使用增强了整个系统程序的可靠性、可管理性和可移植性。J2EE核心技术
EJB—J2EE的基石:EJB容器是:
EJB的运行环境。它提供规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。它的责任包括:3、J2EE架构及核心技术简介
EJB—J2EE的基石:EJB服务器是:管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJB服务器必须提供支持对JNDI的名字服务和TS事务服务的可访问。
EJB分为两种:会话EJB和实体EJB,会话EJB向客户提供一定的服务,如:特定的商业逻辑、数据库查询等;而实体EJB则代表数据对象,通常代表的是数据表记录集的一行,一个实体EJB可以同时与多个客户进行交互。J2EE核心技术
J2EE核心技术:
EJB、CORBA、
RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
CORBA体系结构:核心-ORBJ2EE核心技术
CORBA技术:CORBA(CommonObjectRequestBrokerArchitecture)是一个分布式对象体系结构,它独立于平台,也独立于语言。在这个体系结构中,一个对象可以被本机上的客户或远程客户通过方法激活来存取。客户(一个对象或应用)无须知道被调用对象(称为服务对象)的运行环境,也无须知道实现这个对象的编程语言,客户只要知道服务对象的逻辑地址和提供的接口。这种互操作性的关键是IDL(InterfaceDefinitionLanguage、接口定义语言),IDL说明对象接口中的方法,这些方法可以被其它对象(或应用)激活。J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
RMI技术:RMI(RemoteMethodInvoke)是一种被EJB使用的更底层的协议,正如其名字所表示的那样,RMI协议调用远程对象上方法,使用序列化方式在客户端和服务器端的对象之间传递数据。RMI和CORBA相比:两者的关键差别在于语言环境,JavaRMI是一个分布式对象计算的纯Java解决方案(如,在JavaRMI中,对象的接口用Java定义,而不是用IDL);其次,CORBA没有定义安全服务,而JavaRMI继承了Java的安全性;再者,CORBA有不同的实现,不同的独立软件开发商的不同实现均有独特性,这使得在不同平台上的匹配比较困难,而且不是所有CORBA产品开发商都支持所有平台,而几乎所有平台都支持Java虚拟机,因此JavaRMI具有更高的可移植性。如果客户对象和服务对象都基于Java虚拟机,那么JavaRMI是分布对象计算的最好选择。最后,IIOP已经提供了JavaRMI和CORBA的互操作能力,而且两者的发展有互相借鉴的趋势。J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
JSP技术:JSP是服务器端的脚本语言,是以Java和Servlet为基础开发而成的动态网页生成技术,它的底层实现是JavaServlet。JSP(JavaServerPages)页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。特点:面向对象,跨平台,和Servlet一样稳定,可以使用Servlet提供的API,克服了Servlet的缺点。应用:一般和JavaBeans结合使用,从而将界面表现和业务逻辑分离。J2EE核心技术
JSP和ASP的比较(一):相似:都是运行于服务器端的脚本语言,两者都是动态网页生成技术。这两项技术都使用HTML来决定网页的版面,都是在HTML代码中混合某种程序代码,由语言引擎解释执行程序代码。HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。JSP和ASP的比较(二):不同:JSP是由Sun推出的一项技术,是基于JavaServlet以及整个java体系的Web开发技术,利用这一技术可以建立先进、安全和跨平台的动态网站。ASP是MS公司推出的技术,只能在MS的平台上运行,无法实现跨平台,也无安全性保障。ASP下的编程语言是VBScript之类的脚本语言,而JSP使用的是Java。ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在ASP下,VBScript代码被ASP引擎解释执行;在JSP下,代码被编译成Servlet并由Java虚拟机执行,这种编译操作仅在对JSP页面的第一次请求时发生。
J2EE核心技术
J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
JavaServlet技术:Servlets(=Server+Applet):是一些运行于Web服务器端的Java小程序,用来扩展Web服务器的功能。Servlet是一种扩展Web服务器功能的技术,而且由于它是用Java编写的,所以能够访问整个JavaAPI库,包括用于访问企业数据库的JDBCAPI。Servlets用特定的Java解决方案替代了其它的Web服务器方编程模式(如:CGI,ISAPI等),因而继承了Java的所有特性(跨平台、多线程、OO)。用来编写Servlets的ServletAPI对于服务器环境和协议没有任何特殊的要求,所以Servlets具有很强的可移植性,也不像利用CGI程序等其它方式那样具有性能局限。Servlets也同样使用HTTP协议与客户端进行通讯,所以有时也称Sevlets为“HTTPServlets”。J2EE核心技术
JavaServlet和JSP的比较:相似:两者都是基于Java的技术,所以都继承了Java的所有特性(跨平台、多线程、OO),都可以使用Java强大的API。两者工作方式相似:JSP代码先被JSP容器转换为Servlet代码再编译为类。两者在J2EE体系结构中的工作层次相同,都负责与客户端的连接。不同:编程方式不同。Servlets是一些运行于Web服务器端的Java小程序;而JSP是脚本,编写起来更简单容易。应用目的不同。Servlet主要用于从客户端接收请求信息,而JSP主要负责将服务器端信息传送到客户端。使用JSP的真正意义在于:可以将界面设计和业务逻辑设计分离。J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
JavaBean技术:JavaBean是基于Java的组件模型,有点类似于Microsoft的COM组件。JavaBean通过Java虚拟机(JavaVirtualMachine)执行,运行JavaBean最小的需求是JDK1.1或者以上的版本。在Java平台中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生成新的应用程序。对于程序员来说,最好的一点就是JavaBean可以实现代码的重复利用,另外对于程序的易维护性等等也有很重大的意义。JavaBean传统的应用在于可视化的领域,如AWT下的应用。自从Jsp诞生后,JavaBean更多的应用在了非可视化领域,在服务器端应用方面表现出来了越来越强的生命力。
J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……J2EE核心技术
JDBC技术:JDBC是一组API,定义了用来访问数据源的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源。JDBC对数据库的访问具有平台无关性。JDBCAPI为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题。JDBC的目标是使应用程序开发人员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS……3、J2EE架构及核心技术简介
XML技术:XML(ExtensibleMarkupLanguage)是一种可以用来定义其它标记语言的语言,被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的,但是它和Java具有的相同目标即平台独立性。通过将Java和XML的组合,可以得到一个完美的具有平台独立性的解决方案。J2EE平台全面支持和实施XML,这种强大的组合可使XML具备跨平台的兼容性,甚至用于对XML代码进行语法检查和调试的工具也可与平台无关。J2EE核心技术
J2EE核心技术:
EJB、CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS、……J2EE核心技术
JMS技术:
JMS是一种基于Java的技术,因此是平台无关的。它为消息服务定义了通用Java语言接口,支持最常见的消息传递模型(发布/订阅和点到点)。通过对JMS(Java消息服务)API的访问可实现面向消息的通信。JMS通常用来实现异构系统之间的松散集成。J2EE核心技术
*关于消息技术:
消息系统的特点:
-消息是异步的。-允许不同的应用程序之间进行通讯。-消息应用程序之间是对等的,服务器与客户机之间没有明显的界限。消息的生产者可以消费消息,消费消息的应用程序也可以生产消息。J2EE核心技术
*关于消息技术:
消息系统的优势:
-与平台无关,与在网络上所处的位置无关。-是可伸缩,可扩展的。需更大的吞吐量,只需添加硬件即可。可支持数万台客户机,每秒钟可处理事件的数目可达几万。-在异构的环境中可以很好地工作。-是健壮的,发送接受可以失败,网络也可以失败,这时MessagingSystem可以继续执行它的职责。J2EE核心技术
J2EE其它核心技术:
EJB、CORBA、RMI、JSP、JavaServlet、JavaBean、JDBC、
XML、JMS、……几个对应于几种服务的企业级API:
JNDI(JavaNamingandDirectoryInterface)、
JMAPI(JavaManagementAPI)、
JTS/JTA(JavaTransactionService/API)、
JavaSecurityAPI。
J2EE核心技术
J2EE核心技术中最常用的技术:
EJB、
CORBA、RMI、JSP、
JavaServlet、JavaBean、JDBC、XML、JMS、……开发大型企业级应用:异构、分布、数据交换
CORBA、RMI、XML、JMS、……内容一、J2EE的由来二、J2EE概念三、J2EE编程思想四、J2EE技术框架五、优势√独立于硬件配置和操作系统坚持面向对象的设计原则灵活性、可移植性和互操作性轻松的企业信息系统集成
JavaMail编程JavaMail基础知识√发送简单邮件发送SMTP身份认证的邮件接收邮件邮件附件的处理常见电子邮件协议SMTP(SimpleMailTransferProtocol,简单邮件传输协议)POP(PostOfficeProtocol,邮局协议)IMAP(InternetMessageAccessProtocol,Internet消息访问协议)MIME(MultipurposeInternetMailExtensions,多用途Internet邮件扩展标准)不是邮件传输协议,它只定义了需要传输的消息、附件及其他类型数据的格式。JavaMail体系可以分为三层:抽象层Internet邮件实现层协议实现层JavaMail抽象层:该层定义了用于邮件处理功能的抽象类、接口和抽象方法,所有的邮件系统都支持这些功能,它独立于供应商和协议消息。抽象层位于JavaMail顶级包(即javax.mail)内。
Internet邮件实现层:该层实现了部分抽象层元素,它遵循Internet标准―RFC822和MIME。Internet邮件实现层所定义的类和接口大多位于ernet包内。协议实现层:该层由服务提供商实现对特定协议的支持,如SMTP、POP、IMAP和NNTP。Sun为开发者提供了很完备的一组协议的支持。核心JavaMailAPI可以分为两部分,一部分由七个主要对象组成:Session、Message、Address、Authenticator、Transport、Store和Folder,利用这些对象可以完成包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML文件格式的消息及搜索或过滤邮件列表等任务核心JavaMailAPI的另一部分的主要接口和类包括Part、Message、Bodypart、Multipart、MimePart、MimeMessage、MimiBodypart和MimeMultipart,可以用这些类和接口完成电子邮件的阅读、撰写等任务。JavaMail基础知识发送简单邮件
√发送SMTP身份认证的邮件接收邮件邮件附件的处理程序8-2:SendMail.java(片断)try{ Propertiesprops=newProperties(); SessionsendMailSession; Storestore; Transporttransport; sendMailSession=Session.getInstance(props,null); props.put("mail.smtp.host",host); MessagenewMessage=newMimeMessage(sendMailSession); newMessage.setFrom(newInternetAddress(request.getParameter("from"))); newMessage.setRecipient(Message.RecipientType.TO,newInternetAddress(request.getParameter("to"))); newMessage.setSubject(request.getParameter("subject")); newMessage.setSentDate(newDate()); newMessage.setText(request.getParameter("text")); Transport.send(newMessage); ////显示发送成功的提示
out.println("theEmailsendsucess!");JavaMailAPI的中文问题。如果开发者使用setSubject()方法直接设定中文的主题或者使用setText()方法直接指定中文内容,那么在使用Outlook等客户端软件查看邮件时客户有可能看到的将是一团乱码。解决方案?只需要指定邮件主题和邮件正文的字符集为“ISO-8859-1”即可。JavaMail基础知识
发送简单邮件发送SMTP身份认证的邮件
√接收邮件邮件附件的处理为了防止恶意用户利用SMTP服务器进行发送垃圾邮件等破坏活动,SMTP服务器一般需要身份验证。只有通过了身份验证的用户才有权利利用SMTP服务器发送邮件。javaMail用类javax.mail.Authenticator来进行用户认证。验证信息需要通过Session传给邮件服务器,所以Session对象的getInstance有以下的变形staticSessiongetInstance(Propertiesprop,Authenticatorauth);staticSessiongetDefaultInstance(Propertiesprop,Authenticatorauth);其中的Authenticator负责密码校验。如果不需要验证身份,就用null做第二个参数,或者直接用单参数的getInstance。如果Session是需要密码的,那么Session会自动发出如下调用javax.mail.PasswordAuthenticationgetPasswordAuthentication();PasswordAuthentication只是一个包装类,里面包了用户名和密码。因此如果要实现SMTP认证的邮件发送,必须首先自己定义一个继承javax.mail.Authenticatior的类。
程序8-4:Auth.javaimportjavax.mail.Authenticator;importjavax.mail.PasswordAuthentication;publicclassAuthextendsAuthenticator{ Stringusername=""; Stringpassword=""; publicAuth(Stringusername,Stringpassword){ this.username=username; this.password=password; } publicPasswordAuthenticationgetPasswordAuthentication(){ returnnewPasswordAuthentication(username,password); }}程序8-5:sendAuthmail.java(片段)//初始化收件人邮件地址、发件人邮件地址和主机名,下面的各初始化字符串均为任意设置
Stringto="teacher@"; Stringfrom="student@"; Stringhost=""; //创建一个属性对象
Propertiesprops=newProperties();//指定发送邮件服务器,使用smtp协议
props.put("mail.smtp.host",host); props.put("mail.smtp.auth","true"); Authau=newAuth("hyl","123456"); //获取会话
Sessionsession=Session.getInstance(props,au); try{//创建消息,设置邮件发件人地址、收件人地址、主题
MimeMessagemsg=newMimeMessage(session); msg.setFrom(newInternetAddress(from)); msg.addRecipient(Message.RecipientType.TO,newInternetAddress(to)); msg.setSubject("sendExample"); //开始设置消息内容
msg.setSentDate(newDate()); Stringtext="Hi,thisisEmailbyauthentication!"; msg.setText(text);//发送邮件
Transport.send(msg); ////显示发送成功的提示
out.println("theEmailsendsucess!"); }catch(MessagingExceptione) { //异常处理
out.println("theEmailsendfailed!"); out.println(e.toString()); }JavaMail基础知识发送简单邮件发送SMTP身份认证的邮件接收邮件
√邮件附件的处理接收邮件过程比较简单,但是接收的方式和服务器有很大的关系:是IMAP的服务器还是普通的POP服务器,支持多少个文件夹,支持多少种邮件标记。这些都需要事先了解好或者用程序去探测。JavaMail基础知识发送简单邮件发送SMTP身份认证的邮件接收邮件邮件附件的处理
√发送附件发送附件非常像转发消息,程序开发人员需要建立各部分以组成完整消息,完成消息正文后,即开始添加其他部件,其中每个DataHandler都代表附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是FileDataSource。而如果从URL中读时,附件的数据源是URLDataSource。一旦存在DataSource,只要先把它传递给DataHandler构造器,最后再用setDataHandler()把它附加到BodyPart。假定要保留附件的原始文件名,最终要做的是用BodyPart的setFileName()方法设置与附件相关的文件名。程序8-12:SendAttachmentMail.java(片段)// 正文部分
BodyPartmessageBodyPart=newMimeBodyPart(); //Fillthemessage StringcontentMessage=request.getParameter("body"); messageBodyPart.setText(contentMessage); Multipartmultipart=newMimeMultipart(); multipart.addBodyPart(messageBodyPart); //Parttwoisattachment Stringfilename=request.getParameter("thefile"); messageBodyPart=newMimeBodyPart(); DataSourcesource=newFileDataSource(filename); messageBodyPart.setDataHandler(newDataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); //Putpartsinmessage mimeMsg.setContent(multipart); //Sendthemessage Transport.send(mimeMsg);接收附件从邮件中获取附件比发送它们要困难,因为MIME没有简单的关于附件的概念。当消息包含附件时,消息的内容是个Multipart对象。接着,开发者需要处理每个Part,获取主要内容和附件。标有从part.getDisposition()获得的Part.ATTACHMENT配置(disposition)的部件(Part)无疑就是附件。但是,没有配置(及一个非文本MIME类型)和带Part.INLINE配置的部件也可能是附件。当配置要么是Part.ATTACHMENT,要么是Part.INLINE时,这个消息部件的内容就能被保存。只要用getFileName()和getInputStream()就能分别得到原始文件名和输入流。程序8-13:ReceiveMimeMail.java(片段)Multipartmp=(Multipart)message[nid].getContent(); StringszFile=""; Fileffile; //Stringszpath=""; for(inti=0,n=mp.getCount();i<n;i++){ Partpart=mp.getBodyPart(i); StringszMbp=part.getContentType(); System.out.println("IDX:"+i+":类型"+szMbp); Stringdisposition=part.getDisposition(); if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT)||(disposition.equals(Part.INLINE))))){ //创建一个文件,并从输入流中读取字节,,存入到文件中
szFile=MimeUtility.decodeText(part.getFileName()); Stringfullpath=filepath+szFile; ffile=newFile(fullpath); FileOutputStreamoutfile=newFileOutputStream(ffile); BufferedInputStreambr=newBufferedInputStream(part.getInputStream());BufferedOutputStreambw=newBufferedOutputStream(outfile); intb; while((b=br.read())!=-1)bw.write(b); bw.flush(); szAttach=szAttach+"<br>"+fullpath; }elseif(disposition==null){ MimeBodyPartmbp=(MimeBodyPart)part; if(mbp.isMimeType("text/plain")||mbp.isMimeType("text/html")){//普通正文
szBody=mbp.getContent().toString(); szBody=szBody.replaceAll("\r\n","<br>"); }elseif(mbp.isMimeType("multipart/alternative")){//HTML正文
szBody=((Multipart)part.getContent()).getBodyPart(0).getContent().toString(); } } } }
JDBC连接数据库JDBC工作原理
√通过JDBC对数据库执行SQL语句基于数据源访问数据库高级开发技巧JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。真正的数据库访问操作实现是由各自数据库厂商提供的。通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序。JDBC通过提供一个抽象的数据库接口,使得程序开发人员在编程时可以不用绑定在特定数据库厂商的API上,大大增加了应用程序的可移植性。在实际运行过程中程序代码通过JDBC访问数据库时,仍旧需要调用特定于数据库的访问API!!!JDBC访问数据库层次结构
创建数据库连接,分为以下几步:首先注册数据库驱动程序,然后根据具体的JDBCURL地址,调用DriverManager对象的getConnection()来获取一个代表数据库连接的java.sql.connectuion对象。JDBCURL的格式如下:jdbc:子协议:数据库定位器。MySQL数据库:jdbc:mysql://机器名/数据库名Oracle数据库:jdbc:oracle:thin@机器名:端口名:数据库名给定具体的JDBCURL,获取数据库连接的方法是在DriverManager对象上调用getConnection()。这种方法有两种形式:DriverManager.getConnection(url)DriverManager.getConnection(url,user,password)其中第二种方式需要输入用户名和密码信息进行身份认证。程序7-1:test.jsp<%@pagecontentType="text/html;charset=gb2312"%><%java.sql.Connectionconn;java.lang.StringstrConn;try{Class.forName("org.gjt.mm.mysql.Driver").newInstance();conn=java.sql.DriverManager.getConnection("jdbc:mysql://localhost/test","root","");%>连接Mysql数据库成功!<%}catch(java.sql.SQLExceptione){out.println(e.toString());}%>数据库连接测试
JDBC工作原理通过JDBC对数据库执行SQL语句√
基于数据源访问数据库高级开发技巧java.sql.Statement对象代表一条发送到数据库执行的SQL语句。有三种Statement对象:Statement对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或不带参数的预编译SQL语句;CallableStatement对象用于执行对数据库存储过程的调用。注意:继承了Statement接口中所有方法的PreparedStatement接口也有自己的executeQuery、executeUpdate和execute方法。Statement对象本身不包含SQL语句,因而必须给Statement.execute方法提供SQL语句作为参数。PreparedStatement对象并不将SQL语句作为参数提供给这些方法,因为它们已经包含预编译SQL语句。CallableStatement对象继承这些方法的PreparedStatement形式。对于这些方法的PreparedStatement或CallableStatement版本,使用查询参数将抛出SQLException。PreparedStatement实例包含已编译的SQL语句,这也是将其命名冠以“Prepared”的原因。包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前通过适当的setXXX()方法来提供。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。JDBC工作原理通过JDBC对数据库执行SQL语句基于数据源访问数据库
√高级开发技巧数据源是在JDBC2.0中引入的一个概念。在JDBC2.0扩展包中定义了javax.sql.DataSource接口来描述数据源的概念。如果用户希望建立一个数据库连接,通过查询在JNDI(JavaNamingandDirectoryInterface)服务中的数据源,可以从数据源中获取相应的数据库连接。这样程序开发人员就只需要获取一个逻辑名称,而不是数据库登录的具体细节,这样代码的移植能力就更强。属性名称属性数据类型描述databaseNameString数据库名称,即数据库的SIDdataSourceNameString数据源接口实现类的名称。descriptionString对数据源的描述。networkProtocolString和服务器通讯使用的网络协议名。passwordString用户登录密码。portNumberInt数据库服务器使用的端口,缺省值为1521。serverNameString数据库服务器名称。userString用户登录名。程序7-5:mysql-service.xml(片段)……<mbeancode="org.jboss.resource.connectionmanager.RARDeployment"name="jboss.jca:service=LocalTxDS,name=MySqlDS"><attributename="JndiName">MySqlDS</attribute><attributename="ManagedConnectionFactoryProperties"><properties><config-propertyname="ConnectionURL"type="java.lang.String">jdbc:mysql://localhost:3306/sample</config-property><config-propertyname="DriverClass"type="java.lang.String">org.gjt.mm.mysql.Driver</config-property><!--settheseonlyifyouwantonlydefaultlogins,notthroughJAAS--><config-propertyname="UserName"type="java.lang.String">root</config-property><config-propertyname="Password"type="java.lang.String"></config-property></properties></attribute><!--Belowhereareadvancedproperties--><!--hack--><dependsoptional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBossLocalTransactionJDBCWrapper</depends></mbean>…….try{javax.naming.InitialContextctx=newjavax.naming.InitialContext();javax.sql.DataSourceds=(javax.sql.DataSource)ctx.lookup("java:/MySqlDS");conn=ds.getConnection();preparedStmt=conn.prepareStatement("selectcustomerid,address,phonefromcustomerwherefirstnamelike?");//设置参数Stringparm=request.getParameter("parm");preparedStmt.setString(1,"%"+parm+"%");//执行Sql语句sqlRst=preparedStmt.executeQuery();%>程序7-6:test2.jsp(片段)JDBC工作原理通过JDBC对数据库执行SQL语句基于数据源访问数据库高级开发技巧√BLOB字段的处理
// 执行Sql语句
sqlRst=Stmt.executeQuery(SQLString); while(sqlRst.next()){ java.sql.Blobblob=sqlRst.getBlob("data"); byte[]ab=blob.getBytes(1,(int)blob.length()); response.setContentType("image/gif"); response.reset(); op.write(ab); op.flush(); op.close(); } Stmt.close(); conn.close();程序7-7:ShowImage.java(片段)分页显示代码片段
<%if(intPageCount>0){sqlRst.absolute((int1)*intPageSize+1);i=0;while(i<intPageSize&&!sqlRst.isAfterLast()){Stringnames=sqlRst.getString(1);Stringpassword=sqlRst.getString(2);%><trwidth><tdwidth=50%><%=names%></td><tdwidth=50%><%=password%></td><tr><%sqlRst.next();i++;}}%>
JSP编程JSP工作原理√JSP脚本元素JSP指令元素JSP动作组件JSP内置对象JSP工作原理JSP是一种实现普通静态HTML和动态HTML混合编码的技术。
JSP最终会被转换成标准的Servlet!!!
JSP设计的目的在于简化表示层的表示。
JSP页面的其他成分主要有如下三种:脚本元素指令动作<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="java.util.*“%>...<HTML><BODY>其他HTML语言<%
符合JAVA语法的JAVA语句%>
其他HTML语言
</BODY></HTML>JSP示例(Hello.jsp)<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="java.util.*"%><HTML><BODY><%for(inti=0;i<2;i++){%
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2016年二建《机电》真题及答案
- 安全隐患识别能力题目及答案
- 实战案例2025保安证考试试题及答案
- 制定计划2025年保安证考试试题及答案
- 跨境电商服务业
- 知识运用的保安证考试试题及答案
- 2025年保安证考试选点突破试题及答案
- 湖南省长沙市周南梅溪湖中学2025届高三第二学期期末质量抽测生物试题试卷含解析
- 保安证考试个人反思与试题及答案
- 长沙理工大学城南学院《接入网技术》2023-2024学年第二学期期末试卷
- 客运公司安全培训
- 2025年福建福州市城市多边合作中心招聘3人历年高频重点提升(共500题)附带答案详解
- 课题申报书:GenAI赋能新质人才培养的生成式学习设计研究
- 中考第一轮复习人教七年级英语上册Unit5-Unit9词汇短语复习课件
- 高阶思维能力培养教学策略
- 人教版一年级下20以内退位减法
- 《雷达原理》课件-3.5.4教学课件:ISAR雷达工作原理
- 新版环氧乙烷安全技术说明书SDS模版
- 2024年预防接种工作计划(6篇)
- 衡中同卷2025届高三第一次模拟考试数学试卷含解析
- 万科物业2024年业主满意度提升策略培训案例解读
评论
0/150
提交评论