什麼是J2EE

第一部分 J2EE簡述

J2EE: 電子商務和信息技術的快速發展以及對它們的需求給應用程序開發人員帶來了新的壓力。
必須以比以前更少的金錢、更少的資源來更快地設計、開發企業應用程序。爲了降低成本,並加快企業應用程序的設計和開發, J2EE 平臺提供了一個基於組件的方法,來設計、開發、裝配及部署企業應用程序。J2EE 平臺提供了多層的分佈式的應用模型、組件再用、一致化的安全模型以及靈活的事務控制。您不僅可以用比以前更快的速度向市場推出創造性的客戶解決方案,而且您的平臺獨立的、基於組件的J2EE 解決方案不會被束縛在任何一個廠商的產品和API 上。
1. J2EE 規範定義了以下種類的組件
• 應用客戶組件。
• Enterprise JavaBeans 組件。
• Servlet及JavaServer Pages(JSP 頁面)組件(也被稱作Web 組件)。
• Applet。
一個多層的分佈式的應用模型意味着應用邏輯被根據功能劃分成組件,並且可以在同一個
服務器或不同的服務器上安裝組成J2EE 應用的這些不同的組件。一個應用組件應被安裝在什麼
地方,取決於該應用組件屬於該多層的J2EE 環境中的哪一層。這些層是客戶層、We b層、業務
層及企業信息系統層( EIS )等。
(1) 客戶層
J2EE 應用可以是基於Web 的,也可以是不基於Web 的。在一個基於Web 的J2EE 應用中,用戶的瀏覽器在客戶層中運行,並從一個We b服務器下載Web 層中的靜態HTML 頁面或由J S P或Servlet 生成的動態HTML 頁面。在一個不基於Web 的J2EE 應用程序中,一個獨立客戶程序不運行在一個HTML 頁面中,而是運行在其他一些基於網絡的系統(比如手持設備或汽車電話)中,Applet 程序,在客戶層中運行,並在不經過Web 層的情況下訪問Enterprise Beans。這個不基於Web 的客戶層可能也包括一個JavaBeans 類來管理用戶輸入,並將該輸入發送到在企業層中運行的Enterprise Beans類來進行處理。根據J2EE 規範,JavaBeans 類不被視爲組件。爲J2EE 平臺編寫的JavaBeans 類有實例變量和用於訪問實例變量中的數據的“ get 和set 方法”。以這種方式使用的JavaBeans 類在設計和實現上通常都是簡單的,但是它們必須符合JavaBeans 規範中列出的命名和設計約定。
(2) Web 層
        J2EE Web 組件可以由JSP 頁面、基於Web 的A p p l e t以及顯示HTML 頁面的S e r v l e t組成。調用S e r v l e t或者JSP 頁面的HTML 頁面在應用程序組裝時與Web 組件打包在一起。就像客戶層一樣,Web 層可能包括一個JavaBeans 類來管理用戶輸入,並將輸入發送到在業務層中運行的Enterprise Beans 類來進行處理。運行在客戶層的Web 組件依賴容器來支持諸如客戶請求和響應及Enterprise Bean 查詢等。
(3) 業務層
        作爲解決或滿足某個特定業務領域(比如銀行、零售或金融業)需要的邏輯的業務代碼由運行在業務層的Enterprise Beans 來執行。一個Enterprise Bean 從客戶程序處接收數據,對數據進行處理(如果需要),再將數據發送到企業信息系統層存儲起來。一個Enterprise Beans 還從存儲中檢索數據,並將數據送回客戶程序。運行在業務層的Enterprise Beans 依賴於容器來爲諸如事務、生命期、狀態管理、多線程及資源存儲池等提供通常都非常複雜的系統級代碼。業務層經常被稱作Enterprise JavaBeans (EJB )層。業務層和Web 層一起構成了3 層J 2 E E應用的中間層,而其他兩層是客戶層和企業信息系統層。
