欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

J2EE的13種核心技術

系統 2290 0

一、內容簡介

? ?Steven Gould
在文中介紹了 J2EE 13 種核心技術: JDBC JNDI EJBs RMI JSP Java Servlets XML JMS Java IDL JTS JTA JavaMail JAF 。為了聯系實際, Gould 基于 WebLogic 應用服務器來自 BEA Systems 公司的一種廣為應用的產品環境來介紹 J2EE 的這些技術。
? ?Java
最初在瀏覽器和客戶端機器中粉墨登場,當時很多人質疑它是否適合做服務器端的開發。現在隨著對 J2EE 第三方支持的增多, Java 被廣泛接納為開發企業級服務器端解決方案的首選平臺之一。
? ?J2EE
平臺由一整套服務 (Services) 、應用程序接口 (APIs) 和協議構成,它對開發基于 Web 的多層應用提供了功能支持。在本文中我將解釋支撐 J2EE 13 種核心技術: JDBC JNDI EJBs RMI JSP Java Servlets XML JMS Java IDL JTS JTA JavaMail JAF ,同時還將描述在何時、何處需要使用這些技術。當然我還要介紹這些不同技術之間如何交互。
? ?
此外,為了讓您更好地感受 J2EE 的真實應用,我將在 WebLogic 應用服務器環境下來介紹這些技術。不論對于 WebLogic 應用服務器和 J2EE 的新手,還是那些想了解 J2EE 能帶來什么好處的項目管理者和系統分析員,相信本文一定很有參考價值。

?
二、宏觀印象 : 分布式結構和 J2EE

? ?
過去二層化應用 -- 通常被稱為 C/S 應用 -- 是大家談論最多的。在很多情況下,服務器提供的唯一服務就是數據庫服務。在這種解決方案中,客戶端程序負責數據訪問、實現業務邏輯、用合適的樣式顯示結果、彈出預設的用戶界面、接受用戶輸入等。 C/S 結構通常在第一次部署時較容易,但難于升級或改進,且經常基于某種專有的協議,通常是某種數據庫協議。它使得重用業務邏輯和界面邏輯非常困難。更重要的是,在 Web 時代,二層化應用通常不能體現出很好的伸縮性,因而很難適應 Internet 的要求。
? ?Sun
設計 J2EE 的部分起因就是想解決二層結構的缺陷,于是 J2EE 定義了一套標準來簡化 N 層企業級應用的開發。它定義了一套標準化組件,并為這些組件提供完整的服務。 J2EE 還自動為應用程序處理了很多實現細節,如安全、多線程等。用 J2EE 開發 N 層應用包括將二層結構中的不同層面切分成許多層。一個 N 層化應用 A 能夠為以下的每種服務提供一個分開的層:
? ?
顯示:在一個典型 Web 應用中,客戶端機器上運行的瀏覽器負責實現用戶界面。
? ?
動態生成顯示:盡管瀏覽器可以完成某些動態內容顯示,但為了兼容不同的瀏覽器,這些動態生成工作應該放在 Web 服務器端進行,使用 JSP Servlets XML XSLT
? ?
業務邏輯:業務邏輯適合用 Session EJBs( 后面將介紹 ) 來實現。
? ?
數據訪問:數據訪問適合用 Entity EJBs( 后面將介紹 ) JDBC 來實現。
? ?
后臺系統集成:同后臺系統的集成可能需要用到許多不同的技術,至于何種最佳,需要根據后臺系統的特征而定。
? ?
您可能開始詫異:為什么有這么多的層?事實上,多層方式可以使企業級應用具有很強的伸縮性,它允許每層專注于特定的角色。如讓 Web 服務器負責提供頁面,應用服務器處理應用邏輯,而數據庫服務器提供數據庫服務。
? ?
由于 J2EE 建立在 J2SE 的基礎上,所以具備了 J2SE 的所有優點和功能。包括 編寫一次,到處可用 的可移植性、通過 JDBC 訪問數據庫、同原有企業資源進行交互的 CORBA 技術,及一個經過驗證的安全模型。在這些基礎上, J2EE 又增加了對 EJB Java Servlet JSP XML 技術的支持。

