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