一、準(zhǔn)備工作
因?yàn)楸镜販y試服務(wù)器WAS6.0,所以先在RAD7中打開window>preferences>web services>Server and Runtime,在Server項(xiàng)選擇WebSphere v6.0 Server。
在Workspace中創(chuàng)建一個(gè)Websphere v6.0的本地服務(wù)器。
創(chuàng)建一個(gè)Enterprise Application Project項(xiàng)目:Weather,須包含一個(gè)EJB項(xiàng)目和一個(gè)dynamic web項(xiàng)目。WeatherWeb在創(chuàng)建之后保持空,專門提供Web Service。
接下來,為項(xiàng)目創(chuàng)建一個(gè)EJB。
為了簡化過程,只在WeatherEJB的EJB中寫了簡單的方法,例如:

public String getInformation()
{
return "WEATHER WEB SERVICE";
}

public int getTemperature(Calendar date)
{
return 26;
}

public String getWind(Calendar date)
{
return "SW";
}
然后,在WeatherEJB上點(diǎn)擊右鍵,選擇Prepare for Deployment。
二、從EJB生成Webservice
右鍵點(diǎn)擊WeatherEJBBean,選擇Webservices->Create Webservice。
因?yàn)槭菑?/span>Java到Webservice,在Web Service type中選擇Bottom up EJB Web Service。在Service implementation點(diǎn)擊Browse,選擇剛才創(chuàng)建的EJB。確保Configuration 中的項(xiàng)目正確后,其他選項(xiàng)保持默認(rèn),點(diǎn)擊Next。
之后一直按Next,出現(xiàn)Start server的按鈕,點(diǎn)擊Start。
如果在第一階段創(chuàng)建EAP的時(shí)候沒有創(chuàng)建dynamic web項(xiàng)目的話,在此過程中,RAD將會(huì)自動(dòng)創(chuàng)建一個(gè)web項(xiàng)目。但是,這個(gè)web項(xiàng)目中并不會(huì)自帶ibm-web-bnd.xmi文件,這在本地環(huán)境下沒問題,當(dāng)發(fā)布到有多個(gè)應(yīng)用服務(wù)器的環(huán)境中時(shí),就會(huì)遇到以下的錯(cuò)誤提示:
ADMA0010E: A Validation error occurred in task Selecting virtual hosts for Web modules. A virtual host is not specified for Web module WeatherWeb with URI WeatherWeb.war,WEB-INF/web.xml."
本地服務(wù)器啟動(dòng)以后,我們的EAR將會(huì)被自動(dòng)發(fā)布,打開Console視圖,應(yīng)該可以看到如下信息:

打開IE,輸入http://localhost:9080/WeatherWeb/services/WeatherEJB,如果Web Service成功發(fā)布,則可以看到如下信息:
{http://bean}WeatherEJB
Hi there, this is a Web service!
三、測試Web Service
RAD提供了多種途徑進(jìn)行Web Service的測試。
1.使用Web Services Explorer測試
在Project Explorer視圖下,展開JSR-109 Web Services,右鍵點(diǎn)擊WeatherEJBService,選擇Test With Web Service Explorer。

之后,IE會(huì)打開一個(gè)新窗口,在Endpoints欄,新增一個(gè)項(xiàng)目:
http://localhost:9080/WeatherWeb/services/WeatherEJB
然后轉(zhuǎn)到左側(cè)的Navigator,展開WeatherEJBSoapBinding,就可以對(duì)EJB下的Method逐個(gè)進(jìn)行測試了。

2.使用Test JSP 測試
Web Services Explorer無法對(duì)SOAP/JMS的web service進(jìn)行測試,而通過生成Test JSP則可以。
同樣在WeatherEJBService上點(diǎn)擊右鍵,選擇Generate Client。
拖動(dòng)左側(cè)滑塊調(diào)整Client Generation Level 到Test Client。
在Client Project項(xiàng)指定WeatherWeb,然后點(diǎn)Next。

然后選擇需要測試的方法。完成以后,在WeatherWeb下應(yīng)該會(huì)自動(dòng)生成一個(gè)sampleWeatherEJBProxy的目錄,右擊TestClient.jsp選擇Run As -> Run on Server,選擇我們的本地測試服務(wù)器。

TestClient.jsp上包含了Methods, Inputs, Results三個(gè)框架,便可以對(duì)Service逐個(gè)進(jìn)行測試。其中setEndpoint()可以為本地測試選擇不同的Endpoint。需要注意的是,為方便測試,Web Service返回類型一定要實(shí)現(xiàn)toString(),否則在Result中只能看到類似itso.objects.Weather@61a607dc的結(jié)果。

3. Write a Java Client that uses the stubs
在前面的步驟中,已經(jīng)利用RAD生成了一個(gè)Client。利用Stubs訪問Web Service變得非常簡單。在此用一個(gè)簡單的Servlet以測試:
package servlet;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.Calendar;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.rpc.ServiceException;

import ejbs.GetTemperatureResponse;
import ejbs.Weather;
import ejbs.WeatherServiceLocator;


/** *//**
* Servlet implementation class for Servlet: GetTemperature
*
*/

public class GetTemperature extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{

/**//* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/

public GetTemperature()
{
super();
}

/**//* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
WeatherServiceLocator weatherServiceLocator = new WeatherServiceLocator();

try
{
URL serviceURL = new URL("http://dpta00398:9080/WeatherWeb/services/Weather");
Weather weather = weatherServiceLocator.getWeather(serviceURL);
ejbs.GetTemperature inParam = new ejbs.GetTemperature();
inParam.setDate(Calendar.getInstance());
GetTemperatureResponse rsp = weather.getTemperature(inParam);
response.getWriter().write("Temperature:" + rsp.getGetTemperatureReturn());

} catch (MalformedURLException e)
{
response.getWriter().write(e.getMessage());

} catch (ServiceException e)
{
response.getWriter().write(e.getMessage());

} catch (RemoteException e)
{
response.getWriter().write(e.getMessage());
}
}

/**//* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}

參考資料:《WebSphere Version 6 Web Services Handbook Development and Deployment》