本文主要记录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); |