Java EE

Java EE

主要技術


JDBCJava Database Connectivity)提供連接各種關係資料庫的統一介面,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC為工具/資料庫開發人員提供了一個標準的API,據此可以構建更高級的工具和介面,使資料庫開發人員能夠用純Java API 編寫資料庫應用程序,同時,JDBC也是個商標名。
EJB(Enterprise JavaBeans)使得開發者方便地創建、部署和管理跨平台的基於組件的企業應用。
Java RMI(Java Remote Method Invocation)用來開發分散式Java應用程序。一個Java對象的方法能被遠程Java虛擬機調用。這樣,遠程方法調用可以發生在對等的兩端,也可以發生在客戶端和伺服器之間,只要雙方的應用程序都是用Java寫的。
JNDI(Java Naming and Directory Interface)提供從Java平台到的統一的無縫的連接。這個介面屏蔽了企業網路所使用的各種命名和目錄服務。
JMAPI(Java Management API)為異構網路上系統、網路和服務管理的開發提供一整套豐富的對象和方法。
JMS(Java Message Service)提供企業消息服務,如可靠的消息隊列、發布和訂閱通信、以及有關推拉(Push/Pull)技術的各個方面。
JTS(Java transaction Service)提供存取事務處理資源的開放標準,這些事務處理資源包括事務處理應用程序、事務處理管理及監控。
JMF(Java Media Framework API),它可以幫助開發者把音頻、視頻和其他一些基於時間的媒體放到Java應用程序或applet小程序中去,為多媒體開發者提供了捕捉、回放、編解碼等工具,是一個彈性的、跨平台的多媒體解決方案。
Annotation(Java Annotation),在已經發布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一種機制,將程序的元素如:類,方法,屬性,參數,本地變數,包和元數據聯繫起來。這樣編譯器可以將元數據存儲在Class文件中。這樣虛擬機和其它對象可以根據這些元數據來決定如何使用這些程序元素或改變它們的行為。
JavaBeans,它是一個開放的標準的組件體系結構,它獨立於平台,但使用Java語言。一個JavaBean是一個滿足JavaBeans規範的Java類,通常定義了一個現實世界的事物或概念。一個JavaBean的主要特徵包括屬性、方法和事件。通常,在一個支持JavaBeans規範的開發環境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可視地操作JavaBean,也可以使用JavaBean構造出新的JavaBean。JavaBean的優勢還在於Java帶來的可移植性。現在,EJB (Enterprise JavaBeans) 將JavaBean概念擴展到Java服務端組件體系結構,這個模型支持多層的分散式對象應用。除了JavaBeans,典型的組件體系結構還有DCOM和CORBA
javaFX,Sun剛剛發布了JavaFX技術的正式版,它使您能利用 JavaFX 編程語言開發富網際網路應用程序(RIA)。JavaFX Script編程語言(以下稱為JavaFX)是Sun微系統公司開發的一種declarative, staticallytyped(聲明性的、靜態類型)腳本語言。JavaFX技術有著良好的前景,包括可以直接調用Java API的能力。因為 JavaFXScript是靜態類型,它同樣具有結構化代碼、重用性和封裝性,如包、類、繼承和單獨編譯和發布單元,這些特性使得使用Java技術創建和管理大型程序變為可能。
JMX(Java Management Extensions,即Java管理擴展)是一個為應用程序、設備、系統等植入。
管理功能的框架。JMX可以跨越一系列異構操作系統平台、系統體系結構和網路傳輸協議,靈活的開發無縫集成的系統、網路和服務管理應用。
JPA(JavaPersistence API),JPA通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到資料庫中。

核心特徵


