本教程所需要的軟件
開始之前,需要在您的計算機上下載並安裝以下軟件:
NetBeans IDE 6.0 Web & Java EE。
Java Standard Development Kit(JDK)版本 5.0 或版本 6.0。
Glassfish V2 或 Tomcat Web Server,兩者都可在 NetBeans IDE 6.0 安裝程序中選擇安裝。
客戶機界面如下所示,其中含有從 Web 服務接收的所有數據:
到本教程結束時,應用程序的功能將包括提供待檢查文本、對 Web 服務調用操作和呈現結果。IDE 將生成聯系 Web 服務及發送文本所需要的所有代碼。拼寫檢查 Web 服務將處理其余內容,它將識別拼寫錯誤的單詞並提供一個替換詞的建議列表。
注意: 本教程所使用的拼寫檢查 Web 服務由 CDYNE Corporation 提供。CDYNE 開發和銷售一整套綜合的數據增強、數據質量和數據分析 Web 服務及業務智能集成,並為之提供支持。拼寫檢查 Web 服務是 CDYNE 所提供的 Web 服務之一。注意,對於基於一個或多個 Web 服務的應用程序,其功能取決於這些 Web 服務的可靠性和可用性。但是,CDYNE 的 FAQ 指出,其產品的目標為“100% 可用性”,並且在“自然災難、恐怖活動或其他災難中,W eb 服務數據流將傳遞到我們的二級數據中心”。NetBeans 感謝 CDYNE 為本教程所做的貢獻及對其發展的支持。
使用拼寫檢查 Web 服務
要使用 Web 服務,我們需要創建一個 Web 服務客戶機。針對創建 Web 服務客戶機,NetBeans IDE 6.0 提供了一個客戶機創建工具:Web Service Client 向導可以生成查找 Web 服務的代碼。它還提供了一些工具用於開發已創建的 Web 服務客戶機——該工作區域由 Projects 窗口中的節點組成。這些工具是標准 NetBeans IDE 安裝的一部分,它們都是直接可以開箱即用的,而不需要任何插件。
創建客戶機
在本節中,我們將使用一個向導通過 Web 服務的 WSDL 文件生成 Java 對象。
選擇 File > New Project(Ctrl-Shift-N)選項。在 Categories 列表中,選擇 Web 選項。在 Projects 列表中,選擇 Web Application 選項。單擊 Next 按鈕。將項目命名為 SpellCheckService,並確保指定了合適的服務器作為目標服務器。有關詳細信息,請參見“入門”一節。單擊 Finish 按鈕。
在 Projects 窗口中,右鍵單擊 SpellCheckService 項目節點並選擇 New > Other 選項。在 New File 向導中,選擇 Web Services > Web Service Client 選項。在 Web Service Client 向導中,將以下 URL 指定給 Web 服務:
http://ws.cdyne.com/SpellChecker/check.asmx
如果位於防火牆後面,則需要指定一個代理服務器——否則無法下載 WSDL 文件。如果這樣的話,單擊 Web Service Client 向導中的 Proxy Settings 並設置代理主機和端口號。
輸入 org.netbeans.end2end.check.client 作為包名。客戶機對象將生成到指定的包名中。IDE 應如下所示:
單擊 Finish 按鈕。
在 Projects 窗口的 Web Service References 節點中,您應看到以下內容:
Projects 窗口中的內容表示,服務名為 check 的 Web 服務提供了一個 CheckTextBody 操作供應用程序使用。CheckTextBody 操作將檢查字符串中的拼寫錯誤,然 後返回數據供客戶機處理。在整篇教程中,我們都將使用這個操作。
在 Files 窗口的 build 節點中,您應看到以下內容:
Files 窗口顯示了由 JAX-WS Web Service Client 向導生成的客戶樁。
開發客戶機
有多種方式可以實現 Web 服務客戶機。Web 服務的 WSDL 文件限制了能夠發送給 Web 服務的信息的類型,並且還限制從 Web 服務接收的信息的類型。但是,WSDL 文件並未限制傳遞所需信息的 方式,也未限制用戶接口的 內容。下面所構建的客戶機實現由一個 JSP 頁面(它允許用戶輸入待檢查的文本)和一個 servlet(用於將文本傳遞給 Web 服務,然後生成包含結果的報告)構成。
編寫 JSP 頁面
我們的 JSP 頁面僅包括一個文本區域(供用戶輸入文本)和一個按鈕(用於將文本發送給 Web 服務)。
在 Projects 窗口中,展開 Web Pages 節點並雙擊 index.jsp 在 Source Editor 中打開它。
復制以下代碼並將它粘貼到 index.jsp 代碼中,覆蓋原來的 <body> 標記:<body>
<form name="Test" method="post" action="SpellCheckServlet">
<p>Enter the text you want to check:</p>
<p>
<p><textarea rows="7" name="TextArea1" cols="40"
ID="Textarea1"></textarea></p>
<p><input type="submit" value="Spell Check"
name="spellcheckbutton"></p></form>
</body>
上述代碼指定,當用戶單擊提交按鈕時, textarea 中的內容將提交給 SpellCheckServlet servlet。
創建和編寫拼寫檢查 servlet
在本節中,我們將創建一個 servlet 與 Web 服務進行交互。但是,我們將看到,執行交互的代碼將由 IDE 提供。因此,我們只需處理業務邏輯,也就是准備用於檢查的文本和處理結果。
在 Projects 窗口中,右鍵單擊項目節點並選擇 New > Other,然後選擇 Web > Servlet 選項。單擊 Next 按鈕。將 servlet 命名為 SpellCheckServlet,並在 Package 下拉列表中鍵入 org.netbeans.end2end.check.client。單擊 Next 按鈕。注意到,該 servlet 的 URL 映射為 /SpellCheckServlet,如下所示:
單擊 Finish 按鈕。servlet 將在 Source Editor 中打開。
將光標移動到 Source Editor 的 processRequest 方法中,在方法頂部的右側添加一些新行。
在剛才創建的新行區域中單擊鼠標右鍵,選擇 Web Service Client Resources > Call Web Service Operation 選項。在 Select Operation to Invoke 對話框中,單擊 CheckTextBody 操作,如下所示:
單擊 OK 按鈕。
注意: 我們還可以將操作節點從 Projects 窗口直接拖動到編輯器中,而無需使用上面的對話框。
在 processRequest 方法的頂部,我們可以看到一段調用 Web 服務的代碼,如下所示:
try { // Call Web Service Operation
org.netbeans.end2end.check.client.CheckSoap port = service.getCheckSoap();
// TODO initialize WS operation arguments here
java.lang.String bodyText = "";
java.lang.String licenseKey = "";
// TODO process result here
org.netbeans.end2end.check.client.DocumentSummary result =
port.checkTextBody(bodyText,licenseKey);
out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
我們只需該方法便可處理調用 Web 服務操作的事宜。此外,以下代碼行將在類的頂部聲明。
@WebServiceRef(wsdlLocation = "http://ws.cdyne.com/SpellChecker/check.asmx?WSDL")
private Check service;
將整個 processRequest 方法替換為以下代碼(以下代碼中的行內注釋解釋了各行的作用): )protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
// Call Web Service Operation
String TextArea1 = request.getParameter("TextArea1");
org.netbeans.end2end.check.client.CheckSoap port = service.getCheckSoap();
// TODO initialize WS operation arguments here
java.lang.String bodyText = TextArea1;
java.lang.String licenseKey = "0";
// TODO process result here
org.netbeans.end2end.check.client.DocumentSummary doc =
port.checkTextBody(bodyText,licenseKey);
String allcontent = doc.getBody();
//From the retrieved document summary,
//identify the number of wrongly spelled words:
int no_of_mistakes = doc.getMisspelledWordCount();
//From the retrieved document summary,
//identify the array of wrongly spelled words:
List allwrongwords = doc.getMisspelledWord();
out.println("<html>");
out.println("<head>");
//Display the report's name as a title in the browser's titlebar:
out.println("<title>Spell Checker Report</title>");
out.println("</head>");
out.println("<body>");
//Display the report's name as a header within the body of the report:
out.println("<h2><font color='red'>Spell Checker
Report</font></h2>");
//Display all the content (correct as well as incorrectly spelled) between quotation
marks:
out.println("<hr><b>Your text:</b> "" + allcontent + """ +
"<p>");
//For every array of wrong words (one array per wrong word),
//identify the wrong word, the number of suggestions, and
//the array of suggestions. Then display the wrong word and the number of suggestions
and
//then, for the array of suggestions belonging to the current wrong word, display
each
//suggestion:
for (int i = 0; i < allwrongwords.size(); i++) {
String onewrongword = ((Words) allwrongwords.get(i)).getWord();
int onewordsuggestioncount = ((Words) allwrongwords.get(i)).getSuggestionCount();
List allsuggestions = ((Words) allwrongwords.get(i)).getSuggestions();
out.println("<hr><p><b>Wrong word:</b><font
color='red'> " + onewrongword + "</font>");
out.println("<p><b>" + onewordsuggestioncount +
"suggestions:</b><br>");
for (int k = 0; k < allsuggestions.size(); k++) {
String onesuggestion = (String) allsuggestions.get(k);
out.println(onesuggestion);
}
}
//Display a line after each array of wrong words:
out.println("<hr>");
//Summarize by providing the number of errors and display them:
out.println("<font color='red'><b>Summary:</b> " + no_of_mistakes +
" mistakes (");
for (int i = 0; i < allwrongwords.size(); i++) {
String onewrongword = ((Words) allwrongwords.get(i)).getWord();
out.println(onewrongword);
}
out.println(").");
out.println("</font>");
out.println("</body>");
out.println("</html>");
out.close();
} catch (Exception ex) {
System.out.println("exception" + ex);
out.println("exception" + ex);
}
out.println("</body>");
out.println("</html>");
out.close();
}
注意,上述代碼並未針對錯誤處理執行任何操作。有關詳細信息,請參見 學以致用 一節。
部署客戶機
IDE 將使用 Ant 構建腳本構建和運行應用程序。IDE 將構建我們在創建項目時輸入的選項來構建腳本。我們可以在項目的 Project Properties 對話框中優化這些選項(右鍵單擊 Projects 窗口中的項目節點,然後選擇 Properties 選項)。
右鍵單擊項目節點並選擇 Run 選項。
等待一段時間後,應用程序將部署和顯示前面所編寫的 JSP 頁面。輸入一些文本,確保其中一些單詞包含拼寫錯誤:
單擊 Spell Check 按鈕並查看結果:
學以致用
我們已經在 IDE 中完成了第一個 Web 服務客戶機,接下來可以在應用程序中加入一些擴展功能。建議加入以下兩個任務。
在 servlet 中添加錯誤處理代碼。
重新編寫客戶機,使用戶能夠與從 Web 服務返回的數據進行交互。要獲得更多靈感,請參見 CDYNE 站點上的客戶機實現。如下所示: