转载自:http://www.javaeye.com/wiki/Axis-Webservice/924-手把手教你用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.javaeye.com/blog/56519 和http://yangyang.javaeye.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
<Admin>Done processing</Admin>
则表示发布成功!
好了,现在我们已经完成了创建和发布过程,接下来我们来进行最后一步工作——调用我们写的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
服务器段成功返回消息,大功告成!不是很难吧?!这篇文章的所有代码我都测试过,全部可以直接使用。希望能够对大家有所帮助。