三、分布式結構與 WebLogic 應用服務器
? ?J2EE
提供了一個框架 ( 一套標準 API) 用于開發分布式結構的應用,這個框架的實際實現留給了第三方廠商。部分廠商只是專注于整個 J2EE 架構中的的特定組件,如 Apache Tomcat 提供了對 JSP Servlet 的支持, BEA 系統公司則通過其 WebLogic 應用服務器產品為整個 J2EE 規范提供了一個較為完整的實現。
? ?WebLogic
服務器已使建立和部署伸縮性較好的分布式應用的過程大為簡化。 WebLogic J2EE 代你處理了大量常規的編程任務,包括提供事務服務、安全領域、可靠的消息、名字和目錄服務、數據庫訪問和連接池、線程池、負載平衡和容錯處理等。通過以一種標準、易用的方式提供這些公共服務,象 WebLogic 服務器這樣的產品造就了具有更好伸縮性和可維護性的應用系統,使其為大量的用戶提供了增長的可用性。

四、 J2EE 技術
? ?
在接下來的部分里,我們將描述構成 J2EE 的各種技術,且了解 WebLogic 服務器是如何在一個分布式應用中對它們進行支持的。最常用的 J2EE 技術應該是 JDBC JNDI EJB JSP Servlets ,對這些我們將作更仔細的考察。

1. ? ? Java Database Connectivity (JDBC)

