本文目的在于使用axis快速构建可用于实际项目开发的系统结构,对于SOAP协议理论方面不做赘述。
本文中使用Jetty作为服务器,Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器, 它具有轻量级、高性能和高可靠性、嵌入式、可扩展等优点。
IDE使用eclipse。
服务端构建
服务端项目Axisserver,中,lib下为服务端用到的jar文件,包括jetty相关jar文件和axis相关jar文件,将这些jar文件全部引入到项目中。server-config.wsdd为soap服务端配置文件,包含soap服务访问入口,相关参数,以及自定义的类等信息。AxisServer.java用来启动jetty服务器并注册axis服务。AxisServerInterface.java是用来为客户端提供服务的接口,客户端通过其可以访问所有开放的web services服务。Player.java是自己定义的对象,需要通过axis将此对象在服务端和客户端之间传递。MyException是自定义的异常,用来封装本项目内部的错误。
AxisServer.java
public class AxisServer {
public void start() {
Server server = new Server();
SocketListener listener = new SocketListener();
listener.setPort(8080);
ServletHttpContext context = (ServletHttpContext) server
.getContext("/");
context.setResourceBase("./web/");
try {
context.addServlet("AxisDefault", "/webservices/*",
"org.apache.axis.transport.http.AxisServlet");
server.addContext(context);
server.addListener(listener);
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new AxisServer().start();
}
}
AxisServer.java是项目是启动程序,负责启动jetty服务器,注册web services服务。
AxisServerInterface.java
public class AxisServerInterface {
public String ping() throws MyException {
return "do u hear me?";
}
public Player getPlayer(int id) throws MyException {
if (id
throw new MyException("invalid student");
}
Player s = new Player();
s.setId(id);
s.setName("Bush" + id);
return s;
}
}
本程序是服务端入口,现在提供了ping和getStudent方法。客户端通过axis可以访问这两个服务。
Player.java
public class Player {
private int id;
private String name;
private String team;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTeam() {
return team;
}
public void setTeam(String team) {
this.team = team;
}
}
Player是一个保存数据的对象,负责在服务端和客户端之间传递数据。
MyException.java
public class MyException extends Exception implements Serializable {
String errorMsg;
public MyException() {
}
public MyException(String message) {
errorMsg = message;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
MyException用来封装项目内部产生的异常,通过它,可以将服务端的异常传递到客户端。
server-config.wsdd
qname="ns:Player"
xmlns:ns="http://service.server.axis.mi.com"
languageSpecificType="java:com.mi.axis.server.service.Player"/>
qname="ns:MyException"
xmlns:ns="http://service.server.axis.mi.com"
languageSpecificType="java:com.mi.axis.server.service.MyException"/>
这个文件进行了axis服务端的相关定义,定义了web services的提供者的相关属性,定义了要传递的对象。
客户端构建
Axisclient为客户端项目,它引入了服务端项目的所有axis相关jar文件。Client.java用来演示如何访问web services。build.xml 是为使用ant 来编译产生可供Client.java使用的客户端程序。Axis.wsdl为生成的中间文件。
首先由ant 执行build.xml编译产生客户端程序,然后客户端程序Client.java调用产生了客户端程序访问服务端。
build.xml
Client.java
此程序访问服务端提供的web services,得到相关的结果,执行此程序前,要先启动服务器,即执行AxisSrver.java程序。
public class Client {
public static void main(String[] args) {
AxisServerInterface asi = null;
try {
URL url = new URL("http://localhost:8080/webservices/asi");
AxisServerInterfaceServiceLocator loc = new AxisServerInterfaceServiceLocator();
loc.setMaintainSession(true);
asi = loc.getAxisServerInterfac(url);
System.out.println(asi.ping());
} catch (Exception e) {
}
try {
Player p = asi.getPlayer(12);
System.out.println(p.getName());
p = asi.getPlayer(-12);
} catch (MyException e) {
System.out.println("I've got it");
} catch (RemoteException e) {
System.out.println("sth wrong");
}
}
}
当执行asi.getPlayer(-12);时,catch到系统自定义的异常MyException。
执行:
先启动AxisServer,再执行Client,得到要传递的Player对象,和要catch的MyException异常。
相关程序网址:
eclipse: www.eclipse.org
jetty: jetty.mortbay.org
Axis: www.apache.org