(转)手把手教你用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!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值