? ?JDBC API
以一種統一的方式來對各種數據庫進行存取。和 ODBC 一樣, JDBC 為開發人員隱藏了不同數據庫的不同特性。另外,由于 JDBC 建立在 Java 的基礎上,因此還提供了數據庫存取的平臺獨立性。 JDBC 定義了 4 種不同的驅動程序,現分述如下:
? ?
類型 1 JDBC-ODBC Bridge
? ?
JDBC 出現的初期, JDBC-ODBC 橋顯然是非常有實用意義的,通過 JDBC-ODBC 橋,開發人員可用 JDBC 來存取 ODBC 數據源。不足的是需要在客戶端安裝 ODBC 驅動程序,換句話說,必須安裝 Windows 的某個版本。使用這一類型要犧牲 JDBC 的平臺獨立性。另外 ODBC 驅動程序還需具有客戶端控制權限。
? ?
類型 2 JDBC-native driver bridge
? ?JDBC
本地驅動程序橋提供了一種 JDBC 接口,它建立在本地數據庫驅動程序的頂層,而不需要 ODBC JDBC 驅動程序將對數據庫的 API 從標準的 JDBC 調用轉換為本地調用,使用此類型要犧牲 JDBC 的平臺獨立性,還要求在客戶端安裝客戶端數據庫驅動程序。
? ?
類型 3 JDBC-network bridge
? ?JDBC
網絡橋驅動程序不需要客戶端數據庫驅動程序。它使用網絡上的中間件服務器來存取數據庫。這種應用使得負載均衡、連接緩沖池和數據緩存等技術的實現有了可能。由于第 3 種類型往往只需要相對更少的下載時間,具有平臺獨立性,且不需要在客戶端安裝數據庫驅動程序并取得控制權,所以很適合于 Internet 上的應用。
? ?
類型 4 Pure Java driver
? ?
通過使用一個純 Java 數據庫驅動程序來執行數據庫的直接訪問。此類型實際上在客戶端實現了 2 層結構。要在 N- 層結構中應用,一個更好的做法是編寫一個 EJB ,讓它包含存取代碼并提供一個對客戶端具有數據庫獨立性的服務。
? ?WebLogic
服務器為一些通常的數據庫提供了 JDBC 驅動程序,包括 Oracle Sybase Microsoft SQL Server Informix 。它也帶有一種 JDBC 驅動程序用于 Cloudscape ,這是一種純 Java DBMS WebLogic 服務器中帶有該數據庫的評估版本。讓我們看一個實例。
? ?JDBC
實例
? ?
在這個例子中假定已在 Cloudscape 中建立了一個 PhoneBook 數據庫,且包含一個表名為 CONTACT_TABLE 的表,它帶有 2 個字段: NAME PHONE 。開始時先裝載 Cloudscape JDBC driver ,并請求 driver manager 得到一個對 PhoneBook Cloudscape 數據庫的連接。通過這一連接,可構造一個 Statement 對象并用它來執行一個簡單的 SQL 查詢。最后用循環來遍歷結果集的所有數據,并用標準輸出將 NAME PHONE 字段的內容進行輸出。
import java.sql.*;
public class JDBCExample{
?public static void main(String args[]){
?try{
? ?Class.forName("COM.cloudscape.core.JDBCDriver");
? ?Connection conn = DriverManager.getConnection("jdbc:cloudscape honeBook");
? ?Statement stmt = conn.createStatement();
? ?String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BY name";
? ?ResultSet resultSet = stmt.executeQuery(sql);
? ?String name, phone;
? ?while (resultSet.next()){
? ? ?name = resultSet.getString(1).trim();
? ? ?phone = resultSet.getString(2).trim();
? ? ?System.out.println( name + ", " + phone );
? ?}
?}
?catch ( Exception e ){
? ?// Handle exception here
? ?e.printStackTrace();
?}
?}
}
? ?
接著我們來看一看 JDBC 是如何在企業應用中的進行使用。
? ?JDBC
在企業級應用中的應用
? ?
以上實例其實是很基本的,可能有些微不足道,它假定了一個 2 層結構。在一個多層的企業級應用中,更大的可能是在客戶端和一個 EJB 進行通信,該 EJB 將建立數據庫連接。為了實現和改進可伸縮性和系統性能, WebLogic 服務器提供了對連接緩沖池 Connection pool 的支持。
? ?Connection pool
減少了建立和釋放數據庫連接的消耗。在系統啟動以后即可建立這樣的緩沖池,此后如故再有對數據庫的請求, WebLogic 服務器可很簡單地從緩沖池中取出數據。數據緩沖池可在 WebLogic 服務器的 weblogic.properties 文件中進行定義 ( 可參考 weblogic.properties 文件中的例子, WebLogic 服務器的文檔中還有更詳細的參考信息 )
? ?
在企業級應用的另一個常見的數據庫特性是事務處理。事務是一組申明 statement ,它們必須作為同一個 statement 來處理以保證數據完整性,缺省情況下 JDBC 使用 auto-commit 事務模式。這可以通過使用 Connection 類的 setAutoCommit() 方法來實現。

2. ? ? Java Naming and Directory Interface (JNDI)

? ?JNDI API
被用于執行名字和目錄服務。它提供了一致的模型來存取和操作企業級的資源,如 DNS LDAP 、本地文件系統,后者在應用服務器中的對象。
? ?JNDI
中,在目錄結構中的每一結點稱為 context 。每一個 JNDI 名字都是相對于 context 的。這里沒有絕對名字的概念存在。對一個應用來說,它可通過使用 InitialContext 類來得到其第一個 context
Context ctx = new InitialContext();
? ?
應用可通過這個初始化的 context 經由這個目錄樹來定位它所需要的資源或對象。如假設你在 Weblogic 服務器中展開了一個 EJB 并將 home 接口綁定到名字 myApp.myEJB ,那么該 EJB 的某個客戶在取得一個初始化 context 后,可通過以下語句定位 home 接口:
MyEJBHome home = ctx.lookup( "myApp.myEJB" );
? ?
在這個例子中,一旦你有了對被請求對象的參考, EJB home 接口就可以在它上面調用方法。我們將在下面的 EJB 章節中做更多的介紹。以上關于 JNDI 的討論只是冰山之一角。如果要進一步地在 context 中查找對象, JNDI 也提供了一些方法來進行以下操作: 
? ?
將一個對象插入或綁定到 context ,這在你展開一個 EJB 時很有效。
? ?
context 中移去對象。
? ?
列出 context 中的所有對象。
? ?
創建或刪除子一級的 context

