介紹使用 Tomcat 對 JavaServer Pages (JSP)、servlet 和 Web 服務進行編程,Tomcat 是來自 Apache Foundation 的開源應用服務器。本教程引導您完成以下任務:
- 下載和安裝您自己的 Tomcat 服務器。
- 在 Tomcat 上編碼和部署 JSP。
- 在 Tomcat 上編碼和部署 servlet。
- 使用 Tomcat 和 Apache Axis 編碼和部署 Web 服務。
本教程概述 JSP、servlet 和 Web 服務,但不會深入討論這些技術。
必要條件
要最大限度地利用本教程,您需要熟悉 Java 編程語言、面向對象設計原理和基本 TCP/IP 網絡概念。最好理解 JDK 中的網絡 API,但並非必須如此。
要運行本教程中的示例,需要:
- 有效的 JDK 1.5.0 或更高版本的安裝程序。
- 有效的 Tomcat 5.5 或更高版本的安裝程序,可從 http://jakarta.apache.org/tomcat/ 獲得。本教程包含詳細的 Tomcat 下載、安裝和設置說明。
要運行 Web 服務示例,還需要安裝:
- Apache Ant 1.5.2 或更高版本,可從 http://ant.apache.org/ 獲得
- Apache Axis 1.2.1 或更高版本,可從 http://ws.apache.org/axis/ 獲得。本教程包含詳細的 Axis 安裝說明。
運行本教程推薦的系統配置:
- 支持 JDK 1.5.0 且內存至少為 512MB 的系統。本教程中的說明基於運行 Microsoft Windows 的系統。
- 安裝軟件和示例至少需要 50MB 的磁盤空間。
Tomcat 是什么?
Tomcat 是來自 Apache Software Foundation 的開源服務器。它是一個 Web 應用服務器,這說明它支持 JavaServer Pages (JSP) 和 servlet 進行編程。
自 2000 年初期,Tomcat 一直擔當着最新的 Java Servlet 和 JSP 規范的參考實現。Tomcat 5.5 是編寫本教程時的最新版本,支持最新的 Java Servlet 2.4 和 JavaServer Pages 2.0 標准(參見 參考資料)。Tomcat 還包括一個受限的 Web 服務器,該服務器以獨立模式(默認情況下)執行時能服務於靜態網頁。
由於有多種開源庫和擴展,因此 Tomcat 支持:
- 使用 Apache Axis servlet 的 Web 服務
- 開發框架,如 Apache Struts
- 模板引擎,如 Apache Jakarta Velocity
- 對象關系映射技術,如 Hibernate
本教程展示如何使用 Tomcat 學習 JSP、servlet 和 Web 服務編程。與 Tomcat 結合使用 Struts、Velocity 和 Hibernate 不屬於本教程的范圍。
過去,因為配置和管理 Tomcat 需要高級專業知識,主要的 Tomcat 用戶都是高級的服務器端應用程序開發人員。現在,由於 Tomcat 的 GUI 安裝程序的出現、將服務器安裝為系統服務的能力以及服務器功能的穩定性,甚至初級 Web 開發人員都能使用這個通用的服務器。
Tomcat 安裝與設置
下載 Tomcat
要下載最新版本的 Tomcat,請訪問 Apache Tomcat 主頁(參見 必要條件),如圖 1 所示,並單擊 Download 標題下的 Tomcat 5.x 鏈接(圖 1 中紅色邊框內的區域):
圖1. Apache Tomcat 項目主頁
第3頁,共11頁 文檔選項 打印此頁 PDF - A4 475 KB PDF - Letter 479 KB 獲取 Adobe® Reader® 樣例代碼 對本教程的評價 幫助我們改進此內容 Tomcat 安裝與設置 下載 Tomcat 要下載最新版本的 Tomcat,請訪問 Apache Tomcat 主頁(參見必要條件),如圖 1 所示,並單擊 Download 標題下的 Tomcat 5.x 鏈接(圖 1 中紅色邊框內的區域): 圖1. Apache Tomcat 項目主頁 可以在最新的 5.5.x 發行版中進行選擇。選擇最新的穩定(非 Beta 和非 Alpha)發行版的二進制分發版。對於 Windows 系統,下載 EXE 二進制文件進行簡單安裝。
安裝 Tomcat
EXE 二進制安裝程序完成以下事項:
- 解壓並安裝 Tomcat 服務器組件。
- 要求您指定偵聽傳入請求時,服務器將使用的 TCP 端口。(TCP 端口是一個網絡端點,用數字表示,客戶機應用程序可以在連接到服務器時指定該數字。)
- 將服務器配置為作為系統服務運行。
啟動 EXE 安裝程序。您將看到最初的歡迎屏幕,如圖 2 所示:
圖 2. Tomcat 設置向導歡迎屏幕
EXE 安裝程序使用運行一個帶有逐步說明的向導。必須擁有對機器的管理權限,因為 Tomcat 是作為系統服務安裝的。如果使用自己的 PC,作為默認用戶並成功安裝了其他軟件,可能就已經有了管理權限。
表 1 描述了設置向導的各個屏幕所提示的項以及您應該做出的響應。
設置向導屏幕 | 描述 |
---|---|
許可協議 | 這是 Apache License 2.0,是現有的開源軟件許可中的一種。仔細閱讀許可條款。如果同意條款,請單擊 I Agree 按鈕繼續。 |
選擇組件 | 選擇 Tomcat 組件進行安裝。默認情況下會選中必需的組件。如果有足夠的磁盤空間,可以考慮安裝示例。它們對於 Web 應用程序編程很有用。 |
選擇安裝位置 | 選擇在計算機上安裝 Tomcat 服務器的目錄。如果是初次安裝,使用向導選擇的默認設置即可。該屏幕還顯示了 Tomcat 安裝將占用的磁盤空間以及磁盤上可用的空間。 |
配置 | 該屏幕用於執行基本 Tomcat 服務器配置。可以選擇安裝服務器的 TCP 端口,以及管理員用戶名和密碼。建議將 TCP 端口設置為 8080。保留管理員用戶名為 admin 並輸入自己的管理員密碼。不要忘記密碼;稍后將需要使用它來部署本教程中的示例。 |
Java 虛擬機 | 該屏幕用於選擇運行 Tomcat 的 JVM。除非機器上安裝了多個 JDK,否則使用默認設置即可。對於最新的 Tomcat 5.5 發行版,應該選擇 JVM 1.5.0 版或更高版本。 |
完成 Apache Tomcat 設置向導 | 這是安裝的最后一步。選擇 Run Apache Tomcat 復選框。這將在安裝后立即啟動系統服務。 |
注意,在某些帶有防火牆的 Windows 版本中,可能需要賦予 Tomcat 明確的權限,以偵聽用於請求的 TCP 端口。
安裝后,Tomcat 服務器將運行,同時,Apache 服務監控程序圖標將顯示在 Windows 任務欄(屏幕底部的長條)的右下角,如圖 3 所示:
圖 3. 服務監控程序顯示 Tomcat 正在運行
在圖 3 中,監控程序圖標上的綠色箭頭指示 Tomcat 服務正在運行。
驗證服務器操作
訪問運行的 Tomcat 服務器和驗證安裝是否成功很簡單。啟動瀏覽器並指向地址 http://localhost:8080/ 即可。
Tomcat 服務器在端口 8080 上偵聽。(在安裝期間配置該端口。)圖 4 展示了 Tomcat 顯示的歡迎屏幕:
圖 4. Tomcat 的歡迎屏幕
通過讓 Tomcat 服務器與瀏覽器在同一機器上運行,可以模擬網絡環境。圖 5 顯示了這個回環網絡配置:
圖 5. 用於單機服務器端開發的回環配置
在圖 5 中,客戶機(瀏覽器)與服務器 (Tomcat) 在同一台機器上運行。客戶機與服務器之間的連接以回環模式運行。這是 Web 開發中的一個常用實踐,允許使用單機執行服務器端開發。在實際生產中,可以將 URL 的主機名從 localhost 更改為聯網的生產 Tomcat 服務器的 IP 地址(如圖 5 中的虛線內所顯示的)。
Tomcat 上的第一個 JSP 應用程序
JSP 編程簡介
JSP 是一種流行的腳本和模板語言,用於創建服務器端 Java 應用程序的表示層。通常,JSP 與動態用戶界面一起用於網頁。它可以動態地生成 HTML、XML、級聯樣式表(Cascading Style Sheets,CSS)、JavaScript 以及任何客戶端表示內容。最新的廣泛實現的 JSP 版本是 2.0,基於 Java 規范要求(Java Specification Request,JSR)152(參見 參考資料)。
JSP 語言的基本元素如下:
- 指令
- 標准動作
- 表達式語言(Expression Language,EL)
- 自定義標記庫
- JavaBean
JSP 內建了訪問 JavaBean 的能力。在生產應用程序中,JavaBean 通常用於在應用程序邏輯(使用 servlet 和其他組件實現)和 JSP 中傳遞數據值。JSP 代碼的主要職責是顯示 JavaBean 中包含的值。
JSP 頻繁使用的一個標記庫是 JSP 標准標記庫(JSP Standard Tag Library,JSTL)。JSTL 在 JSR 52 中定義(參見 參考資料),它包含一個大型的標記庫,可與 JSP 中的 EL 聯合使用。JSTL 的最新版本(到 2005 年 10 月為止)是 1.1。
與 Java 程序不同,JSP 程序不需要進行預編譯。Tomcat 在 JSP 首次執行時對它進行編譯,並保留一份編譯的二進制文件副本,用於后續執行。這能夠加快開發和測試周期。
對於早期的 JSP 版本(2.0 之前),如果不求助於嵌入式 Java 編碼,則很難編寫一般的應用程序邏輯。事實上,2.0 之前的 JSP 版本允許並鼓勵使用混合 Java/JSP 編碼。該實踐通常會創建混亂和難以維護的代碼。
從 JSP 2.0 開始,因為支持 EL 和 JSTL,所以 JSP 程序中不再需要 Java 代碼。建議所有新的 JSP 開發人員不要將嵌入式 Java 代碼與 JSP 混用。此方法通常稱為無腳本 JSP。
學完本教程后,可以了解更多關於 JSP 編程的內容(參見 參考資料 了解更多關於 JSP 的信息)。本部分其余內容說明如何使用 Tomcat 創建和運行 JSP 應用程序,以便立即開始編寫自己的 JSP 程序。
一個簡單 JSP 程序
本教程中的 JSP 程序示例演示 JSP 的動態 HTML 生成能力。該程序輸出一條包含當前服務器端時間的信息和一個乘法表。每次訪問該頁時,數據信息都會更改。該乘法表使用一個編程算法生成。
可以在代碼分發版的 step1 子目錄中找到該 JSP 程序示例(參見 下載)。清單 1 展示了 index.jsp:
清單 1. 示例 JSP 程序:index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <jsp:useBean id="timeNow" class="java.util.Date" /> <html> <head> <title>developerWorks Tomcat Tutorial</title> <link rel=stylesheet type="text/css" href="specials.css"> </head> <body> <table width="600"> <tr> <td class="mainHead" colspan="9"> <h1>Today is <fmt:formatDate value="${timeNow}" type="date" dateStyle="long" /></h1> </td> </tr> <tr> <c:forEach var="i" begin="1" end="9" step="1"> <th>${i}x</th> </c:forEach> </tr> <c:forEach var="row" begin="1" end="9" step="1"> <tr> <c:forEach var="col" begin="1" end="9" step="1"> <td><c:out value="${row * col}" /></td> </c:forEach> </tr> </c:forEach> </table> </body> </html>
該程序中一些要注意的 JSP 技術包括:
<%@taglib>
指令,用於包含 JSTL 的核心和格式化組件,並將它們的標記分別與名稱空間前綴c:
和fmt:
關聯。<jsp:useBean>
標准動作將java.util.Date
類的一個實例實例化為一個 JavaBean,表示當前時間。- 在
${timeNow}
表達式中使用 EL,表示java.util.Date
的 JavaBean 實例,以輸出當前的月和日。 - 使用 JSTL 中的日期格式化庫標記來格式化日期值。
- 使用 JSTL 中的
<c:forEach>
標記創建輸出乘法表的循環。 - 將靜態 HTML 內容與 JSP 生成動態內容混合。
准備在 Tomcat 上運行 JSP 應用程序
完成一些包裝工作后,才能在 Tomcat 上運行 index.jsp 程序。通常需要按照以下步驟操作:
- 創建 JSP 應用程序。如果只使用一個頁面,則稱它為 index.jsp,就像在示例程序中所做的 一樣。
- 創建一個部署描述符(一個 web.xml 文件)並將它放在 WEB-INF 目錄中。
- 將 JSTL 庫復制到 WEB-INF/lib 目錄。
- 使用 JDK 中的 JAR 工具將所有代碼捆綁成一個 Web 應用程序歸檔 (WAR) 文件,用於部署。
- 使用 Tomcat Web 應用程序管理器部署和運行 WAR 文件。
WAR 文件是一個標准 Java 企業版(Java Enterprise Edition,Java EE)部署單元。它是一種格式非常特殊的 JAR 文件,文件擴展名為 .war。 在此 WAR 文件中,必須已經部署了一個名為 web.xml 的部署描述符文件,其中包含一些指令告訴服務器如何部署 WAR 內容。
對於該示例程序,web.xml 文件(參見清單 2)的作用不大,因為應用程序只包含一個 JSP 頁面:
清單 2. web.xml 部署描述符
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description> developerWorks Beginning Tomcat Tutorial </description> <display-name>IBM developerWorks Beginning Tomcat Tutorial </display-name> </web-app>
清單 2 中的 web.xml 文件只為 Tomcat 提供描述和顯示名稱,這些內容稍后將被 Tomcat 應用程序管理器使用。
要創建 WAR 文件,運行代碼分發版(參見下載)中的 makewar.bat 文件。該批處理文件僅使用 JAR 實用工具來創建 JAR 文件。清單 3 顯示了 makewar.bat 的內容:
清單 3. makewar.bat
jar cvf step1.war .
如果是在 Linux 系統上操作,可以在控制台上輸入 jar cvf step1.war .
來手動創建 WAR 文件。
使用 Tomact Web 應用程序管理器部署應用程序
要在 Tomcat 上運行應用程序,首先需要部署 WAR 文件。使用 Tomcat Web 應用程序管理器(簡稱為管理器)實用工具完成該操作。轉到 http://localhost:8080/manager/html 可以訪問管理器。
Tomcat 會詢問用戶名和密碼。輸入在設置期間提供的管理員用戶名和密碼。登錄服務器后,將看到管理器的顯示。它顯示了當前加載的並在 Tomcat 服務器上運行的所有應用程序,如圖 6 所示:
圖 6. Tomcat Web 應用程序管理器實用工具
要部署 step1.war,向下滾動到管理器頁面底部。單擊 WAR file to deploy 區域旁的 Browse 按鈕。使用瀏覽器選擇 step1.war 文件,然后單擊 Deploy 按鈕。該動作將 WAR 文件發送到 Tomcat 服務器並啟動它。
現在應該能看到 step1.war 應用程序在管理器的運行應用程序列表中運行。另請注意,該列表使用在 web.xml 中設置的顯示名稱來標識應用程序。
最后,轉到 http://localhost:8080/step1/ 可以看到 JSP 應用程序正在運行。
默認情況下,Tomcat 使用 WAR 文件的名稱為應用程序提供上下文。該上下文被指定為用於訪問應用程序的地址的一部分。在本例中, 上下文是 step1。Tomcat 在應用程序的根目錄中查找名為 index.jsp 的文件並執行(如果存在)。圖 7 顯示了運行的 JSP 應用程序:
圖 7. 在 Tomcat 上運行的一個 JSP 應用程序
如果對 JSP 代碼進行任何修改(比如在學習 JSP 時),可以執行以下步驟來運行新代碼:
- 使用
makewar
創建新的 WAR 文件。 - 單擊管理器中的 undeploy 取消舊 step1.WAR 的部署。
- 使用管理器部署新的 WAR 文件。
使用 Tomcat 進行 servlet 部署
servlet 簡介
Servlet 是服務器端 Java 代碼,在 servlet 容器(如 Tomcat 服務器)的控制下執行。Servlet 與 JSP 一樣,接受傳入請求,進行處理或轉換,然后生成傳出響應。因為 servlet 實際上是 Java 代碼,所以可以任意使用 Java 編程語言的功能和靈活性來創建服務器端邏輯。
所有 servlet 都會直接或間接通過實現 javax.servlet.Servlet
接口的輔助類來實現該接口。Servlet 還可以使用容器提供的 API 公開容器服務。例如,servlet 可以從容器獲得數據庫連接來訪問關系數據庫。
Servlet 通常用於實現 Web 應用程序邏輯。Servlet 可以獲取和處理數據,然后將數據傳遞給 JSP 進行顯示(例如,動態生成用戶界面)。Servlet 還可用於頻繁地處理通過基於 Web 形式提交的數據。
Tomcat 5.5 實現 Servlet 2.4 —— JSR 154 中指定的最新完成的 servlet 標准(參見 參考資料)。
本節說明如何使用 Tomcat 學習 servlet 編程。參見 參考資料 了解關於 servlet 的更多信息。
生成菜單特價項的 Servlet 示例
本節中的示例顯示某虛構餐館當日的特價菜單項。Servlet 負責獲取數據,JSP 負責動態生成 HTML 來顯示事項。本例中的 JSP 稱為 showspecials.jsp,Servlet 位於 com.ibm.dw.tutorial.tomcat.SpecialsServlet
Java 類中。
本例演示 Web 應用程序中的一種典型模式:
- 一個 servlet 接受來自用戶的傳入請求。
- 該 servlet 根據傳入請求進行處理。
- 該 servlet 使用作為屬性附加的數據將請求分派給一個 JSP。
- JSP 生成一個動態響應來顯示數據。
清單 4 顯示 SpecialsServlet
的代碼:
清單 4. SpecialsServlet
servlet
package com.ibm.dw.tutorial.tomcat; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.IOException; public class SpecialsServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); request.setAttribute("specials", getSpecials()); context.getRequestDispatcher("/showspecials.jsp") .forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } private List getSpecials() { List retval = new Vector(); retval.add(new Special("Coq au Vin", 15)); retval.add(new Special("Pad Thai", 10)); retval.add(new Special("Lobster Thermador", 10)); retval.add(new Special("Baked Alaska", 8)); return retval; } public class Special { int price; String menuItem; public Special(String item, int inPrice) { menuItem = item; price = inPrice; } public int getPrice() { return price; } public String getMenuItem() { return menuItem; } } }
清單 4 中的 servlet 代碼:
- 聲明一個名為
Special
的內部類來保存菜單特價項。 - 在名為
getSpecials()
的方法中創建特價項項列表。 - 在
doGet()
方法(Tomcat 調用該方法來處理傳入 HTTP 請求)中,將特價項列表作為名為specials
的屬性附加到request
。 - 將請求轉發給 showspecials.jsp 進行顯示。
顯示當日特價項的 JSP
清單 5 顯示 showspecials.jsp 代碼:
清單 5. showspecials.jsp 代碼
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <jsp:useBean id="timeNow" class="java.util.Date" /> <%@ page session="true"%> <html> <head> <title>developerWorks Tomcat Tutorial</title> <link rel=stylesheet type="text/css" href="specials.css"> </head> <body> <table width="600"> <tr> <td class="mainHead" colspan="2"> Today's specials for <fmt:formatDate value="${timeNow}" type="date" dateStyle="long" /> </td> </tr> <tr> <th>Specialty</th> <th>Price</th> </tr> <c:forEach var="special" items="${specials}"> <tr> <td>${special.menuItem}</td> <td>\$${special.price}</td> </tr> </c:forEach> </table> </body> </html>
可以發現,這里使用了前一節(Tomcat 上的第一個 JSP 應用程序)中 step1 示例使用 清單 1 的技術:
- JSTL 日期格式化標記格式化一個
java.util.Date
JavaBean 實例。 <c:forEach>
JSTL 循環標記迭代specials
的List
屬性(通過SpecialServlet
附加到request
對象)。- EL 表達式顯示特價項的值。
將 servlet 部署到 Tomcat
Servlet 存在於 Web 應用程序中,方式與 JSP 的相同。在將 JSP 和 servlet 部署到 Tomcat 之前,需要將應用程序包裝成一個 WAR 文件。將應用程序中 servlet 的類放在 WEB-INF/類子目錄下。
本例的 Web 描述符與前一節(Tomcat 上的第一個 JSP 應用程序)中的 清單 2 中的 Web 描述符稍有不同。前者必須告訴 Tomcat 有關 servlet 的信息以及如何將它映射到傳入請求。清單 6 顯示了本例的 web.xml 文件:
清單 6. web.xml 文件
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description>developerWorks Beginning Tomcat Tutorial </description> <display-name> IBM developerWorks Beginning Tomcat Tutorial Step 2 </display-name> <servlet> <servlet-name>Specials</servlet-name> <servlet-class> com.ibm.dw.tutorial.tomcat.SpecialsServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>Specials</servlet-name> <url-pattern>/showspecials.cgi</url-pattern> </servlet-mapping> </web-app>
該部署描述符包含一個 <servlet>
元素,告訴 Tomcat 有關 servlet 實現類的信息。<servlet-mapping>
元素告訴服務器應該將發往 showspecials.cgi 的請求傳遞給 servlet。
編譯 servlet 后,才能創建 WAR 文件。因為 servlet 是 Java 代碼,所以在部署 servlet 之前必須對它們進行編譯。為此,可以使用代碼分發版(參見下載)中的 compile.bat 批處理文件。但是,需要修改它來指向您自己的 Tomcat 目錄,因為來自 Tomcat common/lib 目錄的 servlet-api.jar 包含編譯 servlet 所需的一些接口和輔助類。
成功編輯應用程序后,即可通過執行 makewar.bat 來制作 WAR 文件。這次,WAR 文件稱為 step2.war。創建 WAR 文件后,可以使用 Tomcat 管理器來部署它。
可以通過轉到 http://localhost:8080/step2/showspecials.cgi 來訪問 Web 應用程序。
Tomcat 現在將 showspecials.cgi 的 URL 路徑映射到 servlet 代碼。這通過 <servlet-mapping>
元素在 web.xml 中指定。圖 8 顯示了應用程序的輸出,即顯示菜單特價項:
圖 8. 在 Tomcat 上運行的 SpecialsServlet
如果對 servlet 代碼進行更改。可以按照以下步驟運行新的代碼:
- 使用 compile.bat 重新編譯代碼
- 使用 makewar.bat 創建 step2.war
- 使用 Tomcat 管理器取消所有舊 step2.war 的部署。
- 部署新的 step2.war。
使用 Tomcat 探索 Web 服務開發
Web 服務簡介
Web 服務是服務器端代碼組件,可以公開其功能以使用標准 HTTP 協議訪問 TCP/IP 網絡。這種公開允許 Web 服務用戶(稱為消費者)使用大多數網絡連接上的 Web 服務 -- 甚至能穿越防火牆。
Web 服務處理傳入請求並生成響應。這正是 servlet 所做的工作,所以自然要使用 servlet 實現 Web 服務。
Web 服務正日益流行,因為它們可以有效地用於 B2B 或 B2C 接口。它們允許通過 Internet 發送請求和接收響應。任何能訪問網站的用戶都可以訪問 Web 服務。例如,eBay 和 Amazon.com 都為其合作伙伴和用戶提供了 Web 服務。
Web 服務依賴於在消費者和服務之間傳遞基於 XML 的消息。此消息被包裝並按照簡單對象訪問協議(Simple Object Access Protocol,SOAP)發送。
Apache Axis 是一個 Web 服務開發工具包,可用作 Tomcat 的一個增件。下一節說明如何使用 Apache Axis 創建簡單 Web 服務,並在 Tomcat 服務器上部署它。參見 參考資料 中有助於了解 Web 服務編程更多信息的文章和教程。
向 Tomcat 添加 Axis
Axis 可以作為一個 servlet 在 Tomcat 上運行。如果還未這樣做,請下載最新版本的 Axis(參見 必要條件)。取消 Axis 分發版的部署。
將 Axis 分發版 webapps/axis 目錄下的所有文件復制到本文章代碼分發版的 step3/axis 目錄(參見 下載)。
可以使用 makewar.bat 批處理文件(位於 step3/axis 目錄中)來創建可以作為 Web 應用程序部署到 Tomcat 的 axis.war 文件。
在 Internet 上下載一些附加 JAR 文件並將它們放入 step3 應用程序的 WEB-INF/lib 目錄后,才能在 Tomcat 上正確運行 Axis。如果使用 Axis 1.2.1,則需要下載以下文件:
- activation.jar 來自 http://java.sun.com/products/javabeans/glasgow/jaf.html
- xmlsec-1.2.1.jar 來自 http://xml.apache.org/security/
- mail.jar 來自 http://java.sun.com/products/javamail/
如果使用的不是 Axis 1.2.1 版,則上述列表會稍有不同。參見 Axis 分發版的隨附文檔了解更多信息。
一個發布當日事項的簡單 Web 服務
繼續餐館菜單特價項示例,在本節示例中創建的 Web 服務為消費者提供當日特價銷售的菜單項列表。
Web 服務的代碼包含在 ShowSpecials.jws 文件中,如清單 7 所示:
清單 7. ShowSpecials.jws
public class ShowSpecials { public String [] getMenuItems() { return new String []{ "Coq au Vin", "Pad Thai", "Lobster Thermador", "Baked Alaska" }; } public int [] getPrices() { return new int [] { 15, 10, 10, 8 }; } }
清單 7 中的代碼有兩個公共方法。getMenuItems()
方法返回特價出售的菜單項,getPrices()
方法檢索它們的價格。
Axis 使用 .jws(Java Web 服務)文件支持立即部署模式。在該模式下,所需做的只是將帶有 .jws 擴展名的 Java 源文件放入 axis 目錄。此類的任何公共方法都將通過 Web 服務公開。本例使用立即部署模式。getMenuItems()
和 getPrices()
方法在解析和編譯 .jws 文件時通過 Axis 動態公開為 Web 服務方法。解析和編譯只在初次訪問 Web 服務時發生。
將 Axis servlet 部署到 Tomcat
因為 Axis 作為 servlet 運行,所以將 Web 服務部署到 Tomcat的過程與之前 Web 應用程序部署示例中的相同。
在 step3/axis 目錄中,運行 run makewar.bat 來創建 axis.jar。使用 Tomcat 管理器將 axis.war 文件部署到 Tomcat 服務器。
部署后,即可在 URL http://localhost:8080/axis/ShowSpecials.jws 上獲得 Web 服務。不過,如果使用瀏覽器訪問該 URL,將看不到很多信息。必須通過 Web 服務使用者應用程序來使用 Web 服務。
使用使用者應用程序測試 Web 服務
編寫 Web 服務使用者應用程序代碼超出了本教程的范圍。不過,可以使用 Apache Ant(參見 必要條件)根據代碼分發版(參見 下載)中提供的現有代碼編譯客戶機應用程序。
因為 Web 服務通過標准 Web 協議傳輸,所以客戶機應用程序可以在任何使用編程語言的操作系統上創建。許多 Web 服務工具箱自動生成 Web 服務使用程序。這是可能的,因為工具可以自動發現訪問 Web 服務的方法。
有關如何訪問 Web 服務的說明以 XML 文件的形式提供,用 Web 服務定義語言(Web Service Definition Language,WSDL)進行編碼。大多數 Web 服務容器(如 Axis)可以根據某個 Java 類或接口來生成這個 WSDL 文件。例如,要查看為 Web 服務生成的 WSDL,可以試着使用瀏覽器訪問 URL http://localhost:8080/axis/ShowSpecials.jws?wsdl。看似復雜的 XML 文檔是使用 .jws 代碼生成的。此 WSDL 文檔可由某個工具輕松處理,而且能自動生成調用 Web 服務的客戶機使用程序。
本例的客戶機不使用 WSDL 或自動代碼生成。它通過硬編碼來調用 ShowSpecials.jws Web 服務。這使編寫客戶機代碼相對簡單。
需要安裝 Ant 來編譯和運行 Web 服務客戶機(參見 必要條件),因為代碼需要許多 Axis 庫 JAR 文件才能成功編譯和運行。
編譯客戶機之前,請找到 step3/client 目錄中的 build.xml 文件,並編輯該文件,以指向 Axis 安裝目錄。
要編譯客戶機,請使用以下命令運行 Ant:
ant compile
要啟動客戶機,使用 Web 服務,請使用以下命令運行 Ant:
ant run
成功運行 Web 服務客戶機的典型輸出(顯示特價菜單項和價格)如下所示:
Buildfile: build.xml run: [java] Specials today: [java] Coq au Vin $15 [java] Pad Thai $10 [java] Lobster Thermador $10 [java] Baked Alaska $8 BUILD SUCCESSFUL Total time: 7 seconds
結束語
Tomcat 服務器是一個學習 JSP、servlet 和 Web 服務的的優秀平台。在本教程中學習了以下方法:
- 下載和安裝您自己的 Tomcat 服務器。
- 使用 Tomcat 管理器部署和取消部署應用程序。
- 創建基於 JSP 的應用程序並在 Tomcat 服務器上執行它。
- 使用 servlet 創建 Web 應用程序並在 Tomcat 上執行它。
- 創建 Web 服務並在 Tomcat 上執行它。