前兩天寫了兩篇Blog
使用SOAP開(kāi)發(fā)java web服務(wù)--Axis開(kāi)發(fā)方案 ,
深入探索SOAP1.1--使用SAAJ1.2.1 ,有些讀者可能對(duì)Java的web服務(wù)開(kāi)發(fā)抱怨了,怎的那么復(fù)雜呢?不如在net平臺(tái)下敲幾個(gè)鍵就行了,:),請(qǐng)先不用著急,前兩天我的Blog只是為了讓各位讀者深入了解一下什么是SOAP,以及其在Java中的封裝接口實(shí)現(xiàn),今天我們來(lái)討論一下,一種高層的web服務(wù)實(shí)現(xiàn)方案,那就是基于JAX-RPC的服務(wù)實(shí)現(xiàn)。
JAX-RPC 1.1規(guī)范沒(méi)有定義用于實(shí)現(xiàn)基于JAX-RPC的服務(wù)的任何API。基于JAX-RPC的服務(wù)均可使用Java類或使用WSDL文檔實(shí)現(xiàn),這兩種情況,JAX-RPC均不為其服務(wù)端實(shí)現(xiàn)訪問(wèn)和使用部署的服務(wù)指定任何要求。基于JAX-RPC的服務(wù)于開(kāi)發(fā)RMI應(yīng)用程序極為相似(JAX-RPC是使用基于SOAP的RPC和WSDL機(jī)制調(diào)用異源環(huán)境中運(yùn)行的web服務(wù),集成了遠(yuǎn)程過(guò)程調(diào)用(RPC)的性能,通過(guò)提供Java與XML/WSDL之間所需的映射,封裝了底層SOAP包裝和消息交換的復(fù)雜操作)。
一、基于Java類開(kāi)發(fā)JAX-RPC服務(wù)。
步驟與RMI開(kāi)發(fā)基本類似:
1)定義遠(yuǎn)程接口(服務(wù)定義);
2)實(shí)現(xiàn)方案遠(yuǎn)程接口(服務(wù)實(shí)現(xiàn)方案);
3)配置服務(wù);
4)生成部署文件;
我實(shí)現(xiàn)的例子:
1、定義遠(yuǎn)程接口(StudentInfoIF.java):
/**
*StudentInfoIF.java
*Copyright 2005-2-10
*@author 阿飛
*/
package edu.cun.jws.jaxrpc;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*該接口主要用于jax-rpc服務(wù)定義(遠(yuǎn)程接口)
*/
public interface StudentInfoIF extends Remote{
/**
*@param studentName 這是一個(gè)學(xué)生名字的字符串表達(dá)
*@return String 返回學(xué)生的信息
*/
public String getStudentInfo(String studentName) throws RemoteException;
}
2、實(shí)現(xiàn)遠(yuǎn)程接口(StudentInfoImpl.java):
/**
*StudentInfoImpl.java
*Copyright 2005-2-10
*@author 阿飛
*/
package edu.cun.jws.jaxrpc;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*實(shí)現(xiàn)遠(yuǎn)程接口StudentInfoIF,服務(wù)實(shí)現(xiàn)方案
*@see StudentInfoIF
*/
public class StudentInfoImpl implements StudentInfoIF{
public String getStudentInfo(String studentName){
System.out.println("Your name:"+studentName);
return new String(" Hello");
}
}
對(duì)上面的源文件進(jìn)行編譯:java *.java -d .
最后在當(dāng)前文件夾得到一個(gè)edu文件夾,里面就是我們的需要的服務(wù)的字節(jié)類。
3、準(zhǔn)備部署
由于是使用JWSDP1.5的開(kāi)發(fā)工具,讀者請(qǐng)到SUN網(wǎng)站下載JWSDP開(kāi)發(fā)工具http://java.sun.com/webservices/downloads/webservicespack.html:
我們使用的是jwsdp安裝路徑/jaxrpc/bin中的工具wsdeploy,該工具先通過(guò)調(diào)用wscompile -gen:server來(lái)完成編譯(由于現(xiàn)在我們部署的對(duì)象是Tomcat,所以我們要調(diào)用wsdeploy,如果是標(biāo)準(zhǔn)的J2EE實(shí)現(xiàn)方案的容器的話,使用wscompile就行了,具體請(qǐng)看幫助文檔):
因?yàn)槭褂玫氖莣sdeploy,所以要先編寫一個(gè)jaxrpc-ri.xml文件,針對(duì)我們這次的例子:
<?xml version="1.0" encoding="UTF-8"?>
<webServices
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
version="1.0"
targetNamespaceBase="http://www.cun.edu.cn/jws/wsdl" <------------這個(gè)是你自己命名的空間
typeNamespaceBase="http://www.cun.edu.cn/jws/types" <------------也是自己定義的
urlPatternBase="/StudentInfo">
<endpoint
name="StudentInfo"
interface="edu.cun.jws.jaxrpc.StudentInfoIF" <-----------這個(gè)是我們提供的接口
implementation="edu.cun.jws.jaxrpc.StudentInfoImpl"/> <-----------實(shí)現(xiàn)接口的類
<endpointMapping
endpointName="StudentInfo"
urlPattern="/Info"/> <-----------等于是web.xml文件中的url-pattern
</webServices>
如果需要事先對(duì)web.xml文件填充的話:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
準(zhǔn)備部署工作完畢。
4、部署(要熟悉j2ee部署規(guī)范,這里我的部署對(duì)象是Tomcat)
我們創(chuàng)建一個(gè)文件夾StudentInfo
以下是文件夾內(nèi)容
/StudentInfo
/WEB-INF
/classes <-------把我們的服務(wù)程序拷到這里,這里是edu文件夾
/lib <-------必須的包,
web.xml <-------上面我們編寫的文件
jaxrpc-ri.xml <-------上一步編寫的文件
注意這里必須的包包括JAX-RPC相關(guān)的包,還有SAAJ相關(guān)的包(JavaMail,JAF,JAXP),我這里用了以下幾個(gè)包(由于是使用jdk1.5,所以JAXP相關(guān)包不在內(nèi)):activation.jar(JAF),jaxrpc-api.jar,jaxrpc-impl.jar,jaxrpc-spi.jar,mail.jar,saaj-api.jar,saaj-impl.jar;
好了之后,我們打包成一個(gè)war文件(由于wsdeploy需要的輸入文件是一個(gè)war存檔文件):
轉(zhuǎn)換到到StudentInfo目錄下,設(shè)置好運(yùn)行wsdeploy的運(yùn)行路徑,運(yùn)行:
jar cvf StudentInfo.war *
wsdeploy -o StudentInfoApp.war StudentInfo.war
最后我們得到一個(gè)StudentInfoApp.war文件,該文件就是我們需要的部署web服務(wù)的程序。我們把它拷到Tomcat的webapps目錄下,就自動(dòng)部署好了
5、測(cè)試
在瀏覽器中輸入:http://localhost:8080/StudentInfoApp/Info
測(cè)試成功,web服務(wù)部署完畢,客戶端的測(cè)試的話,自己編寫,可以使用java,也可以使用net平臺(tái)等作為客戶端,請(qǐng)參考我的例子:使用SOAP開(kāi)發(fā)java web服務(wù)--Axis開(kāi)發(fā)方案 ,就是使用C#作為服務(wù)的調(diào)用客戶端。
ps:基于JAX-RPC的web服務(wù)開(kāi)發(fā)就是這么簡(jiǎn)單,很多內(nèi)部轉(zhuǎn)換的內(nèi)容都已經(jīng)自動(dòng)完成了,我們可以把精力集中于商業(yè)邏輯上來(lái),歡迎大家加入Java Web Service的開(kāi)發(fā)行列來(lái)。