3. ? ? Enterprise Java Beans (EJB)

? ?J2EE
技術之所以贏得廣泛重視的原因之一就是 EJB 。它們提供了一個框架來開發和實施分布式商務邏輯,由此很顯著地簡化了具有可伸縮性和高度復雜的企業級應用的開發。 EJB 規范定義了 EJB 組件在何時如何與它們的容器進行交互作用。容器負責提供公用的服務,如目錄服務、事務管理、安全性、資源緩沖池及容錯性。
? ?EJB
規范定義了 3 中基本的 bean 類型,這里先不談 Message-driven Bean
? ?Stateless session beans
:提供某種單一服務而不維持任何狀態,在服務器故障發生時無法繼續存在,生命期相對較短。如它可能被用于執行溫度轉換計算。
? ?Stateful session bean
:提供了與客戶端的會話交互,可存儲狀態從而代表一個客戶。典型例子是購物車。不過在服務器故障時無法繼續生存,生命期相對較短。每一個實例只用于一個單個的線程。
? ?Entity beans:
提供了一致性數據的表示,通常存放在數據庫中,在服務器故障發生后能繼續存在。多用戶情況下可使用 EJB 來表示相同的數據, Entity EJB 的一個典型例子是客戶的帳號信息。
? ?
盡管有以上的區別,所有的 EJB 還是有許多的共同之處。它們都處理 home interface 。它定義了一個客戶端是如何創建與消亡 EJB 的。可在 bean 中對定義了客戶端方法的遠程接口進行調用; bean 類則執行了主要的商務邏輯。
? ?
描述 EJB 的開發已經超出了本文的范圍。但如果一個 EJB 已被開發或從第三方購買,它就須在應用服務器中進行發布。 WebLogic Server 5.1 帶有一個 EJB Deployer Tool 來協助處理 EJB 的發布。當你使用 EJB Deployer Tool 的時候,你要定義客戶端所用的 JNDI 名字來定位 EJB Deployer Tool 將生成 wrapper 類來處理和容器的通信及在一個 jar 文件中把被請求的 Java 類綁定在一起。
? ?
一旦 EJB 被發布,客戶端就可以使用它的 JNDI 名字來定位 EJB 。首先它必須得到一個到 home 接口的 reference 。然后客戶端可使用該接口,調用一個 create() 方法來得到服務器上運行的某個 bean 實例的句柄;最后客戶端可以使用該句柄在 bean 中調用方法。

4. ? ? JavaServer Pages (JSPs)

? ?
我們中可能已有許多人熟悉 Microsoft ASP 技術。 JSP ASP 相對應,但更具平臺獨立性。他們被設計用以幫助 Web 內容開發人員創建動態網頁,且只需要相對較少的代碼。 即使 Web 設計師不懂得如何編程也可使用 JSP ,因為 JSP 應用是很方便的。 JSP 頁面由 HTML 代碼和嵌入其中的 Java 代碼所組成。服務器在頁面被客戶端所請求后對這些 Java 代碼進行處理,然后將生成的 HTML 頁面返回給客戶端的瀏覽器。
? ?
您可能聽說過 JHTML ,這是 JSP 前一種較老標準。 WebLogic 服務器可支持兩者。請注意在缺省狀況下, JSP WebLogic 服務器中并沒有處于有效狀態。要使之有效,你可以編輯 weblogic.properties 文件。如果 Web 服務器還沒有處于有效狀態,則要先使之有效。 Servlet 的情況和 JSP 一樣。

5. ? ? Java servlets

