標籤:
1.1 Servlet
1.1.1 Servlet簡介
Servlet是運行在Web伺服器中的Java小程式。Servlet 3.0規範定義了ServletAPI的實現以及部署Servlet的方法。BES應用伺服器完全支援Servlet 3.0規範。
Servlet是BES應用伺服器中啟動並執行Java類,使用BES應用伺服器中啟動並執行Servlet可以執行以下操作:
1. 建立動態網頁,動態網頁可以使用HTML表單擷取終端使用者的輸入,並為此輸入提供響應。
2. 建立協作系統,例如線上會議。
3. 訪問各種API和功能,例如:
1) 會話跟蹤——允許網站跨多個網頁跟蹤使用者的進展情況。此功能支援諸如使用購物車的電子商務網站之類的網站。BES應用伺服器通過在伺服器關閉之前和在叢集伺服器間共用的會話之間提供容錯移轉,可以支援資料庫的會話持久性。
2) JDBC驅動程式——JDBC驅動程式提供了基本的資料庫訪問。通過BES應用伺服器的多層JDBC實現,可以利用串連緩衝池、伺服器端資料緩衝和事務。JDBC的使用請參看JDBC。
3) EJB——Servlet可使用EJB封裝會話、資料庫中的資料及其它功能。EJB的使用請參看EJB應用。
4) JMS——通過JMS,Servlet可以與其它Servlet和Java程式交換訊息。JMS的使用請參看JMS。
5) Java JDK API——Servlet可使用標準的Java JDK API。
6) 轉寄請求——Servlet可將請求轉寄到其它Servlet或資源。
4. 任何符合Servlet規範的Servlet都可輕鬆地部署到BES應用伺服器。
HTTP Servlet是特殊類型的Servlet,它通常以HTML頁的形式處理HTTP請求並提供HTTP響應。BES HTTP Servlet還可以訪問資料庫、EJB、JMS、HTTP會話和BES應用伺服器的其它工具。
1.1.2 編寫Servlet
Servlet API提供了javax.servlet.Servlet介面,所有的Servlet必須實現該介面。ServletAPI還給出了HTTP協議的Servlet實現——javax.servlet.http.HTTPServlet,可以通過繼承HTTPServlet類來編寫自己的Servlet,HTTPServlet可以讀取HTTP頭、編寫HTML編碼來將響應傳遞到瀏覽器用戶端。
Servlet 3.0規範可以使用註解@WebServlet來定義Servlet,使用註解@WebServlet標註的類必須繼承javax.servlet.http.HTTPServlet類。下面的程式碼片段定義了一個映射到URL模式為/SendMailServlet的Servlet:
importjavax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet("/SendMailServlet")
public class SendMailServlet extendsHttpServlet {
使用註解@WebServlet可以省掉在web.xml(web-fragment.xml)中配置Servlet。如果一個Servlet的實作類別被標註了註解@WebServlet,同時也在web.xml(web-fragment.xml)中配置了該Servlet,則web.xml(web-fragment.xml)中的配置優先。註解@WebServlet的常用配置屬性如下:
表1?1 註解@WebServlet的常用配置
屬性 |
用途 |
預設值 |
name |
指定Servlet的名稱 |
“” |
value |
指定請求Servlet的URL模式,等同於urlPatterns |
{} |
urlPatterns |
指定請求Servlet的URL模式 |
{} |
loadOnStartup |
指定Servlet是否在WEB容器啟動時初始化 |
-1 |
initParams |
指定Servlet的初始化參數 |
{} |
asyncSupported |
指定Servlet是否支援非同步模式 |
False |
例:
@WebServlet(name="SendMailServlet",
urlPatterns="/SendMailServlet",
loadOnStartup=3,
initParams ={
@WebInitParam(name="greeting",value="welcome"),
@WebInitParam(name="name",value="developer")},
asyncSupported=true)
2.1.2.1 初始化Servlet
通常,BES應用伺服器在對Servlet發出第一個請求時初始化Servlet,初始化Servlet時,BES應用伺服器會執行該Servlet的init()方法。在WEB應用中定義的參數會在初始化期間傳遞給Servlet,例如,在實現Servlet的類上的註解@WebServlet中定義兩個初始化參數:greeting(值為welcome)和name(值為developer):
@WebServlet(… …,
initParams={
@WebInitParam(name="greeting",value="welcome"),
@WebInitParam(name="name",value="developer")})
也可以將上面的初始化參數定義到WEB應用標準部署描述符web.xml(web-fragment.xml)中:
<servlet>
......
<init-param>
<param-name>greeting</param-name>
<param-value>welcome</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>developer</param-value>
</init-param>
</servlet>
Servlet的init()方法會執行BES應用伺服器載入Servlet時所需執行的一切初始化工作。預設init()方法會執行BES應用伺服器要求執行的所有初始化工作,可以通過重寫Servlet的init()方法來實現所需的初始化功能,比如初始化計數器、建立資料庫連接等。如果需要替換init(),請首先調用 super.init(),以便首先執行預設初始化操作。
2.1.2.2 處理請求、返迴響應
Servlet的主要功能是從WEB瀏覽器中接受HTTP請求,並返回HTTP響應。此項工作由Servlet的service()方法完成。service()方法包括用於接收來自用戶端資料的請求對象HttpServletRequest和用於建立輸出的響應對象HttpServletResponse。
來自WEB瀏覽器的HTTP請求除了包含URL之外,還可以包含表單資料、用戶端資訊、Cookies、會話和查詢參數的相關資訊,HTTPServlet可通過HttpServletRequest對象獲得請求中的這些資訊。
使用向用戶端提供響應的HttpServletResponse對象,可以設定能轉換為HTTP頭資訊的幾個Servlet特性,例如設定內容類型、字元編碼、是否緩衝等;也可以獲得輸出資料流,然後將響應內容以HTML格式寫入輸出資料流。
2.1.2.3 請求調度
Servlet可以將請求傳遞給另一個資源,如Servlet、JSP或HTML頁,此過程稱為請求調度。調度請求時,請使用RequestDispatcher介面的include()或forward()方法。通過使用RequestDispatcher,可以避免將HTTP重新導向響應發送回用戶端。RequestDispatcher會將HTTP請求傳遞到請求的資源。
要將請求調度到特定資源,請執行下列操作:
1. 擷取對ServletContext的引用:
ServletContext sc = getServletConfig().getServletContext();
2. 使用下列方法之一尋找RequestDispatcher對象:
RequestDispatcher rd = sc.getRequestDispatcher(String path);
該方法中,path是相對於WEB應用的根目錄。
RequestDispatcher rd = sc.getNamedDispatcher(String name);
該方法中的name是WEB應用標準部署描述符web.xml中使用<servlet-name>元素為Servlet指定的名稱。
RequestDispatcher rd = ServletRequest.getRequestDispatcher(String path);
此方法類似於ServletContext.getRequestDispatcher(String path)方法,只是它允許相對於當前Servlet的path。如果路徑以/字元開頭,則會將其解釋為相對於WEB應用。通過在getRequestDispatcher()方法中請求資源的相應URL,可以為WEB應用中的任何HTTP資源(包括HTTP Servlet、JSP頁或純HTML頁)擷取RequestDispatcher。使用返回的RequestDispatcher對象將請求轉寄到另一個Servlet。
3. 使用適當的方法轉寄或包含請求。轉寄、包含請求的用法分別為:
1) rd.forward(request,response);
2) rd.include(request,response);
1.1.3 配置Servlet
編寫好Servlet後,可以直接在類上標註註解@WebServlet來配置Servlet的名稱和訪問該Servlet的URL模式。註解@WebServlet的name屬性定義Servlet的名稱,urlPatterns屬性定義調用該Servlet的URL模式,initParams屬性定義Servlet的初始化參數:
@WebServlet(name="SendMailServlet",
urlPatterns="/SendMailServlet",
initParams={
@WebInitParam(name="greeting",value="welcome"),
@WebInitParam(name="name",value="developer")})
也可以在web.xml(web-fragment.xml)中為該Servlet配置訪問URL。<servlet>元素定義servlet的名稱、指定執行servlet的已編譯類,並使用init-param元素定義servlet的初始化特性。<servlet-mapping>元素定義調用此servlet的URL模式。舉例來說:
<!-- Servlet聲明,為Servlet類取一個應用範圍內唯一的名稱 -->
<servlet>
<servlet-name>MailServlet</servlet-name>
<servlet-class>
samples.javamail.servlet.SendMailServlet
</servlet-class>
<init-param>
<param-name>greeting</param-name>
<param-value>Welcome</param-value>
</init-param>
</servlet>
<!-- 為聲明的Servlet類配置URL,所有/mail請求都會交由MailServlet進行處理 -->
<servlet-mapping>
<servlet-name>MailServlet</servlet-name>
<url-pattern>/mail</url-pattern>
</servlet-mapping>
1.1.4 訪問Servlet
訪問或引用WEB應用中的Servlet時,URL按如下所示進行構造:
http://server:port/context-root/requestPath?requestParameters
表1?2 訪問WEB應用的URL構造元素說明
元素 |
說明 |
server:port |
為應用提供服務的主機名稱及監聽連接埠號碼。 |
context-root |
應用的訪問根路徑。 |
requestPath |
web.xml中為Servlet配置的URL格式。 |
requestParameters |
可選的HTTP請求參數名值對。 |
BESAppServer中Servlet3.0開發使用