本文記錄了我在大學期間學習《Java EE》這門課程的大部分知識,對於沒接觸過Java EE的人來說,可以作為一個淺顯的入門,當然這篇部落格的內容畢竟只是冰山一角,如需深入學習方得結合其他資料。
Chapter 1
一.什麼是Java EE組件。
J2EE應用是由組件組成,J2EE組件是一個獨立的功能軟體單元(如獨立完成某個功能的JSP,JavaBean,servlet等類檔案均為一個組件),它與其他相關的類別和檔案被組裝到一個J2EE應用中(其他檔案包括如圖片資源、FLASH、CSS格式控制等),並且和其他組件進行通訊(如利用請求的指派forward,重新導向,Session,Cookies等技術進行通訊)。JavaEE組件使用java語言編寫,JavaEE組件和標準Java類的不同之處在於Java EE組件需要組裝到 JavaEE應用中,需要被驗證是否合乎格式並遵循JavaEE規範,並且會部署到生產環境,通過JavaEE伺服器來運行和管理。
二.列出JavaEE伺服器中所有的容器,並給出所有容器的定義。
JavaEE共提供了四種容器:
應用用戶端容器、小應用程式容器、Web容器、企業JavavBeans(EJB)容器。
①應用用戶端容器:管理應用用戶端組件的執行,應用用戶端和他們的容器運行於用戶端上。
②小應用程式容器:管理小應用程式的執行,由共同運行在用戶端的Web瀏覽器和Java外掛程式組成。
③Web容器:為JavaEE應用管理JSP頁面和servlet組件的執行,Web組件和它們的容器運行於Java EE伺服器上。
④企業JavaBeans(EJB)容器:為Java EE應用管理企業Bean的執行,企業Bean和它們的容器運行於Java EE伺服器上。
三.描述所有的JavaEE組件?
J2EE組件包括:
(1)運行在用戶端的組件:可以是一個Web瀏覽器、一個Applet,也可以是一個普通的用戶端Java 應用程式。
(2)運行在伺服器上的Web技術組件,主要包括:Java Servlet 和 JSP,JSF等。
(3)運行在伺服器上的EJB業務組件:Session Bean(會話 Bean),Entity Bean(實體 Bean)和 Message-Driven Bean(訊息驅動 Bean)。
四.什麼是JavaEE模組。
J2EE模組是由一個或多個針對相同容器類型的Java EE組件以及一個屬於該類型的組件部署描述符組成。例如,企業Bean模組部署描述符聲明了針對企業Bean的事務屬性和安全性授權方式。
五.列出所有JavaEE模組並給出它們的描述。
J2EE模組如下:(每一個模組都有一個副檔名為.xml配置描述符)
(1).EJB模組:
包含企業Bean的類檔案(用於處理邏輯業務,普通的java類)和一個EJB配置描述檔案,EJB模組被打包成副檔名為.jar的JAR檔案。
(2).Web模組:
包含Servlet類檔案、JSP檔案、支撐類檔案(如CSS格式控制)、圖形檔案(GIF或者JPG圖片)、HTML檔案和一個Web應用部署描述檔案。Web模組被打包成副檔名為.war的WAR(Web Archive File,Web應用檔案)檔案。
(3).應用程式用戶端模組:包含類檔案和一個應用程式用戶端配置描述檔案。應用程式用戶端模組被打包成副檔名為.jar的JAR檔案。
(4).資來源配接器模組:包含所有的Java介面、類、本地庫和其他文檔,以及資來源配接器配置描述檔案。它們共同實現了針對某個特定EIS的連接器體繫結構。資來源配接器模組被打包成副檔名為.jar的JAR檔案。
六.請畫出JavaEE應用的EAR檔案結構(Structure of Enterprise Archive file)。
Chapter 2
一.什麼是Servlet和JSP?
(1)Servlet組件是實現接受HTTP請求並能產生HTTP請求響應的功能模組,它實際上是一個Java類檔案。
(2)JSP組件是一種文字文件,它包含靜態元素(HTML,XML等)和JSP元素。在伺服器運行JSP組件時會被翻譯成Servlet再執行。
二.詳細說明Web用戶端與Web應用程式之間相互作用的步驟。
(1)用戶端發送一個HTTP請求到Web伺服器;
(2)實現了JavaServlet和JSP頁面技術的Web伺服器將請求轉換為HTTPServletRequest對象;
(3)伺服器把該對象傳遞給一個Web組件,Web組件可以與資料庫或JavaBeans
組件進行互動來聲稱動態內容,或者把請求對象傳遞給另一個Web組件;
(4)Web組件產生一個HTTPServletResponse對象,並由Web伺服器將該對象轉換成HTTP響應返回給用戶端。
三.什麼是Web組件?
Web組件既可以是Java Servlet,也可以是JSP頁面,或者是Web服務端點。
四.描述Web應用的生命週期?
建立、部署和執行Web應用的過程總結如下:
(1)開發Web組件代碼
(2)開發Web應用部署描述符
(3)編譯Web應用組件和組件所引用的助手類
(4)可選地將應用打包到某個可部署單元
(5)將應用部署到某個Web容器
(6)訪問引用Web應用的URL
五.給出文檔根和上下文根(document root and context root)的定義。並敘述它們的區別。
(1)文檔根的定義:Web模組的頂級目錄是應用程式的主目錄,主目錄是儲存JSP頁面,用戶端類和檔案以及靜態Web資源的地方。
(2)上下文根的定義:上下文根標識了JAVA EE伺服器中的某個Web應用。使用者在部署Web模組時需指定上下文根。上下文根必須以正斜杠(/)開始,以某個字串結束。
(3)區別:文檔根是用來標識文檔資源的,它可以方便使用者管理檔案。而上下文根是標識某個Web應用,它可以告訴伺服器去找那個應用。一個是管理硬碟中的文檔,一個管理網路中的應用。
六.畫出Web模組結構圖。
Chapter 3
一.什麼是過濾器?
過濾器(filter)是一種可以對請求或相應的前序和主體內容進行轉換的對象。過濾器與Web組件不同,因為過濾器通常本身並不負責建立響應。相反,過濾器提供可以“附加”到任何Web資源的功能。過濾器可以完成以下主要任務:
(1)查詢請求並進行相應的操作。
(2)阻塞請求-相應對,使其不能進一步被傳遞。
(3)修改其請求前序和資料。使用者可以通過提供一個自訂的請求版本來完成任務。
(4)修改響應前序和資料。使用者可以通過提供一個自訂的響應版本來完成該任務。
(5)和外部資源進行互動。
二.為了處理http服務, 在Java源碼中需要擴充哪個servlet類?
處理Http服務,在Java源碼中需擴充HttpServlet類並重寫其中的doGet()和doPost()方法來實現這個組件。
三.在Java源碼中怎樣定義過濾器?
(1)引用javax.servlet包實現其中的Filter介面。
(2)實現Filter介面需要重寫doFilter(Servlet Request req , Servlet Response res ,FilterChain chain)方法。
(3)在web.xml中指定過濾器映射。
四.詳細描述Servlet的生命週期?
Servlet的生命週期:Servlet載入—>執行個體化—>服務—>銷毀。
(1)Servlet載入階段:當出現下列幾種情況時Servlet容器裝載Servlet,
①Servlet容器啟動時自動裝載某些Servlet,實現它只需要在web.xml檔案中的<Servlet>與</Servlet>標籤之間添加代碼<loadon-startup>1</loadon-startup>;
②在Servlet容器啟動後,客戶首次向Servlet發送請求;
③Servlet類檔案被更新後,重新裝載Servlet。
(2)執行個體化階段:Servlet被裝載後,Servlet容器建立一個Servlet執行個體並且調用Servlet的init()方法進行初始化。在Servlet的整個生命週期內,init()方法僅執行一次。
(3)服務階段:調用service()方法,它是Servlet的核心,負責響應客戶請求。每當一個客戶請求一個HttpServlet對象時,該對象的service()方法就要被調用,並且傳遞給這個方法一個請求(ServletRequest)對象和一個響應(ServletResponse)對象作為參數。在HttpServlet中已存在service()方法,預設的服務功能是調用與Http要求方法相應的doGet或doPost方法來響應使用者。
(4)銷毀階段:當Web應用被終止,或Servlet容器終止運行,或Servlet容器重新裝載Servlet新執行個體時,Servlet容器會先調用Servlet的destroy()方法,該方法僅執行一次。在destroy()方法中可以釋放掉Servlet所佔用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。
五.在Java源碼中怎樣驅動過濾器鏈(Filter chain)?
兩個過濾器,EncodingFilter負責設定編碼,SecurityFilter負責控制許可權,伺服器會按照web.xml中過濾器定義的先後循序組裝成一條鏈,然後一次執行其中的doFilter()方法。
執行的代碼順序是:
(1).執行第一個過濾器EncodingFilter.doFilter()中chain.doFilter()之前的部分;request.setCharacterEncoding(encoding);
(2).執行第二個過濾器SecurityFilter.doFilter()中chain.doFilter()之前的部分:判斷使用者是否已登入。如果使用者已登入,則訪問請求的資源;如果使用者未登入,則頁面重新導向到:/failure.jsp。
(3).執行第二個過濾器SecurityFilter.doFilter()中chain.doFilter()之後的部分。
(4).執行第一個過濾器EncodingFilter.doFilter()中chain.doFilter()之後的部分:寫入已經完成的日誌,最後返迴響應。
Chapter 4
一.什麼是統一運算式語言?
統一運算式語言(統一EL)代表了JSP2.0提供的運算式語言(EL)和針對JSF(基於組件的Java Web應用程式框架模型)技術版本1.0所建立的運算式語言兩者之間的聯合,其主要功能有:
1.動態地讀取儲存在JavaBean組件中的不同資料結構和隱式對象的資料;
2.動態地將資料寫入到JavaBean組件中;
3.調用任意靜態和公有的方法;
4.動態執行算術運算。
二.列舉出JavaBean組件的屬性?
在JavaBean設計中,按照屬性的不同作用分為四類:簡單屬性(Simple Property)、索引屬性(Indexed Property)、關聯屬性(Bound Property)和限制屬性(Constrained Property)。
三.給出立即求值和延遲求值運算式的定義和文法?
(1)立即求值
定義:
指JSP引擎在頁面第一次被調用時就立即計算運算式並返回結果。
文法:
所有使用${expr}符號的運算式都是立即執行的;
只能用於Html模板資料中或者作為能夠使用運行時運算式的JSP標籤屬性值,例如:
<c:out value=”${sessionScope.username}”/>
(2)延遲求值
定義:
在頁面生命週期以後,通過底層技術的某種機制延遲計算運算式,直到生命週期的合適點出現。
文法:
延遲求值運算式的格式為#{expr};
可以在任何使用運算式技術定義的頁面生命週期的其他階段進行計算。例如:
<h:inputText id=”name” value=”#{customer.name}”/>
四.描述JavaBean的設計習慣?
JavaBean組件設計約定負責管理類的屬性以及管理提供對這些屬性訪問的公用方法。JavaBean組件可以是:
(1)讀/寫、唯讀、或者唯寫;
(2)簡單(Simple)特性,意味著它包含一個值,或者索引(indexed)特性,意味著它表示一個值數組。
特性並不一定必須由某個執行個體變數來實現,必須使用遵循以下規範的公用方法來訪問特性:
①對於每一種可讀的特性,bean必須具有以下形式的方法。
PropertyClass getProperty(){ … }
②對於每一種可寫的特性,bean必須具有以下形式的方法。
setProperty(PropertyClass pc){ … }
除了特性方法,JavaBean組件必須是一個public公用類,必須定義一個不帶任何參數的建構函式。另外,一本將屬性設定成private私人。