? ?servlet
提供的功能大多與 JSP 類似,不過實現方式不同。 JSP 通常是大多數 HTML 代碼中嵌入少量的 Java 代碼,而 servlets 全部由 Java 寫成并且生成 HTML
? ?servlet
是一種小型的 Java 程序,它擴展了 Web 服務器的功能。作為一種服務器端應用,當被請求時開始執行,這和 CGI Perl 腳本很相似。 Servlets CGI 腳本的一個很大的區別是:每一個 CGI 在開始時都要求開始一個新進程,而 servlets servlet 引擎中以分離的線程來運行。因此其在可伸縮性上提供了很好的改進。
? ?
在開發 servlets 時,常需擴展 javax.servlet.http.HttpServlet 類,且 override 一些它的方法,其中包括:
? ?service()
:作為 dispatcher 來實現命令 - 定義方法
? ?doGet():
處理客戶端的 HTTP GET 請求。
? ?doPost():
進行 HTTP POST 操作
? ?
其它的方法還包括處理不同類型的 HTTP 請求,可參考 HttpServlet API 文檔。
? ?
以上描述是標準 J2EE Servlet API 的各種方法。 WebLogic 服務器提供了一個該 API 完整的實現途徑。一旦你開發了一個 servlet ,就可以在 weblogic.properties 中加以注冊并由此可以在 WebLogic 服務器中對它進行配置。

6. ? ? Remote Method Invocation(RMI)

? ?
在遠程對象上調用一些方法,使用連續序列方式在客戶端和服務器端傳遞數據。 RMI 是一種被 EJB 使用的更下層的協議。

Java RMI簡介

? ?遠程方法調用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現大大簡化了分布異構環境中Java應用之間的通信。

? ?要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,并用一個專有的URL注冊。RMI客戶機在遠程RMI服務器上查找服務對象,并將它轉換成本地接口類型,然后像對待一個本地對象一樣使用它。

? ?下面是一個簡單的RMI實例,RMI客戶機通過RMI服務器提供的方法輸出一個語句。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現復雜應用時,我們需要做的也只是完善遠程對象的實現類而已。
?
?
RMI實例分析

1.遠程對象的本地接口聲明(RMIOperate.java)

? · 該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
? · 遠程接口擴展 java.rmi.Remote 接口。
? · 除了所有應用程序特定的例外之外,每個方法還必須在 throws 子句中聲明 java.rmi.RemoteException (或 RemoteException 的父類)。
Hello.java
/* * @author javamxj (CSDN Blog) 創建日期 2004-12-27 */ import java . rmi . * ; // RMI本地接口必須從Remote接口派生 public interface Hello extends Remote { // 接口中的具體方法聲明,注意必須聲明拋出RemoteException String sayHello( String name) throws RemoteException ; }
?
2.遠程對象實現類

? 這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。

HelloImpl.java

              
                  
                    
                      
                        
                          
                            /*
                          
                          
                             * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                          
                          
                             */
                          
                          
                            import
                          
                          
                             java
                          
                          
                            .
                          
                          
                            rmi
                          
                          
                            .
                          
                          
                            *
                          
                          
                            ;
                          
                          
                            import
                          
                          
                             javax
                          
                          
                            .
                          
                          
                            rmi
                          
                          
                            .
                          
                          
                            PortableRemoteObject
                          
                          
                            ;
                          
                          
                            public
                          
                          
                            class
                          
                           HelloImpl 
                          
                            extends
                          
                           PortableRemoteObject 
                          
                            implements
                          
                           Hello { ? ?
                          
                            /* 構造函數 */
                          
                           ? ?
                          
                            public
                          
                           HelloImpl() 
                          
                            throws
                          
                          
                            RemoteException
                          
                           { ? ? ? ?
                          
                            super
                          
                          (); ? ?} ? ?
                          
                            /* 實現本地接口中聲明的'sayHello()'方法 */
                          
                           ? ?
                          
                            public
                          
                          
                            String
                          
                           sayHello(
                          
                            String
                          
                           message) 
                          
                            throws
                          
                          
                            RemoteException
                          
                           { ? ? ? ?
                          
                            System
                          
                          .out.println(
                          
                            "我在RMI的服務器端,客戶端正在調用'sayHello'方法。 "
                          
                          ); ? ? ? ?
                          
                            System
                          
                          .out.println(
                          
                            "Hello ?"
                          
                           + message); ? ? ? ?
                          
                            return
                          
                           message; ? ?}}
                        
                      
                    
                  
                