(4) 企業信息系統層
企業信息系統層運行企業信息系統軟件,這層包括企業基礎設施系統,例如企業資源計劃(E R P)、大型機事務處理( mainframe transactionprocessing )、數據庫系統及其他遺留信息系統(legacy informationsystems )。J2EE 應用組件因爲某種原因( 例如訪問數據庫) 可能需要訪問企業信息系統。J2EE 平臺的未來版本將支持Connector 架構,該架構是將J2EE 平臺連接到企業信息系統上的一個標準A P I。
(5) 查詢服務
因爲一個J2EE 應用程序的組件是單獨運行的,並且往往在不同的設備上運行,因此,需要一種能讓客戶層和Web 層代碼查詢並引用其他代碼和資源的方法。客戶層和Web 層代碼使用Java 命名和目錄接口(JNDI )來查詢用戶定義的對象(例如Enterprise Beans )、環境條目(例如一個數據庫驅動器的位置)、企業信息系統層中用於查找資源的JDBC DataSource對象,以及消息連接。
(6) 安全和事務管理
諸如安全和事務管理這樣的應用行爲可以在部署時在Web 和Enterprise Beans 組件上進行配置。這個特徵將應用邏輯從可能隨裝配而變化的配置設定中分開了。J2EE 安全模型允許配置一個Web 或Enterprise Beans 組件,使系統資源只能由授權的用戶訪問。例如,一個Web 組件可以被配置成提示輸入用戶名和密碼。一個Enterprise Beans 組件可以被配置成只讓特定團體中的成員調用其某些方法。或者,一個Servlet 組件可以被配置成讓某個組織中的所有人都能訪問其某些方法,同時只讓該組織中的某些享有特權的人訪問其中一些方法。同樣是該Servlet 組件,可以針對另外一個環境而被配置成讓每個人都能訪問其所有方法,或者僅讓選定的少數人訪問其所有方法。
        J2EE 事務模型使得能夠在部署時定義構成一個單一事務的方法之間的關係,以使一個事務中的所有方法被處理成一個單一的單元。這是我們所希望的,因爲一個事務是一系列步驟,這些步驟要麼全部完成,要麼全部取消。例如,一個Enterprise Beans 可能有一組方法,使我們可以通過從第一個賬戶借出並存入第二個賬戶的方式而將錢從第一個賬戶轉移到第二個賬戶。我們希望全部的操作被作爲一個單元對待,這樣,如果在借出之後存入之前發生了故障,該借出操作被取消。事務屬性是在裝配期間定義在一個組件上的。這使得能將來自多個應用組件的方法歸到一個事務中,這說明,我們可以輕易變更一個J2EE 應用程序中的應用組件,並重新指定事務屬性,而不必改變代碼或重新編譯。在設計應用組件時,要記住,儘管Enterprise Beans 有一個可使應用組件的容器自動啓動多步事務的機制,但是Applet 和應用的客戶容器可能並不支持這一點。然而, Applet 和應用客戶容器總是能夠調用支持這一點的一個Enterprise Beans。還應當注意, JSP 頁面和Servlet 沒有被設計成是事務的,它們通常應當將事務工作交給一個Enterprise Bean 來完成。然而,如果事務工作在一個JSP 頁面或Servlet 中是必須的,那麼此種工作也應當是非常有限的。
(7) 可重用應用組件
J2EE 組件(Applet 、應用的客戶、Enterprise Beans 、JSP 頁面及Servlet )都被打包成模塊,並以Java Archive (JAR )文件的形式交付。一個模塊由相關的組件、相關的文件及描述如何配置組件的配置描述文件組成。例如,在組裝過程中,一個HTML 頁面和Servlet 被打包進一個模塊之中,該模塊包含H T M L文件、Servlet 組件及相關的配置描述文件,並以一個Web Archive(WAR )文件的形式交付,該WAR 文件是一個帶.war 擴展名的標準JAR 文件。模塊的使用使得利用相同組件中的某些組件來組裝不同的J2EE 應用程序成爲可能。例如,一個J2EE 應用程序的Web 版可能有一個Enterprise Beans 組件,還有一個JSP 頁面組件。該Enterprise Beans 組件可以與一個應用客戶組件結合,以生成該應用程序的非Web 版本。這不需要進行額外的編碼,只是一個裝配和部署的問題。並且,可重用組件使得將應用開發和部署過程劃分成由不同的角色來完成成爲可能,這樣,不同的人或者公司就能完成封裝和部署過程的不同部分。
2. J2EE 平臺定義瞭如下角色:
(1) J2EE 產品提供商
設計並使J2EE 平臺、API 和在J2EE 規範中定義的其他特徵能被其他公司或人購得的公司。
(2) 應用組件提供商
創建用於J2EE 應用程序的Web 組件、Enterprise Beans 組件、Applet 或應用客戶程序的公司或個人。在裝配過程中,應用組件文件、接口及類被打包進一個JAR 文件中。
(3) 應用程序裝配商
從組件提供商獲得應用組件JAR 文件,並將它們組裝成一個J2EE 應用的Enterprise Archive(E A R)文件的公司或個人,這種文件是一個帶. E a r擴展名的標準文件。應用裝配商提供與該應用程序相關的整體信息,並使用驗證工具來檢驗EAR 文件的內容是正確的。組裝和部署信息存儲在一個基於文本的配置描述文件中,此種文件使用XML 標記來標記該文本。應用裝配商可以使用一個能通過交互式選擇來正確添加XML 標記的裝配和配置工具來編輯該配置描述文件。
(4) 部署商
部署( d e p l e y)J2EE 應用程序的公司或個人。其職責包括設定事務控制、安全屬性,並根據應用組件提供商提供的指示來標明一個Enterprise Bean 是自己處理自身的存儲,還是由一個容器來處理等。部署涉及配置和安裝。在配置過程中,部署商遵循應用組件提供商提供的指示來解決外部依賴問題,定義安全設定,以及分配事務屬性。在安裝過程中,部署商將應用組件安裝到服務器上,並生成容器特定的類和接口。
(5) 系統管理員
配置並管理運行J2EE 應用程序的計算環境和網絡基礎設施,並監督運行環境的人員。
(6) 工具提供商
          生產被組件提供商、裝配商及部署商使用的用於進行開發、組裝和打包的工具的公司或個人。
