Axis開發webservice的簡單實例(轉)

本文主要記錄Axis開發webservice簡單實例的詳細過程和步驟:
Axis官方網站:http://ws.apache.org/axis/
能夠在官網下載最新1.4的包:axis-bin-1_4.zip
將解壓後的axis-1_4\webapps\下的axis目錄考到%TOMCAT_HOME%/Webapps/目錄下
啓動tomcat後在瀏覽器裏輸入http://localhost:8082/axis會看到下圖所示(ps:本人的tomcat端口爲8082html


點擊上圖中的Validataion連接,頁面上會提示已經有的包和缺乏的包的信息,根據提示將必須的包下載全,將這些類包複製到 %tomcathome%/webapps/axis/WEB-INF/lib/目錄下從新啓動tomcat,直到Validation頁面中看不到有Error與Warning的提示信息。 java

若是提示缺乏xmlsec.jar(附件提供下載)能夠到 http://santuario.apache.org/download.html下載. web

Axis支持三種web service的客戶端訪問方式,分別爲: apache

  • Dynamic Invocation Interface ( DII)
  • Dynamic Proxy方式
  • Stubs方式

PS:看到不少資料將上述方式列爲Web Servcie的三種「部署和開發方法,我的以爲有些欠妥 瀏覽器

下面介紹axis部署和發佈web service的方式: tomcat

  • JWS -即時發佈
  • WSDD – 定製發佈

1、JWS 服務器

JWS(Java WebService)是最簡單的一種方式。Axis容許把普通Java類的源文件的擴展名改成.jws,而後把它簡單的copy到AXIS_HOME下。這
樣,Axis 會自動編譯.jws文件,並把它自動加入到Java Web Servie的服務中。很是簡單和靈活,可是這種方式的缺點是:只能是java源代碼,同時類中不能含有包名。具體過程以下 app

1.用Eclipse或者文本編輯器編寫一個java類SayHello.java(此類不含包名) webapp

1 public class SayHello{
2     public String sayMsg(String name){
3         return "Hello,"+name;
4     }
5 }

2.將上面的類(SayHello.java)copy到%tomcat_home%/webapps/axis/目錄下,只須要把類的源文件(不是class)到這個目錄下,重命名爲:SayHello.jws 編輯器

3.打開瀏覽器輸入:http://localhost:8082/axis/SayHello.jws 會看到:


點擊上圖Click to see the WSDL 的連接,就能夠看到生成的wsdl。

4.客戶端Dynamic Invocation Interface ( DII)方式 實現以下:

1 import org.apache.axis.client.Call;
2 import org.apache.axis.client.Service;
3  
4 /**
5  * axis client
6  * @author Michael sun
7  */
8 public class TestClient {
9  
10     /**
11      * @param args
12      * @throws Exception
13      */
14     public static void main(String[] args) throws Exception {
15         String wsdlUrl = "http://localhost:8082/axis/SayHello.jws";
16         // String wsdlUrl=」http://localhost:8080/axis/SayHello.jws?wsdl
17         Service s = new Service();
18         Call call = (Call) s.createCall();
19         call.setOperationName("sayMsg");// 這裏是要調用的方法名
20         call.setTargetEndpointAddress(wsdlUrl);// 設置調用的wsdl
21         String val = (String) call.invoke(new Object[] { "My Michael Sun" });
22         System.out.println("這是webservice服務器返回的信息:" + val);
23     }
24 }

5.客戶端Dynamic Proxy方式 實現以下:

1 public interface SayHelloInterface extends java.rmi.Remote {
2  
3     public String sayMsg(String name) throws java.rmi.RemoteException;
4  
5 }
1 import java.net.URL;
2  
3 import javax.xml.namespace.QName;
4 import javax.xml.rpc.Service;
5 import javax.xml.rpc.ServiceFactory;
6  
7 /**
8  * test Dynamic Proxy client
9  * @author Michael sun
10  */
11 public class TestProxyClient {
12  
13     /**
14      * @param args
15      * @throws Exception
16      */
17     public static void main(String[] args) throws Exception {
18         String wsdlname = "http://localhost:8088/axis/SayHello.jws?wsdl";
19         // 服務路徑
20         String namespaceUrl = "http://localhost:8088/axis/SayHello.jws";
21         // 服務名
22         String serviceName = "SayHelloService";
23         // 服務
24         String portName = "SayHello";
25         // 建立代理對像
26         ServiceFactory service = ServiceFactory.newInstance();
27         // 建立遠程服務
28         Service s = service.createService(new URL(wsdlname), new QName(
29                 namespaceUrl, serviceName));
30  
31         SayHelloInterface proxy = (SayHelloInterface) s.getPort(new QName(
32                 namespaceUrl, portName), SayHelloInterface.class);
33         System.out.println(proxy.sayMsg("Blue boy!"));
34     }
35 }

2、WSDD(Web Service Deployment Descriptor)文件發佈Web Service

1.自定義參數bean和server的代碼以下:

