版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国数字人民币跨境支付系统对接难点
- 2026东南亚新兴市场费托蜡进口替代机遇与本土化生产障碍报告
- 2025中国心力衰竭诊断与治疗指南
- 2025新中医药剂师资格考试必考题集试题及答案
- 2026中国华能宁夏能源有限公司新能源分公司校园招聘笔试模拟试题及答案解析
- 2026届上海市浦东新区川沙中学十校联考最后历史试题含解析
- 2026年税务师考试经典真题回顾
- 内镜诊疗室隐患排查评估整治技术指南(2025年版)
- 2026年建筑工程生产实习报告(5000字)
- 电气工作负责人岗位职责说明
- 浅析援外成套项目设计各阶段投资控制
- 医院心理测验题库及答案
- 2025国家电力投资集团有限公司新闻中心招聘笔试历年参考题库附带答案详解
- 2026年中考语文一轮复习:名著导读《经典常谈》知识点讲义(含练习题及答案)
- 2025年辽宁省抚顺市辅警考试真题及答案
- 《三次方程的解法与运用:九年级数学教学教案》
- 院内采购评审专家培训课件
- 2026年高考生物一轮复习:人教版必修+选必修共5册知识点考点背诵提纲
- 汽车电驱系统讲解
- 2024-2025学年上海市普陀区六年级(下)期中数学试卷(五四学制)(含解析)
- 《辅助生殖技术指南》课件
评论
0/150
提交评论