(7) 設計用戶界面和引擎
       在爲J2EE 應用程序設計用戶界面和後端引擎時,需要決定讓該程序是基於We b,還是不基於We b。在做出這個決定時,我們可能希望考慮平臺配置、下載速度、安全、網絡流量和網絡服務。
例如,包含有用戶界面並且經常被大量用戶訪問的一個Applet 可能需要花很長的時間才能被下載下來,這讓用戶沮喪。然而,如果知道該A p p l e t要運行在一個公司的內部網內的受控環境中,那麼,在這種情況下,該Applet 將擁有一個完全可接受的下載速度。另一個考慮是,繁重的處理應當在哪裏執行。例如,如果客戶程序在一個蜂窩電話或呼機中執行,服務器應當完成儘量多的計算和數據處理,而客戶程序只應顯示結果就可以了。然而,設計在一個強大的臺式機平臺上運行的大型財務分析系統則應當在客戶機上完成其複雜計算。應用的客戶程序和A p p l e t用戶界面通常都是用Swing API 創建的,該API 可從標準版J a v a 2平臺中獲得。Swing API 提供了一整套GUI 組件(表格、樹形結構、按鈕等),這些組件可以被用來實現一種比用一個典型的HTML 頁面所能實現的更爲交互的體驗。Swing 也支持HTML 文本組件,這個組件可以被用來顯示來自一個服務器的響應。客戶程序可以直接訪問Enterprise Beans 層或企業信息系統層。但應謹慎實現這種程序。
        繞過EJB 層的程序可以使用JDBC API 來訪問一個關係型數據庫,但應被限制於對數據庫表格進行維護等管理任務上。


J2EE問答



一、準備篇

1 什麼是J2EE?它和普通的Java有什麼不同?
答:J2EE全稱爲Java2 Platform Enterprise Edition。
“J2EE平臺本質上是一個分佈式的服務器應用程序設計環境——一個Java環境,它提供了:
·宿主應用的一個運行基礎框架環境。
·一套用來創建應用的Java擴展API。”(引自《J2EE服務器端高級編程》)

2 J2EE好學嗎?
答:J2EE是很多技術的集合體,並且還在成長中。
你會遇到很多專有名詞:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web Service……。
尤其是XML和Web Service正在快速成長。幸運的是,你不需要等到學會所有技術後再開始編程。
大體上J2EE可以分成3個主要應用:Servlet/JSP,EJB,XML/Web Service 和一些支撐技術例如JDBC和JNDI。
你可以一個一個的學。

什麼是J2EE. 爲什麼需要J2EE.
3 J2EE有什麼用?
答:J2EE用來建設大型的分佈式企業級應用程序。或者用更時髦的名詞說就是“電子商務”應用程序。
這些企業可能大到擁有中心數據庫服務器,Web服務器集羣和遍佈全國的辦公終端,也可能小到只不過想做一個網站。