?
3.RMI服務器類

? 該類創建遠程對象實現類HelloImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。

HelloServer.java

                
                  /*
                
                
                   * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                
                
                   */
                
                
                  import
                
                
                   java
                
                
                  .
                
                
                  rmi
                
                
                  .
                
                
                  *
                
                
                  ;
                
                
                  public
                
                
                  class
                
                 HelloServer {
    
                
                  public
                
                
                  static
                
                
                  void
                
                 main(
                
                  String
                
                [] args) {
        
                
                  // 在服務器端設置安全機制 ? ? ? ? 
                
                
                  /*
                
                
                   ? ? ? ? ? if (System.getSecurityManager() == null) {
                
                
                   ? ? ? ? ? ? ? System.setSecurityManager(new RMISecurityManager()); 
                
                
                   ? ? ? ? ? }
                
                
                   ? ? ? ?*/
                
                
                  try
                
                 {
            
                
                  System
                
                .out.println(
                
                  "開始 RMI Server ..."
                
                );
            
                
                  /* 創建遠程對象的實現實例 */
                
                
            HelloImpl hImpl = 
                
                  new
                
                 HelloImpl();
            
                
                  System
                
                .out.println(
                
                  "將實例注冊到專有的URL "
                
                );
            
                
                  Naming
                
                .rebind(
                
                  "HelloService"
                
                , hImpl);
            
            
                
                  System
                
                .out.println(
                
                  "等待RMI客戶端調用..."
                
                );
            
                
                  System
                
                .out.println(
                
                  ""
                
                );
        } 
                
                  catch
                
                 (
                
                  Exception
                
                 e) {
            
                
                  System
                
                .out.println(
                
                  "錯誤: "
                
                 + e);
        }
    }
}

              

請注意有關 rebind 方法調用的下列參數:

  • 第一個參數是 URL 格式的 java.lang.String ,表示遠程對象的位置和名字。 ?

    • 需要將 myhost 的值更改為服務器名或 IP 地址。否則,如果在 URL 中省略,則主機缺省值為當前主機,而且在 URL 中無需指定協議(例如“ HelloServer ”)。 ?

    • 在 URL 中,可以選擇提供端口號:例如“/ /myhost:1234/HelloServer”。 端口缺省值為 1099。除非服務器在缺省 1099 端口上創建注冊服務程序,否則需要指定端口號。 ?

    ?

    ?

    ?

  • 第二個參數為從中調用遠程方法的對象實現引用。 ?

  • RMI 運行時將用對遠程對象 stub 程序的引用代替由 hImpl 參數指定的實際遠程對象引用。遠程實現對象(如 HelloImpl 實例)將始終不離開創建它們的虛擬機。因此,當客戶機在服務器的遠程對象注冊服務程序中執行查找時,將返回包含該實現的 stub 程序的對象。 ?

?
4.RMI客戶機類

? · RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。
? · Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三個異常都需要捕獲。