Bean Validation是Java EE 6數據驗證新框架,Validation API並不依賴特定的應用層或是編程模型,這樣同一套驗證可由應用的所有層共享。它還提供了通過擴展Validation API來增加客戶化驗證約束的機制以及查詢約束元數據倉庫的手段。
在Java EE 6的Bean Validation出現之前,開發者不得不在表示層框架、業務層以及持久層中編寫驗證規則以保證這些規則的同步性,但這麼做非常浪費時間而且極易出錯。Bean Validation是通過約束實現的,這些約束以註解的形式出現,註解可以放在JavaBean(如backing bean)的屬性、方法或是類上面。約束既可以是內建的註解(位於javax.validation.constraints包下面),也可以由用戶定義。一些常用的內建註解列舉如下:
◆Min:被@Min所註解的元素必須是個數字,其值要大於或等於給定的最小值。
◆Max:被@Max所註解的元素必須是個數字,其值要小於或等於給定的最大值。
◆Size:@Size表示被註解的元素必須位於給定的最小值和最大值之間。支持Size驗證的數據類型有String、Collection(計算集合的大小)、Map以及數組。
◆NotNull:@NotNull確保被註解的元素不能為null。
◆Null:@Null確保被註解的元素一定為null。
Pattern:@Pattern確保被註解的元素(String)一定會匹配給定的Java正則表達式。
代碼中通過Bean Validation註解聲明了一些約束:
public class Address {
@NotNull @Size(max=30)
private String addressline1;
@Size(max=30)
private String addressline2;
public String getAddressline1() {
return addressline1;
}
public void setAddressline1(String addressline1) {
this.addressline1 = addressline1;
}
}
@NotNull指定被註解的元素addressline1不能為null;@Size指定被註解的元素addressline1和addressline2不能超過給定的最大值,即30個字元。
在驗證Address對象時,addressline1的值被傳遞到針對@NotNull約束的驗證類以及針對@Size約束的驗證類中,而addressline2的值被傳遞到針對@Size約束的驗證類中,由相關的驗證類進行驗證。如下代碼自定義了一個名為ZipCode的約束:
@Size(min=5, max=5)
@ConstraintValidator(ZipcodeValidator.class)
@Documented @Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface ZipCode {
String message() default "Wrong zipcode";
String[] groups() default {};
}
可以將@ZipCode用在類、屬性或是方法上,就像其他約束一樣。
public class Address {
@ZipCode
private String zipCode;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
Validation API
開發者可以藉助於Validation API以編程的方式驗證JavaBean。Bean Validation API的默認包是javax.validation。下面對該包中的一些類進行說明:
ConstraintValidator:這是一個介面,具體的約束驗證類需要實現該介面。該介面定義了相關的邏輯以驗證給定對象類型中的約束。
Validator:Valida介面持有對象驗證圖的契約。該介面的實現必須是線程安全的。
ConstraintViolation:ConstraintViolation介面表示給定bean上的約束驗證失敗,它公開了約束違背上下文以及描述該違背情況的信息。
ValidationException:如果在驗證過程中出現了某些不可恢復的錯誤就會拋出ValidationException異常。某些情況下可以指定該異常,如不合法的分組(group)定義、不合法的約束定義以及不合法的約束聲明等等。
約束元數據請求API
Bean Validation規範提供了查詢約束倉庫的手段。該API主要用於工具支持和與其他框架、庫以及JSR的集成。Bean Validation規範旨在為對象約束提供一個驗證引擎和元數據倉庫。需要進行約束定義、驗證和元數據的框架(Java EE或Java SE)可以利用Bean Validation規範完成這些功能,從應用或是基礎設施的角度來看,這麼做可以避免不必要的重複工作。
Bean Validation已經集成到了JSF 2.0和JPA 2.0中。在JSF中可以將表單輸入域與域對象的屬性綁定起來。JSF 2和Bean Validation可以判斷出綁定的是哪個屬性並執行與之相關的驗證,還會將約束違背的信息顯示給用戶。Hibernate Validator 4是Bean Validation規範的參考實現框架,其最新版增加了不少新特性,如分組驗證、與JPA 2和JSF 2的自然集成以及擴展的註解集等等。

核心優勢


J2EE容易讓初學者誤解是獨立於一套Java的技術方案。
從更深層次來看,Java誕生十年,多年前的業務組件還可以使用,軟體應用不再由於語言的更迭革命帶來毀滅的打擊了。

功能規定


架構圖
讓我們看看Java EE 5有哪些新的功能或規定,我們可以從SUN網站下載Java EE 5規範。其架構圖如下:
JAVA EE 架構圖圖中灰色加黑部分是Java EE 5新的功能,我們看到,在WEB層主要加入了JSF這個新的表現層框架,和我們日常開發關係密切的是,引入了新的Java Persistence標準,這個標準正在由EJB 3.0專家組制定。
值得指出的是,這個Java持久化標準也可以嵌入在WEB層調用,所以,它肯定不會從屬於EJB標準,這樣,當前所有的Java持久層標準如:JDBC/JDO/Hibernate/Entity Bean將可能統一,減少用戶的架構選擇 痛苦。
摺疊EJB3.0和EJB2.0的區別
從架構圖可以看出,無論Web結構或EJB結構,提供實現的功能相差不多,這樣,我們的業務核心組件就可以根據需要部署在Web或EJB中運行,而不依賴具體的Java EE容器了。前面一章圖的目標在Java EE 5中可以實現了。
當然,Java EE 5重要改變還是:Java EE不再象以前那樣只注重大型商業系統的開發,而是更關注小到中型系統的開發,簡化這部分系統開發步驟。
落實這一簡化行動的最大特徵是在Java 5.0(Java 1.5)中加入Annotations,通過Annotations引入,降低Java EE開發時,既要寫code,又要寫XML配置文件之苦,來回照顧,疲於奔命,Annotations既是得益於C++語言,也是從開源項目xDoclet實踐中獲得經驗。
但是Annotations是一把雙刃劍,初學者用得不好,將會使得原本在XML中的Hard code(硬編碼)寫進入代碼Annotations,破壞代碼的簡潔和靈活性,
當然,Annotations的引入不只是解決XML配置,從大的概念說,是解決一個資源注射問題(XML屬於其中一個資源),在原理J2EE中,容器管理的資源都是由JNDI嚮應用程序提供的,通過Annotations可以方便實現注射。
資源注射(Resource injection)設計概念其實是來自Ioc模式(Dependency Injection ),筆者設計開發的Jdon框架其實已經將Annotations這一宗旨的目的實現,在Jdon框架應用演示源碼SimpleJdonFrameworkTest中,在jdonframework.xml中有一段如下配置:
這段配置是將資料庫的JNDI名java:/TestDS注射到JdbcDAO中。Jdon Framework下一個版本將是基於Java 5.0,這行配置 將可通過 Annotations寫在jdbcDAO代碼中,方便程序員開發。
從這裡,大家也可以知道EJB 3.0和EJB 2.0的區別了,有的人疑惑,是學習EJB 3.0還是學習EJB 2.0,其實EJB 3.0並沒有在原理機制上對EJB有多大改動,只是做了編程方面的簡化,另外EJB CMP參考了Hibernate新特點,EJB 3.0最大簡化變動是CMP編程方法上。所以,無論學習EJb 3.0/2.0,EJB原理和運行機制都是一樣,這部分才是學習EJB最大的困難處,而不是因為到了EJB 3.0,理解EJB就會容易。
初學者可從Eclipse+Xdoclet開發EJB 2.0開始學習, EJB 3.0 = EJB 2.0 + xDoclet,這裡有一篇Eclipse開發EJB教程,使用JBossIDE非常簡單,無需Lomboz等插件。
Security安全
Security安全是Java EE的一個重要特點,也就是基於容器的安全訪問,無需自己手工編碼,具體實現可參考Jdon框架應用演示源碼JdonNews。這雖然是基於J2EE 1.3編寫,但是和Java EE 5區別不是很大。
事務管理Transaction Management也是Java EE 5的一個重要部分,該標準文檔從幾個方面闡述了事務管理的要點,標準中規定了在WEB層中使用事務和線程的處理關係,標準中規定:Web伺服器Tomcat無需在Web層提供事務支持,因為Web組件根本不支持事務繁衍/傳遞。
因為當前一些架構如 Struts+Spring+Hibernate/Struts+Hibernate是標準中的Web結構,因此Java EE 5在J2EE 4.2.2規定了 Web組件事務的生命周期,如果Web組件直接調用JTA,事務就不可以跨一個客戶端的多個請求,事務只能在一個請求(Servlet/Jsp)中完成,這個標準規定了我們在Web架構中(如上述架構)無法使用長事務(如工作流/狀態圖中跨頁面請求事務),針對一個客戶端跨請求的事務暫時只有唯一解決方案:只有使用EJB的有態Session。
以上是Java EE 5主要部分,Java EE包含更多其他技術部分如Jdbc JMS JCA JNDI 等等,需要用戶在實踐中摸索。