4 學J2EE有前途嗎?
答:在這一市場目前只有一種技術可以和J2EE競爭,那就是Microsoft的.NET。
相對來說.NET要“新”一些而J2EE要“老”一些。
但是.NET只能用於Windows平臺(Microsoft聲稱要開發C#在Linux上的虛擬機但是尚未兌現該諾言),
考慮到Linux的發展勢頭,你可以相信.NET不會一統天下。

5 據說J2EE的性能不如.NET好,是真的嗎?
答:在Sun公司提供的樣例程序Pet Store上,Microsoft聲稱不如相同的.NET程序好。
而Sun公司反駁說這一程序不能真正體現J2EE的性能,並且指責Microsoft在數據庫上做了優化。
作者沒有學習過.NET因而不能妄下斷言。
無論如何,大型分佈式程序中的性能瓶頸通常首先來自於錯誤的設計。

6 聽你說了這麼多,我想學着玩玩J2EE。
答:除非你想靠它當飯吃或者作爲技術儲備,否則請不要浪費你的時間。
Flash要好玩得多。計算機遊戲就更加好玩了。

7 學習J2EE該怎麼開始?
答:首先,下載一個J2EE服務器。其次,去java.sun.com下載J2EE的API。第三,找一本好的參考書。最後,找一個順手的IDE。
J2EE服務器。你可以用Sun的J2EE SDK(免費),或者Weblogic(性能最好,但是太大,而且作者不推薦盜版行爲),或者Jboss(免費,就是文檔太少),或者Jrun(開發版免費,作者用這個)。參考書作者感覺Wrox的《J2EE服務器端高級編程》不錯,但是太老(作者手頭的是2001年中文版)。你還需要去下載一些最新的技術資料(當然肯定是英文的)。
IDE如果你的機器配置夠好(內存至少512M以上,256M或以下請勿考慮),可以用IBM的WSAD,不然就繼續用Eclipse或者其他。
你也可以經常去水木清華的Java版逛逛,但是在發貼前先看看精華區裏有沒有你要的答案。

8 我下了一個J2EE服務器但是不會配置。
答:請認真閱讀隨機指導文檔,不同的服務器的配置都不一樣,作者愛莫能助。

9 我發現你沒有提到Tomcat。
答:Tomcat只是一個Web服務器,更準確地說主要只是一個Web Container。
如果你想要學習EJB的話,Tomcat無法滿足你的需要。

二、 Servlet/JSP篇

10 什麼是Servlet?
答:一個Servlet是一個Java類。它處理Http(s)請求並作出響應,包括返回一個HTML頁面或轉交給其他URL處理。
Servlet必須運行在一個Web Container例如Tomcat中。
Servlet必須是javax.servlet.http.HttpServlet的子類,
你可以繼承doGet()或者doPost()方法,兩者分別對應於Http(s)中的Get請求和Post請求。

11 我怎麼獲得Http請求裏的參數?
答:HttpRequest的getParameter()方法。例如:String paramValue = request.getParameter("paramName");

12 我怎麼返回結果?
答:你可以利用相關API打開一個輸出流,並向流中直接寫入一個HTML頁面。
但是作者完全不贊成這樣做。一方面這樣做會很羅嗦。
另一方面從Model-View-Controller模式(在《J2EE核心模式》中被歸爲Front Controller模式)的觀點來看,
你應當提供一些HTML或者JSP作爲視圖(view),而Servlet則根據請求參數決定轉到哪一個視圖。
你可以利用response.sendRedirect(…)方法或request.getDispatcher(…).forward()方法來實現。

13 sendRedirect()和forward()有什麼不同?
答:sendRedirect()是向瀏覽器發送一個redirect通知,瀏覽器重定向到新的URL。
而forward是在服務器端直接轉到新的URL,對於瀏覽器是透明的。
前者瀏覽器的地址欄顯示的是新的URL,後者瀏覽器的地址欄顯示的是Servlet的URL。
因而當目標URL會自動刷新時,兩者會造成一些差別。

14 我寫了一個Servlet程序,怎麼運行它?
答:開發J2EE程序有一個部署(deploy)的概念,實際上是開發——部署——運行的三部曲。
大多數服務器支持Hot deploy。你只需要在相應的Application目錄(具體路徑依賴於服務器)下面
建立一個符合WAR或EAR格式(參見16,17)的目錄,啓動服務器,就可以通過瀏覽器訪問了。
特別的,你的Servlet的class文件應當放在/WEB-INF/classes目錄中。
注意J2EE SDK不支持Hot deploy,你需要通過它的deploy tool來部署。
Tomcat只支持WAR格式。

15 EAR和WAR有什麼不同?
答:EAR是一個完整的J2EE應用程序,包括Web部分和EJB部分。
WAR只是其中的Web部分。

16 EAR格式是怎樣的?
答:一個EAR可以包含任意多個WAR或EJB JAR,並且包含一個META-INF的目錄。
在/META-INF中包含了一個application.xml,其中描述了這個EAR包含哪些模塊,以及安全性配置。
細節請看參考書。

17 WAR格式是怎樣的?
答:一個WAR包含一個WEB-INF的目錄,這個目錄下包含classes目錄,lib目錄和web.xml。
/WEB-INF/classes存放按package組織的class文件,/WEB-INF/lib目錄存放jar文件,
web.xml描述了很多東西,請讀參考書。

18 我的普通HTML文件應當放在哪裏?
答:放在除了/WEB-INF以外的其他地方。

19 我訪問不到servlet,甚至連HTML文件都訪問不到!
答:第一你沒啓動服務器。第二你敲錯了端口。第三你沒有正確配置context-path。
第四你的服務器不支持auto reload或者你關閉了這一選項,你得重啓服務器。
第五確認你沒有把HTML放在/WEB-INF目錄下,那是訪問不到的。

20 我能訪問HTML但是訪問不到servlet。
答:請檢查你的web.xml文件。確保你正確定義了<servlet>和<servlet-mapping>元素。
前者標識了一個servlet,後者將一個相對於context-path的URL映射到一個servlet。
在Tomcat中你可以通過/context-path/servlet/package/servletname的形式訪問servlet,
但是這只是Tomcat的便捷訪問方式,並不是正式規範。
細節請看參考書。

21 什麼是JSP?它和Servlet有什麼區別?
答:你可以將JSP當做一個可擴充的HTML來對待。
雖然在本質上JSP文件會被服務器自動翻譯爲相應的Servlet來執行。
可以說Servlet是面向Java程序員而JSP是面向HTML程序員的,除此之外兩者功能完全等價。

22 我的JSP顯示的漢字是亂碼。
答:在你的JSP開頭加上一行 <%@ page contentType="text/html; charset=gb2312"%>
如果你已經聲明瞭page我想你知道該怎麼修改。

23 JSP文件存放在哪裏?
答:除了/WEB-INF下的任何地方。

24 在JSP裏面怎麼引用Java Bean。
答:首先,確認你要引用的類在/WEB-INF/classes下或在/WEB-INF/lib的某個jar內。
其次,在JSP里加一行 <jsp:useBean id="…" scope="…" class="…"/>
具體解釋請看參考書。

25 我想在servlet間傳遞數據。
答:利用session。在Servlet/JSP中,你可以在4個地方保存數據。
1) page,本頁面。
2) session,用來存放客戶相關的信息,比如購物車,對應接口爲javax.servlet.http.HttpSession。
Session機制實際上是cookie和URL Rewrite的抽象,服務器會自動使用cookie或URL Rewrite來實現。
3) request,可以在forward()時傳遞信息,對應接口爲javax.servlet.http.HttpRequest。
4) application,或稱context,存放全局信息,對應接口爲javax.servlet.ServletContext。

