一、內容簡介
? ?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
使用的更下層的協議。
【
? ?遠程方法調用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現大大簡化了分布異構環境中Java應用之間的通信。
? ?要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,并用一個專有的URL注冊。RMI客戶機在遠程RMI服務器上查找服務對象,并將它轉換成本地接口類型,然后像對待一個本地對象一樣使用它。
? ?下面是一個簡單的RMI實例,RMI客戶機通過RMI服務器提供的方法輸出一個語句。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現復雜應用時,我們需要做的也只是完善遠程對象的實現類而已。
1.遠程對象的本地接口聲明(RMIOperate.java)
? · 該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
java.rmi.Remote
接口。
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
; }
|
? 這個類應實現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; ? ?}}
|
? 該類創建遠程對象實現類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 程序的對象。 ?
? · RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。
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); } } } |
(2).生成客戶端存根和服務器框架
? ?D:\RMISample\server>rmiregistry
● 在服務器上執行HelloServer
?D:\RMISample\server>java HelloServer
?D:\RMISample\client>java HelloClient
? java HelloClient ?222.222.34.34
permission java.security.AllPermission "", "";
};
】
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
服務器所能提供給我們的企業級應用所帶來的意義有一個更好的認識。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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