用Java 开发 WebService Axis简单实例
2012-02-20 12:56
926 查看
今天开始做毕设了,要用到webservice,于是开始尝试着开发自己的websevice。
同时借鉴了下面2篇文章:
/article/10395390.html
http://www.liuzm.com/article/java/992.htm
下面开始编写第一个webservice实例。
准备步骤:
1.下载axis,http://apache.mirror.phpchina.com/ws/axis
2.把它放在tomcat的webapps目录下面。
3.启动tomcat。http://localhost:8080/axis,点击validation。查看自己是否缺少什么包。如果缺少觉下载后放到axis/web-inf/lib文件夹里面4配置环境变量:AXIS_HOME:C:\software\apache-tomcat-5.5.20\webapps\axis(本人的目录,以下如同。自己按照自己的命令设置)
AXIS_LIB:C:\software\apache-tomcat-5.5.20\webapps\axis\WEB-INF\lib
classpath:;%AXIS_LIB%/axis.jar;%AXIS_LIB%/activation.jar;%AXIS_LIB%/axis-ant.jar;%AXIS_LIB%/commons-discovery-0.2.jar;%AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/log4j-1.2.8.jar;%AXIS_LIB%/mail.jar;%AXIS_LIB%/saaj.jar;%AXIS_LIB%/wsdl4j-1.5.1.jar;%AXIS_LIB%/xmlsec-1.4.0.jar;%AXIS_LIB%/dom4j-1.6.1.jar;%AXIS_LIB%/mail.jar;%AXIS_LIB%/activation.jar;
接下来就是编程序了:
webservice开发有3种方式:
1、Dynamic
Invocation Interface ( DII)
2、Stubs
3、Dynamic
Proxy
第一种Dynamic Invocation InterFace(DII) 开发方式
步骤1:打开eclipse创建一个新项目编写一个类.代码如下:
public class SayHello {//这个类没有包,注意了.
public String say(String name){
[b] return " Hello ~~" + name;
}
}[/b]
步骤2:
编写好上面的类(SayHello.java)后,将源代码copy到%tomcat_home%webapps
/axis/目录下.这里要注意了,只需要把类考备到这个目录下
,然后重命名为:SayHello.jws
步骤3:
打开你的浏览器:http://localhost:8080/axis/SayHello.jws 打开页面后你会看到
Click to see the WSDL <--点击链接,如果你上面的步骤都正常,类也没有带
包的话,那么就生成了wsdl了.
恭喜你!到这里DII方式的服务器端编写完成了.接下来我们来看一下客户端是怎么调
用的
步骤4:DII方式的客户端的调用.
首先将axis/web-inf/lib/目录下的axis.jar,commons-discovery-0.2.jar,
comm.ons-logging-1.0.4.jar导入到刚才的项目中,因为编写客户端时
要用到这些包.客户端代码如下:
package com.huwd.web;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class ToClient {
public static void main(String args[]) throws Exception {
String urlname = "http://localhost:8080/axis/SayHello.jws";
//这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl”
Service s = new Service();
Call call = (Call)s.createCall();
call.setOperationName("say");//注意。这里是要调用的方法名
call.setTargetEndpointAddress(urlname);//设置调用的目标url
String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"});
//设置调用方法中的参数
System.out.println("这是webservice服务器返回给你的:>>>>"+val);
}
}
运行结果输出:Hello ~~我是Blue’s Boy;
到此DII调用方式完成!接下来要讲的是第二种方式的调用.请继续学习第二种方式
第二种:Stubs 开发方式(stubs 故名思意,存根的方式)
Stubs 方式相对要复杂一点.不过如果学会了这种方式,嘿嘿,那你开发的时候
就会明显比第一种方式快了,接下来,跟我一起学吧.
步骤1:
编码开始!这里要稍讲得详细并复杂一点了,我们上面看到了,只设置了一个普通
的参数,这里我就写一下自定义数据类型参数的传递.网上很多文章只讲到了
普通数据类型做参数传递.
服务器端的编写,代码与注释如下:
首先定义自定义参数类(第一个类)
package com.web.test;
publicclass UserBean
{//自定义数据类型.
//很简单,只有一个String 与int 型
private String name="";
privateint age ;
publicint getAge()
{
returnage;
}
publicvoid setAge(int age)
{
this.age =
age;
}
public String
getName() {
returnname;
}
publicvoid setName(String
name) {
this.name =
name;
}
}
其次编写第二个类Webservice服务器端类
package com.web.test;
publicclass Server
{//服务器端
//服务端,传递的是一个自定义的数据类型.
UserBean
public String getBeanStr(UserBean bean){
return"You Name:"+bean.getName() +
" , You Age:" + bean.getAge();
}
}
最后编写一个deploy.wsdd文件如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!--这里的stubs为wsdd描述符中的ServiceNamespace
-->
<service name="stubs" provider="java:RPC">
<!--这里的ClassName就是我的服务类了,这个服务主要功能就是传递一个自定义的对象 -->
<parameter name="className" value="com.web.test.Server"/>
<!--这里描术的意思是,此服务类中的方法全部享出来.value值为*号 如果你只想让你的
客户端只能调用其中一个方法时,value值改为方法名就可以了 -->
<parameter name="allowedMethods" value="*"/>
<!--这个typeMapping 是类型映射,使传递的参数序列化用反序列化,一个自定义类型
在要网络上传递,那就一定得让他序列化. -->
<typeMapping
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
<!--这是Qname名称的定义 -->
qname="ns1:user"
<!--序列化类配置 -->
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
<!--我的数据参数类型类路径 -->
type="java:com.web.test.UserBean"
<!--Qname对映的key -->
xmlns:ns1="urn:BeanService"
/>
</service>
</deployment>
到这一步,我们的服务端配置完成,整理一下思路,stubs方式调用需要
(这里主要是为了讲述自定义类的对像传递)
1.一个自定义类.2,一个服务端类,3.一个wsdd文件服务描术符.OK接着看.
将上面写好的两个类的class文件复制到/axis/web-inf/class目录下,只要把整个包复制过来就
行了,然后在把deploy.wsdd文件复制到/axis/web-inf/目录下.
打开控制台进入你的axis目录:
>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)
>java org.apache.axis.client.AdminClient deploy.wsdd –l http://localhost:8080/axis/services/stubs
(说明: stubs就是刚才我们在deploy.wsdd文件里配置的<service name="stubs" )
这里是关键.这个命令就是发布这个服务.你只需这样理解它.发布成功后,你在看下你的
Axis/web-inf/目录下,多了一个server-config.wsdd文件,你可打开它看下里成的描述符
是不是跟我们写的deploy.wsdd相类似呢?
如果发布失败,那么在控制台下你将会看到一些错误信息,并仔细的解决它.
(注:一般错误的原因有这么几点,我个人在开发学习时,可能是类路径没有写对,也
可能是你的<service name="stubs" 这个名称有点错误,你要么改成别的名称试试
也有可能是你的wsdd文件里面写得不规范,最后可能就是你的命令无效,
ClassNotFoundException 错误,这个错误是因为你没有配置好axis的环境造
成的.)
发布成功后在控制台下会有提示:
Processing file deploy.wsdd
<Admin>Done processing</Admin>
OK当您发布成功后.可以开始往下写了.
步骤3:
嘿.完成了上面两个步骤,接下来的工作就是很轻松的了,我们来生成一个客户端
>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)控制台命令
>java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis/
services/stubs?wsdl
打开axis/web-inf/目录下可以看到生成了一个client目录,OK,复制client目录,到你
的项目中.这个client就是我们的客户端代码了.
Client目录生成了:
Server.java
ServerService.java
ServerServiceLocator.java
StubsSoapBindingStub.java
User.java
java文件;
接下来的工作就是编写一个调用类测试.代码与注释如下
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
publicclass Test {
publicstaticvoid main(String []args) throws Exception {
QName qname = new QName("urn:BeanService","user");
Service s = new Service();
Call call = (Call)s.createCall();
//注册这个bean为可序列化的.传递参数
call.registerTypeMapping(User.class, qname, new BeanSerializerFactory(User.class,qname), newBeanDeserializerFactory(User.class,qname));
//设置一下调用方法名.不设置肯定会报错的哦
call.setOperationName("getBeanStr");
//设置一下这个服务的绝对路径.
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/stubs?wsdl"));
//实例化一个User,这个User是生成出来的User哦.,不是原先那个,
User u = new User();
u.setAge(23);
u.setName("do WebService!");
//通知方法,并返回结果
String str = (String)call.invoke(new Object[]{u});
System.out.println(str);
//out.print ==> You Name:do WebService! , You Age:23
}
}
第三种: Dynamic Proxy方式 (代理方式)
这个例子就以第一种方式为基础,因这服务端类的编写是一样的.
那么服务端类就是第一种方式的类了,(完成第一种方式的3个步骤)
主要讲一下客户端通过代理接口的方式调用.
接口这义
import java.rmi.Remote;
import java.rmi.RemoteException;
publicinterface SayHelloInter extends Remote{
public String say(String
name) throws RemoteException;
}
//客户端的调用类如下:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
publicclass Test2 {
publicstaticvoid main(String
[]args) throws Exception{
String wsdlname = "http://localhost:8080/axis/SayHello.jws?wsdl";
//服务路径
String namespaceUrl = "http:// localhost:8080/axis/SayHello.jws";
//服务名
String serviceName = "SayHelloService";
//服务
String portName = "SayHello";
//创建代理对像
ServiceFactory service = ServiceFactory.newInstance();
//创建远程服务
Service s = service.createService(new URL(wsdlname), new QName(namespaceUrl,serviceName));
//向上转型为接口
AxisWebInter inter = (AxisWebInter)s.getPort(new QName(namespaceUrl,portName), AxisWebInter.class
);
System.out.println(inter.getName("Blue
boy!"));
}
}
//Out.print Hi~~ Blue boy!
好了,到现在为止三种调用方式都描术完了,不知道你有没有学会.如果还有什么问题,可
以给我留言,我会给你及时回复.如有不对的地方请指出.Thank you !
同时借鉴了下面2篇文章:
/article/10395390.html
http://www.liuzm.com/article/java/992.htm
下面开始编写第一个webservice实例。
准备步骤:
1.下载axis,http://apache.mirror.phpchina.com/ws/axis
2.把它放在tomcat的webapps目录下面。
3.启动tomcat。http://localhost:8080/axis,点击validation。查看自己是否缺少什么包。如果缺少觉下载后放到axis/web-inf/lib文件夹里面4配置环境变量:AXIS_HOME:C:\software\apache-tomcat-5.5.20\webapps\axis(本人的目录,以下如同。自己按照自己的命令设置)
AXIS_LIB:C:\software\apache-tomcat-5.5.20\webapps\axis\WEB-INF\lib
classpath:;%AXIS_LIB%/axis.jar;%AXIS_LIB%/activation.jar;%AXIS_LIB%/axis-ant.jar;%AXIS_LIB%/commons-discovery-0.2.jar;%AXIS_LIB%/commons-logging-1.0.4.jar;%AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/log4j-1.2.8.jar;%AXIS_LIB%/mail.jar;%AXIS_LIB%/saaj.jar;%AXIS_LIB%/wsdl4j-1.5.1.jar;%AXIS_LIB%/xmlsec-1.4.0.jar;%AXIS_LIB%/dom4j-1.6.1.jar;%AXIS_LIB%/mail.jar;%AXIS_LIB%/activation.jar;
接下来就是编程序了:
webservice开发有3种方式:
1、Dynamic
Invocation Interface ( DII)
2、Stubs
3、Dynamic
Proxy
第一种Dynamic Invocation InterFace(DII) 开发方式
步骤1:打开eclipse创建一个新项目编写一个类.代码如下:
public class SayHello {//这个类没有包,注意了.
public String say(String name){
[b] return " Hello ~~" + name;
}
}[/b]
步骤2:
编写好上面的类(SayHello.java)后,将源代码copy到%tomcat_home%webapps
/axis/目录下.这里要注意了,只需要把类考备到这个目录下
,然后重命名为:SayHello.jws
步骤3:
打开你的浏览器:http://localhost:8080/axis/SayHello.jws 打开页面后你会看到
Click to see the WSDL <--点击链接,如果你上面的步骤都正常,类也没有带
包的话,那么就生成了wsdl了.
恭喜你!到这里DII方式的服务器端编写完成了.接下来我们来看一下客户端是怎么调
用的
步骤4:DII方式的客户端的调用.
首先将axis/web-inf/lib/目录下的axis.jar,commons-discovery-0.2.jar,
comm.ons-logging-1.0.4.jar导入到刚才的项目中,因为编写客户端时
要用到这些包.客户端代码如下:
package com.huwd.web;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class ToClient {
public static void main(String args[]) throws Exception {
String urlname = "http://localhost:8080/axis/SayHello.jws";
//这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl”
Service s = new Service();
Call call = (Call)s.createCall();
call.setOperationName("say");//注意。这里是要调用的方法名
call.setTargetEndpointAddress(urlname);//设置调用的目标url
String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"});
//设置调用方法中的参数
System.out.println("这是webservice服务器返回给你的:>>>>"+val);
}
}
运行结果输出:Hello ~~我是Blue’s Boy;
到此DII调用方式完成!接下来要讲的是第二种方式的调用.请继续学习第二种方式
第二种:Stubs 开发方式(stubs 故名思意,存根的方式)
Stubs 方式相对要复杂一点.不过如果学会了这种方式,嘿嘿,那你开发的时候
就会明显比第一种方式快了,接下来,跟我一起学吧.
步骤1:
编码开始!这里要稍讲得详细并复杂一点了,我们上面看到了,只设置了一个普通
的参数,这里我就写一下自定义数据类型参数的传递.网上很多文章只讲到了
普通数据类型做参数传递.
服务器端的编写,代码与注释如下:
首先定义自定义参数类(第一个类)
package com.web.test;
publicclass UserBean
{//自定义数据类型.
//很简单,只有一个String 与int 型
private String name="";
privateint age ;
publicint getAge()
{
returnage;
}
publicvoid setAge(int age)
{
this.age =
age;
}
public String
getName() {
returnname;
}
publicvoid setName(String
name) {
this.name =
name;
}
}
其次编写第二个类Webservice服务器端类
package com.web.test;
publicclass Server
{//服务器端
//服务端,传递的是一个自定义的数据类型.
UserBean
public String getBeanStr(UserBean bean){
return"You Name:"+bean.getName() +
" , You Age:" + bean.getAge();
}
}
最后编写一个deploy.wsdd文件如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!--这里的stubs为wsdd描述符中的ServiceNamespace
-->
<service name="stubs" provider="java:RPC">
<!--这里的ClassName就是我的服务类了,这个服务主要功能就是传递一个自定义的对象 -->
<parameter name="className" value="com.web.test.Server"/>
<!--这里描术的意思是,此服务类中的方法全部享出来.value值为*号 如果你只想让你的
客户端只能调用其中一个方法时,value值改为方法名就可以了 -->
<parameter name="allowedMethods" value="*"/>
<!--这个typeMapping 是类型映射,使传递的参数序列化用反序列化,一个自定义类型
在要网络上传递,那就一定得让他序列化. -->
<typeMapping
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
<!--这是Qname名称的定义 -->
qname="ns1:user"
<!--序列化类配置 -->
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
<!--我的数据参数类型类路径 -->
type="java:com.web.test.UserBean"
<!--Qname对映的key -->
xmlns:ns1="urn:BeanService"
/>
</service>
</deployment>
到这一步,我们的服务端配置完成,整理一下思路,stubs方式调用需要
(这里主要是为了讲述自定义类的对像传递)
1.一个自定义类.2,一个服务端类,3.一个wsdd文件服务描术符.OK接着看.
将上面写好的两个类的class文件复制到/axis/web-inf/class目录下,只要把整个包复制过来就
行了,然后在把deploy.wsdd文件复制到/axis/web-inf/目录下.
打开控制台进入你的axis目录:
>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)
>java org.apache.axis.client.AdminClient deploy.wsdd –l http://localhost:8080/axis/services/stubs
(说明: stubs就是刚才我们在deploy.wsdd文件里配置的<service name="stubs" )
这里是关键.这个命令就是发布这个服务.你只需这样理解它.发布成功后,你在看下你的
Axis/web-inf/目录下,多了一个server-config.wsdd文件,你可打开它看下里成的描述符
是不是跟我们写的deploy.wsdd相类似呢?
如果发布失败,那么在控制台下你将会看到一些错误信息,并仔细的解决它.
(注:一般错误的原因有这么几点,我个人在开发学习时,可能是类路径没有写对,也
可能是你的<service name="stubs" 这个名称有点错误,你要么改成别的名称试试
也有可能是你的wsdd文件里面写得不规范,最后可能就是你的命令无效,
ClassNotFoundException 错误,这个错误是因为你没有配置好axis的环境造
成的.)
发布成功后在控制台下会有提示:
Processing file deploy.wsdd
<Admin>Done processing</Admin>
OK当您发布成功后.可以开始往下写了.
步骤3:
嘿.完成了上面两个步骤,接下来的工作就是很轻松的了,我们来生成一个客户端
>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)控制台命令
>java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis/
services/stubs?wsdl
打开axis/web-inf/目录下可以看到生成了一个client目录,OK,复制client目录,到你
的项目中.这个client就是我们的客户端代码了.
Client目录生成了:
Server.java
ServerService.java
ServerServiceLocator.java
StubsSoapBindingStub.java
User.java
java文件;
接下来的工作就是编写一个调用类测试.代码与注释如下
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
publicclass Test {
publicstaticvoid main(String []args) throws Exception {
QName qname = new QName("urn:BeanService","user");
Service s = new Service();
Call call = (Call)s.createCall();
//注册这个bean为可序列化的.传递参数
call.registerTypeMapping(User.class, qname, new BeanSerializerFactory(User.class,qname), newBeanDeserializerFactory(User.class,qname));
//设置一下调用方法名.不设置肯定会报错的哦
call.setOperationName("getBeanStr");
//设置一下这个服务的绝对路径.
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/stubs?wsdl"));
//实例化一个User,这个User是生成出来的User哦.,不是原先那个,
User u = new User();
u.setAge(23);
u.setName("do WebService!");
//通知方法,并返回结果
String str = (String)call.invoke(new Object[]{u});
System.out.println(str);
//out.print ==> You Name:do WebService! , You Age:23
}
}
第三种: Dynamic Proxy方式 (代理方式)
这个例子就以第一种方式为基础,因这服务端类的编写是一样的.
那么服务端类就是第一种方式的类了,(完成第一种方式的3个步骤)
主要讲一下客户端通过代理接口的方式调用.
接口这义
import java.rmi.Remote;
import java.rmi.RemoteException;
publicinterface SayHelloInter extends Remote{
public String say(String
name) throws RemoteException;
}
//客户端的调用类如下:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
publicclass Test2 {
publicstaticvoid main(String
[]args) throws Exception{
String wsdlname = "http://localhost:8080/axis/SayHello.jws?wsdl";
//服务路径
String namespaceUrl = "http:// localhost:8080/axis/SayHello.jws";
//服务名
String serviceName = "SayHelloService";
//服务
String portName = "SayHello";
//创建代理对像
ServiceFactory service = ServiceFactory.newInstance();
//创建远程服务
Service s = service.createService(new URL(wsdlname), new QName(namespaceUrl,serviceName));
//向上转型为接口
AxisWebInter inter = (AxisWebInter)s.getPort(new QName(namespaceUrl,portName), AxisWebInter.class
);
System.out.println(inter.getName("Blue
boy!"));
}
}
//Out.print Hi~~ Blue boy!
好了,到现在为止三种调用方式都描术完了,不知道你有没有学会.如果还有什么问题,可
以给我留言,我会给你及时回复.如有不对的地方请指出.Thank you !
相关文章推荐
- 用Java 开发 WebService Axis简单实例
- 用Java 开发 WebService Axis简单实例
- 用Java 开发 WebService Axis简单实例
- 用Java 开发 WebService Axis简单实例
- 用Java 开发 WebService Axis简单实例
- Java+Axis WebService接口开发实例
- Java WebService 简单实例 方式二(axis1直接调用方式)
- Java WebService 简单实例 方式三(axis1接口调用方式)
- Java+Axis WebService接口开发实例
- Java+Axis WebService接口开发实例
- MyEclipse开发Java WebService 简单实例
- Java WebService 简单实例
- Java WebService 简单实例
- javaWeb+JasperReport报表开发简单实例
- Java WebService 简单实例
- Java WebService 简单实例
- Eclipse+Webservice简单开发实例
- Java WebService 简单实例
- Java WebService 简单实例 方式一(生成类文件方式)
- Java WebService 简单实例