26 怎麼調用cookie?
答:作者建議使用session,你總是會遇到某些禁用cookie的用戶。這時session會自動使用URL重寫來實現。

27 怎麼在JSP裏面實現文件下載?
答:實際上這是一個HTML的問題。答案是一個超鏈接<a>。

28 怎麼實現文件上傳?
答:客戶端是HTML問題,在form中設置method爲post,enctype爲multi-part/form-data,加一個<input type="file">。
而在接收的servlet中只是一個I/O問題。

29 我想讓頁面自動刷新,比如聊天室。
答:這是一個HTML問題,在<head>部分中加一條<meta http-equiv="refresh" content="5" url="…">。
這是所謂的Clinet-push,客戶端刷新技術。

30 我想讓用戶登錄以後才能訪問頁面。
答:使用聲明式安全措施。
你只需要在web.xml中定義安全角色(Role),並定義受保護的URL集合只能由特定Role訪問。
大多數服務器支持基於數據庫的用戶映射,你只要在相應數據庫中建立兩張表並配置服務器就可以了。
注意J2EE SDK不支持基於數據庫的用戶映射。
細節請看參考書和服務器文檔。

31 我想要能註冊用戶。
答:參看30。在接受註冊請求的Servlet中執行寫入數據庫操作即可。

32 怎麼在JSP中訪問數據庫?
答:標準做法是使用DAO模式,定義一個Java bean來訪問數據庫並在JSP中使用。
然而,當你的數據庫模式很簡單時,你可以使用JSTL中的<sql:query>標籤來快速訪問。

33 什麼是JSTL?
答:JSTL是Jsp Standard Tag Library的縮寫。這是一組通用標籤並將成爲JSP 2.0的一部分。
其中包含賦值<c:set>,分支<c:if>,循環<c:forEach>,查詢數據庫<sql:query>,更新數據庫<sql:update>
等。目前你需要像添加自定義標籤庫一樣來添加JSTL,但是可以預計JSP 2.0會將JSTL作爲組成部分。
標籤庫可以在 http://jakarta.apache.org  下載。注意JSTL需要在支持JSP1.2或更高版本的容器下運行。幫助文件可以閱讀sun的JSTL正式規範。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章