目前Apache 拥有两个版本的axis axis1.X 系列 和 axis2, axis2 并不是axis1.x的升级版本,而是一个全新的版本,用他们自己的话说就是complete re-design and re-write ,从使用上来讲两个版本的axis也有很较大不同,下面依次介绍一下。
- 显示引用文字 -
Axis1.x的安装配置以及简单例子
一. 安装和配置
1. axis1.x 主页 http://ws.apache.org/axis/
axis1.4 下载地址 http://www.apache.org/dist/ws/axis/1_4/axis-bin-1_4.zip
axis1.4 源码下载 http://www.apache.org/dist/ws/axis/1_4/axis-src-1_4.zip
2. 解压 axis-bin-1_4.zip 将子目录 webapps 目录下的axis目录 拷贝到 tomcat/webapps下
3. 从 axis-src-1_4/axis-1_4/lib 中拷贝 activation.jar 到tomcat/common/lib 下
从 jdk_home(例如:"C:/Program Files/Java/jdk1.5.0")/lib下拷贝 tools.jar 到 tomcat/common/lib下
从http://java.sun.com/products/javamail/downloads/index.html 下载javamail-1_4.zip 将其中的mail.jar拷贝到tomcat/common/lib 下
从http://xml.apache.org/security/dist/java-library/ 下载 xml-security-bin-1_3_0.zip 将其中的lib/xmlsec-1.3.0.jar拷贝到 tomcat/common/lib 下
4. 启动 Tomcat,访问 http://127.0.0.1:8080/axis/ 正常将出现 一个Apache Axis的页面 点击其中的 Validation 正常的显示是提示找到了所有
必要组件和可选组件
5. 配置环境变量
AXIS_HOME = Tomcat/webapps/axis
AXIS_LIB = %AXIS_HOME%/lib/WEB-INF/lib
AXISCLASSPATH = .;%AXIS_LIB%/axis.jar;%AXIS_LIB%/commons-discovery-0.2.jar;
%AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/saaj.jar;%AXIS_LIB%/log4j-1.2.8.jar;
%AXIS_LIB%axis-ant.jar; (注意这个) %TomcatHome%/common/lib/activation.jar; .....
也就是lib下所有包的名字,以及步骤3中加入的四个包的名字
另外有个log4j的配置,以后再补
注:为了减少以后的麻烦 ,tomcat 服务器必须占用端口8080
二. 发布服务(两种方式发布,三种方式调用)
A. DII(Dynamic Invocation Interface )方式访问web服务
1. 编写服务器代码
public class HelloWorld
{
public String getName(String name)
{
return "hello "+name;
}
}
- 显示引用文字 -
2. 将源码拷贝到Axis_HOME下,重命名为 HelloWorld.jws
3. 访问连接http://localhost:8080/Axis/HelloWorld.jws?wsdl,页面显示Axis自动生成的wsdl
4. 编写访问服务的客户端代码
import org.apache.Axis.client.Call;
import org.apache.Axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
public class SayHelloClient
{
public static void main(String[] args)
{
try
{
String endpoint =
"http://localhost:8080/Axis/HelloWorld.jws";
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
call.setOperationName(new QName(
"http://localhost:8080/Axis/HelloWorld.jws",
"getName"));
call.setTargetEndpointAddress
(new java.net.URL(endpoint));
String ret = (String) call.invoke(new Object[]
{"zhangsan"});
System.out.println("return value is " + ret);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
B. Dynamic Proxy方式访问服务
1. 编写部署服务端程序,同上边DII方式,本次仍使用上边部署的HelloWorld
2. 编写代理接口
public interface HelloWorldInterface extends java.rmi.Remote
{
public String getName(String name)
throws java.rmi.RemoteException;
}
3. 编写并执行客户端程序TestHelloClient.java
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import java.net.URL;
import javax.xml.namespace.QName;
public class TestHelloClient
{
public static void main(String[] args)
{
try
{
String wsdlUrl =
"http://localhost:8080/Axis/HelloWorld.jws?wsdl";
String nameSpaceUri =
"http://localhost:8080/Axis/HelloWorld.jws";
String serviceName = "HelloWorldService";
String portName = "HelloWorld";
ServiceFactory serviceFactory =
ServiceFactory.newInstance();
Service afService =
serviceFactory.createService(new URL(wsdlUrl),
new QName(nameSpaceUri, serviceName));
HelloWorldInterface proxy = (HelloWorldInterface )
afService.getPort(new QName(
nameSpaceUri, portName),
HelloWorldInterface .class);
System.out.println
("return value is "+proxy.getName("john") ) ;
}catch(Exception ex)
{
ex.printStackTrace() ;
}
}
}
C. 编写wsdd发布web服务,编写stub client访问web服务
1、编写服务端程序SayHello.java,编译SayHello.java
public class SayHello
{
public String getName(String name)
{
return "hello "+name;
}
}
2. 编写LogHandler.java
import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import java.util.Date;
public class LogHandler extends BasicHandler
{
public void invoke(MessageContext msgContext) throws AxisFault
{
/** Log an access each time we get invoked. */
try {
Handler serviceHandler = msgContext.getService();
Integer numAccesses = (Integer)serviceHandler.getOption("accesses");
if (numAccesses == null)
numAccesses = new Integer(0);
numAccesses = new Integer(numAccesses.intValue() + 1);
Date date = new Date();
String result = date + ": service " +msgContext.getTargetService() +" accessed " + numAccesses + " time(s).";
serviceHandler.setOption("accesses", numAccesses);
System.out.println(result);
} catch (Exception e)
{
throw AxisFault.makeFault(e);
}
}
}
3. 编写deploy.wsdd文件
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java= "http://xml.apache.org/axis/wsdd/providers/java">
<handler type="java:LogHandler"/>
<service provider="java:RPC">
<requestFlow>
<handler type="print"/>
</requestFlow>
<parameter value="SayHello"/>
<parameter value="*"/>
</service>
</deployment>
4. 将编译后的文件拷贝到Axis_HOME/WEB-INF/classes下,如:D:/tomcat/webapps/Axis/WEB-INF/classes
5. 发布服务,生成服务配置文件 java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd 正常会输出一个文件server-config.wsdd
6.生成客户端代码
a:方式1
将SayHello.java拷贝到Axis_HOME/下,重命名为SayHello.jws,
执行下面的命令生存client stub
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java -p client http://localhost:8080/axis/SayHello.jws?wsdl
这种方式相当于实际上使用了第一种发布方式来生成 wsdl 文件 然后用WSDL2Java 生成客户端stub代码
b:方式2
这种方式 先用SayHello生成一个静态的SayHello.wsdl 文件,然后用WSDL2Java 生成对应的客户端stub框架
执行如下命令生成SayHello.wsdl
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oSayHello.wsdl -lhttp://localhost:8080/axis/services/SayHello -nsayhello SayHello
执行如下命令生成client stub
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java SayHello.wsdl -p client
生成的stub client文件列表为:
1.SayHello.java
2.SayHelloService.java。
3.SayHelloServiceLocator.java
4.SayHelloSoapBindingStub.java
6、编写客户端程序,编译并执行
public class SayHelloClient
{
public static void main(String[] args)
{
try
{
SayHelloService service = new client.
SayHelloServiceLocator();
client.SayHello_PortType
client = service.getSayHello();
String retValue=client.getName("Your name");
System.out.println(retValue);
}
catch (Exception e)
{
System.err.println
("Execution failed. Exception: " + e);
}
}
}
Axis2 的安装配置以及简单例子
一.安装配置
1. axis2 的主页 http://ws.apache.org/axis2/index.html
axis2 1.0 的下载地址 http://ws.apache.org/axis2/download/1_0/download.cgi
2. servlet 容器安装 (以tomcat5.5 为例)
从上面给出的下载地址下载 War Distribution (axis2.war)
放到 tomcat/webapps 目录下,在浏览器中输入 http://localhost:8080/axis2 正常显示Welcome 的页面,(查看tomcat/webapps 可以看到生成一个名为axis2的文件夹) 点击 Validate 验证安装是否正常
一切正常侯即可使用axis2发布web服务
axis2 web管理环境的用户名:admin 密码:axis2
3. 配置开发相关环境变量
需要添加 AXIS2_HOME = axis2解压目录
为了随处可以使用axis2 提供的代码生成工具,可以在path 环境变量里添加 %AXIS2_HOME%/bin
二.开发服务
axis2 通过两种方式来开发一个web服务,一种方式通过使用axis2 primary APIs
另一种方式使用wsdl文件来生成web服务的客户端和服务端框架代码
A. 通过 axis2 primary APIs 开发web service
这种方式需要学习axis2 对象模型(叫AXIOM)的基础知识 ,而且可扩展性不如后一种方式。
B. 通过wsdl文件开发和测试一个web服务
AXIS2_HOME/samples/wsdl下有wsdl文件的例子 ,以Axis2SampleDocLit.wsdl 为例,简单介绍一下生成框架代码的过程,
1. 在命令行模式里,进入到AXIS2_HOME/samples/wsdl 目录
注意:这个Axis2SampleDocLit.wsdl 文件有点问题,需要将里边 style = "rpc"的地方全部改成 style = "document"
2. 运行 wsdl2java -uri ./Axis2SampleDocLit.wsdl -ss -s d -d xmlbeans -g -o Axis2SampleDocLit -p org.apache.axis2.userguide
这个命令在当前目录生成一个文件夹Axis2SampleDocLit
3. 添加服务: 编辑
Axis2SampleDocLit/src/org/apache/axis2/userguide/Axis2SampleDocLitServiceSkeleton.java 文件
编辑 echoString 方法为
public org.apache.axis2.userguide.xsd.EchoStringReturnDocument echoString(
org.apache.axis2.userguide.xsd.EchoStringParamDocument param4)
{
String >
String retStr = "Hello " + name + "!";
EchoStringReturnDocument esrd = EchoStringReturnDocument.Factory.newInstance();
esrd.setEchoStringReturn(retStr);
return esrd;
}
4 . 进入目录Axis2SampleDocLit,可以看到build.xml,运行ant(ant的安装相当简单 ,下载ant 1.6.5 将 "ant解压目录/bin" 添加到path 环境变量即可)
ant 会告诉你build 成功或者失败 ,
5. build 成功后转到浏览器,进入 http://127.0.0.1:8080/axis2/axis2-admin/ 登陆,Upload Service ,选择
Axis2SampleDocLit/build/lib/Axis2SampleDocLitService.aar,
然后upload ,服务就发布成功了
6. 客户端代码
public static void main(String[] args) {
try {
java.lang.String str = new java.lang.String();
Axis2SampleDocLitServiceStub stub= new Axis2SampleDocLitServiceStub
("http://localhost:8080/axis2/services/Axis2SampleDocLitService");
//Create the request document to be sent.
EchoStringParamDocument reqDoc= EchoStringParamDocument.Factory.newInstance();
reqDoc.setEchoStringParam("Your name");
//invokes the Web service.
EchoStringReturnDocument resDoc = stub.echoString(reqDoc);
System.out.println(resDoc.getEchoStringReturn());
} catch (Exception e) {
e.printStackTrace();
}
}
编译运行,应该可以看到hello Your name 输出
C. 可以通过axis1.x 介绍 C.6.b的介绍 通过java 代码生成wsdl的原型文件
D. 也可以通过Axis2_Codegen_Wizard_1.2.0 eclipse 插件 来开发wsdl 和 框架文件
然后通过Axis_Service_Archiver_1.0.0 eclipse 插件 打包服务
这两个插件的下载地址
http://www.apache.org/dyn/mirrors/mirrors.cgi/ws/axis2/tools/1_0/Axis2_Service_Archiver.zip
http://www.apache.org/dyn/mirrors/mirrors.cgi/ws/axis2/tools/1_0/Axis2_Code_Generator.zip
以Axis2_Codegen_Wizard_1.2.0 为例:
下载后解压 ,解压后的文件夹是一个eclipse 插件工程,导入eclipse 开发环境 , 然后在package explorer 视图中 右键 export
然后选择 deployable plug-ins and .... 然后指定输出目录,这样在输出目录将会生成 plugins 文件夹 ,将该文件夹拷贝到 eclipse 安装目录
重启eclipse ,在new -->other 的列表里应该会出现axis2 wizard 的 项 ,说明安装插件成功,工具的使用请查看
"Axis2_Codegen_Wizard_1.2.0解压目录"/help/wsdl2java-plugin.html