關于WEBSERVICE的架構有很多,本章著重記錄Axis框架的簡單應用。在其后的文章中將給出高級應用示例以及SUN公司GLASSFISH中集成的Metro框架的應用。
?
Axis到目前為止,最新版本為1.4版,阿帕奇官網上已經有2年沒有更新過此項目。
?
實例(參考了 axis-bin-1_4.zip \axis-1_4\samples\userguide 中的例子)使用版本為 Axis1.4.
axis-bin-1_4.zip 下載地址 http://www.apache.org/dist/ws/axis/1_4/
工程 axis_example 目錄結構如下:
目錄說明如下:
jws: 存放 *.jws 文件
src : java 源碼 ? ?
WEB-INF/classes : java 編譯后的 class 文件
WEB-INF/lib : 需要用到的 jar 包
? Axis
1. Dynamic Invocation Interface ( DII)
2 . Dynamic Proxy 方式
3. Stubs 方式
JWS文件中不允許帶有包名稱,故只能使用默認包,這種發布方式顯得非常笨拙.
使用WSDD文件發布的WEBSERVICE服務,則相對而言,有更大的靈活性.當使用的使第三方提供的jar包時,無法得到對方提供的源代碼,此時JWS明顯無法勝任自己的工作.而且,使用WSDD文件發布WEB服務,還可以在其中使用如Handler.使用非常方便,故項目中大多使用第三種方式也就是使用WSDD文件發布服務.
?
通過下面三個例子進行說明。 在開始例子前,把
① axis-bin-1_4.zip \axis-1_4\lib 下的所有包拷貝到 axis_example/WEB-INF/lib 目錄下,
② axis-bin-1_4.zip \axis-1_4\webapps\axis\WEB-INF 下的 web.xml 文件拷貝到 axis_example/WEB-INF 目錄下。
實例 1 ( DII )步驟 :
?
1. 在 axis_example /src 下 新建一 MyServic.java 文件,內容為 :
public class MyService { public String processService(String arg){ return arg; } }
??
?
?
?
?
2. 無需編譯 (編譯由 axis 進行 ) ,拷貝 MyServic.java 到 axis_example/jws 目錄下,更改文件名為 MyService.jws 3. 在 axis_example/src 新建一 Client.java 文件,內容為 :
?
import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml.namespace.QName; import javax.xml.rpc.ServiceFactory; import java.net.URL; public class Client { public static void main(String [] args) throws Exception { // 指出service所在URL String endpoint = "http://localhost:" + "8081" + "/axis_example/jws/MyService.jws"; // 創建一個服務(service)調用(call) Service service = new Service(); Call call = (Call) service.createCall();// 通過service創建call對象 // 設置service所在URL call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 方法名(processService)與MyService.java方法名保持一致 call.setOperationName("processService"); // Object 數組封裝了參數,參數為"This is Test!",調用processService(String arg) String ret = (String) call.invoke(new Object[]{"This is Test!"}); System.out.println(ret); } }
? 4. axis_example 工程放入 tomcat/webapps ,啟動 tomcat 。 5. 編譯 Client.java ,運行其中的 main 方法進行測試,可以看到屏幕打印出: "This is Test!" ,可以看到 axis_example/WEB-INF 目錄下生 jwsClasses /jws /MyService.class 文件—— axis 會根據你訪問時的 endpoint ,自動編譯其中的 *.jws 文件,并置于生成的 jwsClasses 相應目錄下。
?
(通過 http://localhost:8081/axis_example/jws/MyService.jws?wsdl 可以查看生成的 WSDL 文件—— SOAP 服務描述文件)
注 1 : 在上面的 new Object[]{"This is Test!"} 語句中,只傳遞了一個參數。如果 MyServic.java 中
processService(String arg) 改寫為
processService(String arg,String arg2)
你可以通過 new Object[]{"test","test2"} 傳遞多個參數。
注 2 : 啟動 tomcat 后控制臺出現下面警告:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.i
?
nternet.MimeMultipart). Attachment support is disabled.
這是因為缺少 activation.jar 和 mail.jar (本文中的實例可以忽略此警告)。
activation.jar (目前版本為 1.1 )下載地址
http://java.sun.com/products/javabeans/jaf/downloads/index.html
mail.jar (目前版本為 1.4 )下載地址
http ://java.sun.com/products/javamail/downloads/
實例 2 ( Dynamic Proxy )步驟 :
1. 在 axis_example /src 下 新建一 MyServiceInterface.java 文件,內容為 :
import java.rmi.Remote; import java.rmi.RemoteException; public interface MyServiceInterface extends Remote { public String processService(String arg) throws RemoteException; }
?? 編譯 MyServiceInterface.java 2. 修改 axis_example /src 下 的 MyServic.java 文件,把類聲明
public class MyService 改為 public class MyService implements MyServiceInterface
3. 無需編譯,拷貝 MyServic.java 到 axis_example/jws 目錄下,更改文件名為 MyService.jws 4. 更改 axis_example/src /Client.java 中的 main 方法,內容為: ?
?
?
5. axis_example 工程放入 tomcat/webapps ,啟動 tomcat 。 ? ?
6. 編譯 Client.java ,運行其中的 main 方法進行測試,可以看到屏幕打印出: " This is Dynamic Proxy test!" 。
實例 3 ( Stubs )步驟 : ? ?
1. 在 axis_example/src 下新建一 MyServic.java 文件,內容為 :
?
public class MyService { public String processService(String arg){ return arg; } }
?
編譯 MyServic.java
2. 在新建一 deploy.wsdd (可參考 axis-bin-1_4.zip \axis-1_4\samples 中的 deploy.wsdd )文件,內容為:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MyService" provider="java:RPC"> <parameter name="className" value="MyService"/> <parameter name="allowedMethods" value="processService"/> </service> </deployment>
?
?
?
?
3. 啟動 tomcat
4. 在 axis_example/WEB-INF 目錄下執行:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8081/axis_example/servlet/AxisServlet deploy.wsdd
?
執行后可看到在 axis_example/WEB-INF 目錄下生成 server-config.wsdd 文件。
5. 重新啟動 tomcat , 以便加載 server-config.wsdd 文件。
6. 更改 axis_example/src /Client.java 中的 main 方法,內容為:
public static void main(String [] args) throws Exception { // 指出service所在URL String endpoint = "http://localhost:" + "8081" + "/axis_example/services/MyService"; // 創建一個服務(service)調用(call) Service service = new Service(); Call call = (Call) service.createCall();// 通過service創建call對象 // 設置service所在URL call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 方法名(processService)與MyService.java方法名保持一致 call.setOperationName("processService"); // Object 數組封裝了參數,參數為"This is Test!",調用processService(String arg) String ret = (String) call.invoke(new Object[]{"This is Test!"}); System.out.println(ret); }
?
?
? 注: 在這里可以看出, DII 方式安全性不高( url MyService.jws 為 axis 自動生成),且無法進行一些復雜的配置, Dynamic Invocation Interface(DII) 和 Stubs 方式的區別主要有兩個地方:
① 兩種不同的 endpoint ?
DII : http://localhost:8081/axis_example/jws/ MyService.jws
Stubs : http://localhost:8081/axis_example/services/MyService
② 兩種不同的編譯方式 ?
DII :根據 endpoint 訪問 web service 時, axis 自動編譯 endpoint 指定的 *.jws 文件,并放在生成的 WEB-INF/ jwsClasses 目錄下。
Stubs :手工編譯 java 文件,手工編寫 server-config.wsdd 配置文件(這里可以編寫 deploy.wsdd ,用 axis 提供的 java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8081/axis_example/servlet/AxisServlet deploy.wsdd
?
命令生成 server-config.wsdd 文件中的其他通用部分)
而 Dynamic Proxy 方式僅僅在 DII 的基礎上采用了代理機制 , 實際上和 DII 區別不大,。
? 7. 編譯 Client.java ,運行其中的 main 方法進行測試,可以看到屏幕打印出: " This is Dynamic Proxy test!"
(通過 http://localhost:8081/axis_example/services/MyService?wsdl 可以查看生成的 WSDL 文件—— SOAP 服務描述文件)
附
axis 提供了 wsdl2java 工具, web service 服務器端提供了一個地址,可以訪問到 WSDL 文件, wsdl2java 工具格式為: java org.apache.axis.wsdl.WSDL2Java [options] WSDL-URI
采用 DII 方式,可以使用
?
java -Djava.ext.dirs= E:\project\axis_example\WEB-INF\lib org.apache.axis.wsdl.WSDL2Java http://localhost:8081/axis_example/jws/MyService.jws?wsdl -p test.mytest -o E:\project\axis_example\src
?
生成相應的客戶端 java 文件。
采用 Stubs 方式,可以使用
java -Djava.ext.dirs= E:\project\axis_example\WEB-INF\lib org.apache.axis.wsdl.WSDL2Java http://localhost:8081/axis_example/services/MyService?wsdl -p test.mytest -o E:\project\axis_example\src
?
生成相應的客戶端 java 文件。
參數
- p ? 指定生成的 java 文件包名
-o ? 指定生成的 java 文件輸出目錄
如果不指定包名, axis 會根據命令參數 WSDL-URI 生成相應的包名,如 localhost\axis_example\jws\MyService_jws
?
上述命令會在 E:\project\axis_example\src\test\mytest 目錄下生成四個文件:
MyServiceSoapBindingStub.java (相當于上面的 MyService.java )
MyService_PortType.java (相當于上面的 MyServiceInterface.java )
MyServiceService.java/MyServiceServiceLocator.java ( Service Locator 模式,隱藏了具體的業務邏輯)
? 編寫 junit 單元測試,在 axis_example\src\test\mytest 下新建一 TestClient.java 文件(拷貝 junit.jar 包到 axis_example/WEB-INF 目錄下),內容為:
package test.mytest; import junit.framework.TestSuite; import junit.framework.TestCase; import junit.framework.Test; public class TestClient extends TestCase { public TestClient(String string) { super(string); } public void MyServiceClient() throws Exception { MyServiceService service = new MyServiceServiceLocator(); MyService_PortType client = service.getMyService() ; String ret = client.processService("This is Junit Test!"); System.out.println(ret); } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new TestClient("MyServiceClient")); return suite; } }
?? 8. 編譯上面四個 service 文件,并編譯運行 TestClient.java ,看到屏幕打印出: " This is Junit Test!"
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
