随着 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 代码
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. }
}
我们需要在这个 webservice 中实现自己的业务方法!我们加入如下业务代码:
java 代码
8. package com.yy.ws;
9.
10. public class MobileBossSoapBindingImpl implements com.yy.ws.MobileBoss {
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
服务器段成功返回消息,大功告成!不是很难吧?!这篇文章的所有代码我都测试过,全部可以直接使用。希望能够对大家有所帮助。