HelloClient.java

                
                  /*
                
                
                   * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                
                
                   */
                
                
                  import
                
                
                   java
                
                
                  .
                
                
                  rmi
                
                
                  .
                
                
                  *
                
                
                  ;
                
                
                  public
                
                
                  class
                
                 HelloClient {
    
                
                  public
                
                
                  static
                
                
                  void
                
                 main(
                
                  String
                
                [] args) {
        
                
                  // ? 在服務器端設置安全機制 ? ? ? ? 
                
                
                  /*
                
                
                   ? ? ? ? ? if (System.getSecurityManager() == null) {
                
                
                   ? ? ? ? ? ? ? System.setSecurityManager(new RMISecurityManager()); 
                
                
                   ? ? ? ? ? }
                
                
                   ? ? ? ?*/
                
                
                  /* 默認為本地主機和默認端口 */
                
                
                  String
                
                 host = 
                
                  "localhost:1099"
                
                ;
        
                
                  /* 帶輸入參數時,將host設置為指定主機 */
                
                
                  if
                
                 (args.length > 0)
            host = args[0];
        
                
                  try
                
                 {
            
                
                  /* 根據指定的URL定位遠程實現對象 */
                
                
                  /* “h”是一個標識符,我們將用它指向實現“Hello”接口的遠程對象 */
                
                
            Hello h = (Hello) 
                
                  Naming
                
                .lookup(
                
                  "rmi://"
                
                 + host + 
                
                  "/HelloService"
                
                );
            
            
                
                  System
                
                .out.println(
                
                  "實現“Hello”接口的遠程對象: "
                
                 + h);
            
                
                  System
                
                .out.println(
                
                  "我在客戶端,開始調用RMI服務器端的'sayHello'方法"
                
                );
            
                
                  System
                
                .out.println(
                
                  "歡迎, ?"
                
                 + h.sayHello(
                
                  "javamxj blog"
                
                ));
        } 
                
                  catch
                
                 (
                
                  Exception
                
                 ex) {
            
                
                  System
                
                .out.println(
                
                  "錯誤 "
                
                 + ex);
        }
    }
}

              
?
?
5. 編譯代碼與運行系統:
?
? 在MS-DOS環境下,創建一個D:\RMISample目錄,把上面4個文件復制到這個目錄下,然后在此目錄下新建兩個文件夾:client和server(把它們分別看作是客戶端與服務端)。
?
(1).編譯所有的源代碼
? ?D:\RMISample> javac *.java

(2).生成客戶端存根和服務器框架
? ?D:\RMISample> rmic HelloImpl
? ?這將生成HelloImpl_Stub.class和HelloImpl_Skel.class。
? ( :如果需要查看這兩個類的源代碼,可以使用“ rmic -keep HelloImpl”語句)
?
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class復制到client目錄;
? ?把Hello.class、HelloServer.class、HelloImpl_Skel.class、HelloImpl_Stub.class 復制到server目錄。
?
(4).啟動RMI注冊
? ?D:\RMISample\server>rmiregistry
? (注:我是在命令控制臺下運行這個系統的,必須開啟三個控制臺窗口,一個運行RMIRegistry,一個運行服務器,還有一個運行客戶端。)
?
(5).運行和調用

● 在服務器上執行HelloServer
?D:\RMISample\server>java HelloServer
?
● 在本地客戶機上運行HelloClient
?D:\RMISample\client>java HelloClient
?
● 在遠程客戶機上運行HelloClient(須指明RMI服務器主機名或IP地址)
? java HelloClient ?222.222.34.34
?
運行rmiregistry和server后的結果:
?
再運行Client后的結果:
?
?
? 還有一點要注意,在上面的例子中我注釋了安全管理的代碼,如果把注釋去掉,那么需要建立一個安全策略文件,比如其文件名為 policy.txt,內容如下:
grant {
permission java.security.AllPermission "", "";
};
這是一條簡單的安全策略,它允許任何人做任何事,對于你的更加關鍵性的應用,你必須指定更加詳細安全策略。把這個文件復制到Client和Server目錄,然后如下運行:
D:\RMISample\server>java -Djava.security.policy=policy.txt HelloServer
D:\RMISample\client>java -Djava.security.policy=policy.txt HelloClient



7. ? ? Java IDL/CORBA

? ?
Java IDL 的支持下,開發人員可以將 Java CORBA 集成在一起。 他們可創建 Java 對象并使之可在 CORBA ORB 中展開,或可創建 Java 類并作為和其它 ORB 一起展開的 CORBA 對象的客戶。后一種方法提供了另外一種途徑,通過它 Java 可以被用于將你的新的應用和 legacy 系統相集成。

8. ? ? Java Transaction Architecture (JTA)/Java Transaction Service (JTS)

? ?JTA
定義了一種標準的 API ,應用系統由此可存取各種事務監控。
? ?JTS
CORBA OTS 事務監控的基本的實現, JTS 規定了事務管理器的實現方式。該事務管理器是在高層支持 Java Transaction API (JTA) 規范,且在較底層實現 OMG OTS specification Java 映像。 JTS 事務管理器為應用服務器、資源管理器、獨立的應用及通信資源管理器提供了事務服務。

