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應用服務器的其它工具。
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(),以便首先執行默認初始化操作。
Servlet的主要功能是從WEB瀏覽器中接受HTTP請求,並返回HTTP響應。此項工作由Servlet的service()方法完成。service()方法包括用於接收來自客戶端數據的請求對象HttpServletRequest和用於創建輸出的響應對象HttpServletResponse。
來自WEB瀏覽器的HTTP請求除了包含URL之外,還可以包含表單數據、客戶端信息、Cookies、會話和查詢參數的相關信息,HTTPServlet可通過HttpServletRequest對象獲得請求中的這些信息。
使用向客戶端提供響應的HttpServletResponse對象,可以設置能轉換爲HTTP頭信息的幾個Servlet特性,例如設置內容類型、字符編碼、是否緩存等;也可以獲得輸出流,然後將響應內容以HTML格式寫入輸出流。
Servlet可以將請求傳遞給另一個資源,如Servlet、JSP或HTML頁,此過程稱爲請求調度。調度請求時,請使用RequestDispatcher接口的include()或forward()方法。通過使用RequestDispatcher,可以避免將HTTP重定向響應發送回客戶端。RequestDispatcher會將HTTP請求傳遞到請求的資源。
ServletContext sc = getServletConfig().getServletContext();
2. 使用下列方法之一查找RequestDispatcher對象:
RequestDispatcher rd = sc.getRequestDispatcher(String path);
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);
編寫好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請求參數名值對。 |