1 package wsaxis.bean;
2  
3 /**
4  * bean
5  * @author Michael sun
6  */
7 public class UserBean {
8  
9     private String userName;
10  
11     private Integer age;
12  
13     /**
14      * @return the userName
15      */
16     public String getUserName() {
17         return userName;
18     }
19  
20     /**
21      * @return the age
22      */
23     public Integer getAge() {
24         return age;
25     }
26  
27     /**
28      * @param pUserName the userName to set
29      */
30     public void setUserName(String pUserName) {
31         userName = pUserName;
32     }
33  
34     /**
35      * @param pAge the age to set
36      */
37     public void setAge(Integer pAge) {
38         age = pAge;
39     }
40  
41 }
1 package wsaxis;
2  
3 import wsaxis.bean.UserBean;
4  
5 /**
6  * axis server
7  * @author Michael sun
8  */
9 public class MessageService {
10  
11     /**
12      * getBeanStr
13      * @param bean
14      * @return String
15      */
16     public String getBeanStr(UserBean bean) {
17         return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge();
18     }
19  
20     /**
21      * checkUser
22      * @param bean
23      * @return String
24      */
25     public String checkUser(UserBean bean) {
26         if ("Michael".equals(bean.getUserName())) {
27             return "Michael welcome to axis ";
28         } else {
29             return bean.getUserName() + " can't access this ws";
30         }
31  
32     }
33  
34 }

2.deploy.wsdd和undeploy.wsdd文件的編寫以下:

deploy.wsdd 文件以下:

WSDD文件描述可參見:http://www.oio.de/axis-wsdd/

1 <deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
3   <service name="MessageService" provider="java:RPC" style="rpc" use="encoded">
4     <parameter name="className" value="wsaxis.MessageService"/>
5     <parameter name="allowedMethods" value="*"/>
6         <typeMapping xmlns:ns1="http://wsaxis.michael.com" qname="ns1:userBean"
7             type="java:wsaxis.bean.UserBean"
8             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
9             deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
10         encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
11        />
12   </service>
13 </deployment>

undeploy.wsdd文件以下:

1 <undeployment
3   <!-- Services from MessageService WSDL service -->
4   <service name="MessageService"/>
5 </undeployment>

3.將上面寫好的兩個類的class文件複製到%tomcat_home%/axis/WEB-INF/class/目錄下,完整的目錄結構複製過來,而後在把兩個wsdd文件複製到%tomcat_home%/axis/WEB-INF/目錄下,打開控制檯進入%tomcat_home%/axis/WEB-INF/目錄下:

>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 deploy.wsdd 

-s  參數指定了AxisServlet所在的應用程序路徑
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 -s /axis/servlet/AxisServlet deploy.wsdd 

-l  參數指定目標應用的URL
>java -Djava.ext.dirs=lib 
org.apache.axis.client.AdminClient 
–lhttp://localhost:8082/axis/services/MessageService deploy.wsdd

這個命令就是發佈這個服務,發佈成功後在控制檯下會有提示:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

同時發佈後會在%tomcat_home%/axis/目錄下,多了一個server-config.wsdd文件.
在瀏覽器輸入:http://localhost:8082/axis/services/MessageService會看到下圖:


4.client的生成方法:

打開控制檯進入%tomcat_home%/axis/WEB-INF/目錄下:

>java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p client http://localhost:8082/axis/services/MessageService?wsdl

會在當前的目錄下生成client文件夾,這個目錄裏文件就是客戶端源碼。

5.經過WSDD文件卸載發佈的webservice:

打開控制檯進入%tomcat_home%/axis/WEB-INF/目錄下:
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

若是不是默認8080端口須要加上參數-p:
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 undeploy.wsdd

PS:java -Djava.ext.dirs=lib 也能夠用java -cp 「lib\*」

6.客戶端Stubs方式實現以下:

1 import java.net.URL;
2  
3 import javax.xml.namespace.QName;
4  
5 import org.apache.axis.client.Call;
6 import org.apache.axis.client.Service;
7 import org.apache.axis.encoding.ser.BeanDeserializerFactory;
8 import org.apache.axis.encoding.ser.BeanSerializerFactory;
9  
10 import stubclient.UserBean;
11  
12 /**
13  * test stub client
14  * @author Michael sun
15  */
16 public class TestStubClient {
17  
18     /**
19      * @param args
20      * @throws Exception
21      */
22     public static void main(String[] args) throws Exception {
23         QName qname = new QName("http://wsaxis.michael.com", "user");
24         Service s = new Service();
25         Call call = (Call) s.createCall();
26         // 註冊這個bean爲可序列化的.傳遞參數
27         call.registerTypeMapping(UserBean.class, qname,
28                 new BeanSerializerFactory(UserBean.class, qname),
29                 new BeanDeserializerFactory(UserBean.class, qname));
30         // 設置一下調用方法名.
31         call.setOperationName("getBeanStr");
32  
33         // 設置一下這個服務的絕對路徑.
34         call.setTargetEndpointAddress(new URL(
35                 "http://localhost:8082/axis/services/MessageService?wsdl"));
36         // 實例化一個UserBean,這個UserBean是生成client的UserBean
37         UserBean u = new UserBean();
38         u.setAge(28);
39         u.setUserName("Michael");
40         // 通知方法,並返回結果
41         String str = (String) call.invoke(new Object[] { u });
42  
43         System.out.println("web service 返回信息:" + str);
44  
45     }
46  
47 }
相關文章
相關標籤/搜索