9. ? ? JavaMail and JavaBeans Activation Framework

? ?JavaMail
是用于存取郵件服務器的 API ,它提供了一套郵件服務器的抽象類。不僅支持 SMTP 服務器,也支持 IMAP 服務器。 JavaMail 利用 JavaBeans Activation Framework (JAF) 來處理 MIME- 編碼的郵件附件。 MIME 的字節流可被轉換成 Java 對象或轉換自 Java 對象。由此大多數應用都可不需要直接使用 JAF

10. ? ? Java Messaging Service (JMS)

? ?JMS
是用于和面向消息的中間件相互通信的應用程序接口 (API) 。它既支持點對點的域,有支持發布 / 訂閱 (publish/subscribe) 類型的域,且提供對下列類型的支持:經認可的消息傳遞、事務型消息的傳遞、一致性消息和具有持久性的訂閱者支持。 JMS 還提供另種方式來對您的應用與 legacy backend 系統相集成。

11. ? ? Extensible Markup Language (XML)

? ?XML
是一種可用來定義其它標記語言的語言,它被用來在不同的商務過程中共享數據。 XML 的發展和 Java 是相互獨立的,但它和 Java 具有的相同目標,即平臺獨立性。通過將 Java XML 的組合,可得到一個完美的具有平臺獨立性的解決方案。目前正有許多不同的公司在為 Java XML 的組合而努力。如果要了解更多的這方面的信息,可訪問 Sun Java-XML 頁面或 IBM developerWorks XML Zone

總結

? ?
本文介紹了建立在 J2EE 上的分布式應用結構,且描述了 WebLogic 服務器對 J2EE 的各種支持。 然而,我們所揭示的僅是冰山之一角而已,要以一篇數千字的文章來展示 J2EE 潛在的對您的企業級應用的影響可是很不公平的。
? ?
我們已經關注了在您開始 J2EE 進行工作時最有可能遇到的各類技術: JDBC JNDI EJB JSP servlet 。我們也為您提供了一些尚未常見的 J2EE 技術的背景知識。不管您是一名開發人員、商務應用分析師或項目經理,都應對 J2EE WebLogic 服務器所能提供給我們的企業級應用所帶來的意義有一個更好的認識。

?

參考: http://tayueerlai01.bokee.com/500929286.html

J2EE的13種核心技術


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91精品久久久久久久久久久 | 韩国三级bd高清中字木鱼天 | 青娱乐成人 | 成人黄色在线 | 一级香蕉免费毛片 | 污视频在线免费 | 精品欧美一区手机在线观看 | 精品免费国产一区二区三区四区 | 嫩草影院ncyy在线观看 | 天天摸天天操免费播放小视频 | 色综合天天综合网看在线影院 | 一区二区三区四区精品 | 99精品在线观看 | 亚洲国产伦理 | 成人午夜亚洲影视在线观看 | 国产免费叼嘿在线观看 | 99riav视频一区二区 | 香蕉视频免费网站 | 性欧美高清极品猛交 | 精品国产一区二区三区免费 | 一区二区三区回区在观看免费视频 | 中文字幕在线电影观看 | 青青草免费观看完整版高清 | 91九色porn偷拍在线 | 日本黄色免费片 | 久久精品国产99国产 | 奇米影视图片 | 午夜久久久久久久久久一区二区 | 蜜桃视频在线观看免费视频网站www | 日本黄页网址 | 成人久草 | 日本高清午夜色wwwσ | 毛片黄片| 日韩a在线看免费观看视频 五月天激情视频在线观看 成人97在线观看免费高清 | 欧美a在线 | 四虎影视在线看免费完整版 | 欧美日韩精品一区二区三区四区 | 亚洲综合精品香蕉久久网97 | 免费免费视频片在线观看 | 91视频链接| 亚洲天堂中文字幕 |