手把手教你用axis创建自己的webservice

源网址:http://www.iteye.com/subject/Axis-Webservice

随着SOA的流行,webservice开发也变得相当的热门。许多企业都将自己的网站迁移到soa的架构。今天我们来一起体验一下通过axis来创建、发布和调用webservice的过程。如果大家不太了解SOA请访问下面网址(http://www-900.ibm.com/cn/software/rational/solution/tech/soa_design.shtml)

        在开始之前我默认大家已经具有axis的安装经验,如果对axis安装和配置发布有任何问题请看http://yangyang.iteye.com/blog/56519 和http://yangyang.iteye.com/blog/56552两篇文章。let's go!

       首先我们先假设一个需求。我们需要一个service,功能是给手机充值,充值成功后返回操作代码和消息。给手机充值需要手机号、充值金额、操作类型。操作成功或者失败后返回操作代码和消息。在这里我们将客户端的请求和服务器端响应进行了包装代码如下:

java 代码

1.          package com.yy.ws;  

2.          public class ClientRequest {  

3.              private String opType;  

4.              private int amount;  

5.              private String phoneNumber;  

6.              public int getAmount() {  

7.                  return amount;  

8.              }  

9.              public void setAmount(int amount) {  

10.               this.amount = amount;  

11.           }  

12.           public String getOpType() {  

13.               return opType;  

14.           }  

15.           public void setOpType(String opType) {  

16.               this.opType = opType;  

17.           }  

18.           public String getPhoneNumber() {  

19.               return phoneNumber;  

20.           }  

21.           public void setPhoneNumber(String phoneNumber) {  

22.               this.phoneNumber = phoneNumber;  

23.           }  

24.       }  

optype代表操作类型,也可以用枚举类型。amount代表充值金额。phoneNumber代表手机号。

下面是服务器响应对象。如下:

java 代码

1.          package com.yy.ws;  

2.          public class ServerResponse {  

3.              private long resultCode;  

4.              private String message;  

5.              public String getMessage() {  

6.                  return message;  

7.              }  

8.              public void setMessage(String message) {  

9.                  this.message = message;  

10.           }  

11.           public long getResultCode() {  

12.               return resultCode;  

13.           } 

14.           public void setResultCode(long resultCode) {  

15.               this.resultCode = resultCode;  

16.           }  

17.       }  

resultCode代表充值操作代码。message代表服务器端操作成功与否的消息。


下面我们通过axis提供的一个工具org.apache.axis.wsdl.Java2WSDL.来产生wsdl文件。Java2WSDL是一个根据axis用户提供的webservice接口来产生相应的wsdl文件。在接口中我们定义了webservice的所有方法(服务)。如果大家不知道wsdl请查阅相应资料。http://www.ibm.com/developerworks/cn/webservices/ws-intwsdl/part1/#N10054

interface代码如下:

java 代码

1.   package com.yy.ws;  

2.    

3.   public interface MobileBoss {  

4.          public ServerResponse charge(ClientRequest req);  

5.   } 

这个接口定义了一个名字为MobileBoss的webservice,其中一个服务名字为charge。下面我们通过Java2WSDL工具生成这个ws的wsdl文件。

进入接口所在源文件的文件夹(包的最上层,如果包名是com.yy.ws则需要在com的上一层目录下如classes),我的文件夹结构是classes/com/yy/ws/所以我需要进入源文件目录:

C:\ws>cd classes

在控制台输入如下命令:

C:\ws\classes>  java org.apache.axis.wsdl.Java2WSDL  -o mb.wsdl -l "http://localhost:8080/axis/services/MobileBoss" -n "urn:MobileBoss" -p"com.yy.ws" "urn:MobileBoss"  com.yy.ws.MobileBoss

参数说明: -o  输出wsdl文件名称

                   -l 访问的url

                  -n 命名空间

                 -p  包名 命名空间的名字(urn:是命名空间的缩写,必须有!)

               com.yy.ws.MobileBoss 是接口的全路径。包名+类名。

如果没有抛出异常,我们就可以在C:\ws\classes文件夹下找到mb.wsdl.

这个mb.wsdl文件描述的这个ws的所有信息,包括请求响应对象、访问url、端口等等信息。这个文件是由axis的Java2WSDL  工具生成的,怎么样?是不是很方便啊!


       下面我们来通过org.apache.axis.wsdl.WSDL2Java来生成相应的webservice代码。

进入wsdl文件所在目录。

C:\ws> cd classes

键入如下命令:

C:\ws\classes> java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true  -Nurn:MobileBoss com.yy.ws mb.wsdl

参数说明: -o 输出文件所在目录( .-代表当前目录 )

                   -s生成server端绑定代码

                   -d发布范围

                  -S是否产生发布和撤销webservice的deploy.wsdd和undeploy.wsdd文件。ture代表生成发布文件。

                  -Nurn:命名空间 包名

                 mb.wsdl - wsdl文件名。

如果没有抛出异常,我们就可以在C:\ws\classes文件夹下找到下面几个文件:

ClientRequest.java

MobileBoss.java

MobileBossService.java

MobileBossServiceLocator.java

MobileBossSoapBindingImpl.java

MobileBossSoapBindingSkeleton.java

MobileBossSoapBindingStub.java

ServerResponse.java

deploy.wsdd 和undeploy.wsdd。

除了最后两个发布文件以外最重要的有两个文件,即MobileBossSoapBindingImpl.java和MobileBossServiceLocator.java

MobileBossSoapBindingImpl代码如下:

java 代码

1.   java 代码

/** 

2.           * MobileBossSoapBindingImpl.java 

3.           * 

4.           * This file was auto-generated from WSDL 

5.           * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter. 

6.           */ 

7.           

8.          package com.yy.ws;  

9.           

10.       public class MobileBossSoapBindingImpl implements com.yy.ws.MobileBoss{  

11.           public com.yy.ws.ServerResponse charge(com.yy.ws.ClientRequest in0) throws java.rmi.RemoteException {  

12.               return null;  

13.           }  

14.        

15.       }  

我们需要在这个webservice中实现自己的业务方法!我们加入如下业务代码:

java 代码

1.          /** 

2.           * MobileBossSoapBindingImpl.java 

3.           * 

4.           * This file was auto-generated from WSDL 

5.           * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter. 

6.           */ 

7.           

8.          package com.yy.ws;  

9.           

10.       public class MobileBossSoapBindingImpl implements com.yy.ws.MobileBoss {  

11.        

12.           /* 

13.            *  

14.            * implements the service methods 

15.            */ 

16.           public com.yy.ws.ServerResponse charge(com.yy.ws.ClientRequest req)  

17.                   throws java.rmi.RemoteException {  

18.               String bizInfo = req.getPhoneNumber() + "/" + req.getOpType() + "/" 

19.                       + req.getAmount();  

20.               System.out.println(bizInfo);  

21.               System.out.println(req.getPhoneNumber() + "is charged successfully!");  

22.               ServerResponse res = new ServerResponse();  

23.               res.setMessage(bizInfo);// save service informations.  

24.               res.setResultCode(8888);// save result code.  

25.               return res;  

26.           }  

27.        

28.       }  

好了现在我们将webservice的实现代码发布到tomcat的axis web应用中。如将你的代码拷贝到axis/WEB-INF/classes下

进入你的deploy.wsdd所在目录。

cd C:\tomcat5\webapps\axis\WEB-INF\classes\com\yy\ws

输入如下命令:

C:\tomcat5\webapps\axis\WEB-INF\classes\com\yy\ws>   java     org.apache.axis.client.AdminClient  deploy.wsdd

AdminClient  -一个axis发布工具,会自动地将你的webservice发布到WEB-INF下的server-config.wsdd文件中。如果显示:

Processing file deploy.wsdd
Done processing

则表示发布成功!

       好了,现在我们已经完成了创建和发布过程,接下来我们来进行最后一步工作——调用我们写的webservice!

     

java 代码

1.          package com.yy.ws.test;  

2.           

3.          import java.net.MalformedURLException;  

4.          import java.rmi.RemoteException;  

5.           

6.          import javax.xml.rpc.ServiceException;  

7.           

8.          import com.yy.ws.ClientRequest;  

9.          import com.yy.ws.MobileBoss;  

10.       import com.yy.ws.MobileBossService;  

11.       import com.yy.ws.MobileBossServiceLocator;  

12.       import com.yy.ws.ServerResponse;  

13.        

14.       public class Test {  

15.           public static void main(String args[]) throws ServiceException, MalformedURLException, RemoteException{  

16.               ClientRequest req = new ClientRequest();  

17.               req.setAmount(1000);  

18.               req.setOpType("charge");  

19.               req.setPhoneNumber("13912345678");  

20.               MobileBossService sl = new MobileBossServiceLocator();  

21.               //URL url = new URL("http://localhost:8080/axis/services/MobileBoss");  

22.               //s.getMobileBoss(url);  

23.               MobileBoss mb = sl.getMobileBoss();//default port  

24.               ServerResponse resp = mb.charge(req);  

25.               System.out.println("client result:"+resp.getResultCode()+"\nclient message:"+resp.getMessage());  

26.           }  

27.       }  

结果如下:

服务器端显示:

13912345678|charge|1000
13912345678is charged successfully!

客户端显示:

client result:8888

client message:13912345678|charge|1000

      服务器段成功返回消息,大功告成!不是很难吧?!这篇文章的所有代码我都测试过,全部可以直接使用。希望能够对大家有所帮助。

axis可以随意部署在大部分web application server上,如:tomcat。它与你自己部署的应用几乎没有任何的耦合关系你只需要在你的web.xml中配置一下axis就可以正常使用了。这样我们能够很方便的将axis集成到我们自己开发的项目上。具体的配置如下:

xml 代码
<listener>  
       <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListenerlistener-class>  
   listener>  
<servlet>  
   <servlet-name>AxisServletservlet-name>  
   <display-name>Apache-Axis Servletdisplay-name>  
   <servlet-class>  
       org.apache.axis.transport.http.AxisServlet   
   servlet-class>  
servlet>  
<servlet>  
   <servlet-name>AdminServletservlet-name>  
   <display-name>Axis Admin Servletdisplay-name>  
   <servlet-class>  
       org.apache.axis.transport.http.AdminServlet   
   servlet-class>  
   <load-on-startup>100load-on-startup>  
servlet>  
<servlet>  
   <servlet-name>SOAPMonitorServiceservlet-name>  
   <display-name>SOAPMonitorServicedisplay-name>  
   <servlet-class>  
       org.apache.axis.monitor.SOAPMonitorService   
   servlet-class>  
   <init-param>  
     <param-name>SOAPMonitorPortparam-name>  
     <param-value>5001param-value>  
   init-param>  
   <load-on-startup>100load-on-startup>  
servlet>  
<servlet-mapping>  
   <servlet-name>AxisServletservlet-name>  
   <url-pattern>/servlet/AxisServleturl-pattern>  
servlet-mapping>  
<servlet-mapping>  
   <servlet-name>AxisServletservlet-name>  
   <url-pattern>*.jwsurl-pattern>  
servlet-mapping>  
<servlet-mapping>  
   <servlet-name>AxisServletservlet-name>  
   <url-pattern>/services/*url-pattern>  
servlet-mapping>  
<servlet-mapping>  
   <servlet-name>SOAPMonitorServiceservlet-name>  
   <url-pattern>/SOAPMonitorurl-pattern>  
servlet-mapping>  
<session-config>  
       <!-- Default to 5 minute session timeouts -->  
       <session-timeout>5session-timeout>  
   session-config>  
<mime-mapping>  
   <extension>wsdlextension>  
    <mime-type>text/xmlmime-type>  
mime-mapping>  
<mime-mapping>  
   <extension>xsdextension>  
   <mime-type>text/xmlmime-type>  
mime-mapping>  

    只要将上述的配置信息加入到你的web应用中就可以将Axis集成到你自己的项目中去了。还有一点需要说明,那就是除了这个配置以外还有将你的Axis.jar和其他必要的jar文件加入到你的WEB-INF/lib目录中,以及发布你的的webservice的classes到WEB-INF/classes/中。

接《用Axis创建的Webservice的集成与发布(上)》。

        需要说明的有下面两个配置:

<servlet-mapping>     
  <servlet-name>AxisServlet</servlet-name>     
  <url-pattern>/services/*</url-pattern>     
</servlet-mapping>     

       这个配置了指出所有webservice的访问都是以 "web应用名/service/webservice名称" 的形式来访问的。你可以更改它的名字,但是请注意。这个需要与你的其他webservice配置文件匹配或者说同步。如WEB-INF下的server-config.wsdd文件中对webservice的配置。还有java2wsdl和wsdl2java工具生成的代码中的配置。如:wsdl2java工具生成的类MobileBossServiceLocator 类中的这个URL的默认配置
private java.lang.String MobileBoss_address = "http://localhost:8080/axis/services/MobileBoss";  


        除了上面的那个配置以外还有一个比较重要的配置:
  <servlet-mapping>     
  <servlet-name>AxisServlet</servlet-name>     
  <url-pattern>*.jws</url-pattern>     
</servlet-mapping>     

        这个是通过jws既java源代码的方式发布webservice。这种情况用的比较少。知道有这个配置才能使用jws就可以了。
当然了除了这两个配置以外还有许多配置如timeout配置和监控器配置,这里就不多说了。我会在以后的高级应用中说明其他配置的功用。祝大家工作顺利。that's all!

你可能感兴趣的:(java,apache,webservice,servlet,SOA)