本文主要記錄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端口爲8082) html
點擊上圖中的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
1、JWS 服務器
JWS(Java WebService)是最簡單的一種方式。Axis容許把普通Java類的源文件的擴展名改成.jws,而後把它簡單的copy到AXIS_HOME下。這
樣,Axis 會自動編譯.jws文件,並把它自動加入到Java Web Servie的服務中。很是簡單和靈活,可是這種方式的缺點是:只能是java源代碼,同時類中不能含有包名。具體過程以下 app
1.用Eclipse或者文本編輯器編寫一個java類SayHello.java(此類不含包名) webapp
2 |
public String sayMsg(String name){ |
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; |
8 |
public class TestClient { |
14 |
public static void main(String[] args) throws Exception { |
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); |
5.客戶端Dynamic Proxy方式 實現以下:
1 |
public interface SayHelloInterface extends java.rmi.Remote { |
3 |
public String sayMsg(String name) throws java.rmi.RemoteException; |
3 |
import javax.xml.namespace.QName; |
4 |
import javax.xml.rpc.Service; |
5 |
import javax.xml.rpc.ServiceFactory; |
8 |
* test Dynamic Proxy client |
11 |
public class TestProxyClient { |
17 |
public static void main(String[] args) throws Exception { |
22 |
String serviceName = "SayHelloService"; |
24 |
String portName = "SayHello"; |
26 |
ServiceFactory service = ServiceFactory.newInstance(); |
28 |
Service s = service.createService(new URL(wsdlname), new QName( |
29 |
namespaceUrl, serviceName)); |
31 |
SayHelloInterface proxy = (SayHelloInterface) s.getPort(new QName( |
32 |
namespaceUrl, portName), SayHelloInterface.class); |
33 |
System.out.println(proxy.sayMsg("Blue boy!")); |
2、WSDD(Web Service Deployment Descriptor)文件發佈Web Service
1.自定義參數bean和server的代碼以下:
7 |
public class UserBean { |
9 |
private String userName; |
16 |
public String getUserName() { |
23 |
public Integer getAge() { |
28 |
* @param pUserName the userName to set |
30 |
public void setUserName(String pUserName) { |
35 |
* @param pAge the age to set |
37 |
public void setAge(Integer pAge) { |
3 |
import wsaxis.bean.UserBean; |
9 |
public class MessageService { |
16 |
public String getBeanStr(UserBean bean) { |
17 |
return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge(); |
25 |
public String checkUser(UserBean bean) { |
26 |
if ("Michael".equals(bean.getUserName())) { |
27 |
return "Michael welcome to axis "; |
29 |
return bean.getUserName() + " can't access this ws"; |
2.deploy.wsdd和undeploy.wsdd文件的編寫以下:
deploy.wsdd 文件以下:
WSDD文件描述可參見:http://www.oio.de/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="*"/> |
7 |
type="java:wsaxis.bean.UserBean" |
8 |
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" |
9 |
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" |
undeploy.wsdd文件以下:
3 |
<!-- Services from MessageService WSDL service --> |
4 |
<service name="MessageService"/> |
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方式實現以下:
3 |
import javax.xml.namespace.QName; |
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; |
10 |
import stubclient.UserBean; |
16 |
public class TestStubClient { |
22 |
public static void main(String[] args) throws Exception { |
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)); |
31 |
call.setOperationName("getBeanStr"); |
34 |
call.setTargetEndpointAddress(new URL( |
36 |
// 實例化一個UserBean,這個UserBean是生成client的UserBean |
37 |
UserBean u = new UserBean(); |
39 |
u.setUserName("Michael"); |
41 |
String str = (String) call.invoke(new Object[] { u }); |
43 |
System.out.println("web service 返回信息:" + str); |