摘要:本节主要用于介绍使用axis开发webservice,包括服务端的创建、webservice的部署、客户端的调用。
preparation:
说明:相关的可能要了解SOAP(简单对象访问协议)、WSDL(web服务描述语言)、XML(可扩展标记语言)、axis(阿帕奇可扩展交互系统)等相关知识。
1.下载axis的jar包,请到apache官网或者在百度自行下载,然后导入jar包,不清楚的话导入所有的jar包就好了。(本人用的是axis1的版本,因为项目中用的是axis1的版本)
2.webservice客户端生成工具genclient.bat(后面会对这个工具做一个简单的说明)
之前介绍没有说明本机的环境,现在把本机环境罗列一下:
系统:XP myeclipse:6.5 tomcat:5.X JDK:1.5
生成webservice的方式有XFire、Jax-WS、axis等,使用axis调用webservi有三种方式:动态调用接口、使用动态代理Dynamic Proxy、使用从WSDL生成的存根generated Stubs from Service WSDL description,由于本人工作中使用的是axis,调用webservice的方式用到的有动态调用接口、使用从WSDL生成的存根generated Stubs from Service WSDL description,故本节只介绍用axis调用webservice的这两种方式。后续的拓展部分根据需要再说。
start:
第一步:服务器端的开发
(1)开发java文件
代码如下:
接口文件:IBbossGroupInfoService.java
package com.asiainfo.b2p.soap.interfaces;
import java.rmi.RemoteException;
public interface IBbossGroupInfoService {
// 根据集团编号查询集团基本信息
/**
* 集团编号 GROUP_NUM 集团名称 GROUP_NAME 公司地址 CO_ADDR 集团状态 GROUP_STATE 集团开户时间
* START_TIME 传真 FAX 企业网址 WEB_URL 证件类型 CARD_TYPE 证件号码 CARD_CODE
* 公司邮编CO_POSTCODE 联系电话 TEL_NUM 法人代表名称 PERSON_NAME 发展类型 DEVELOP_TYPE
* 地区编码REGION_ID regionId
*
* @throws Exception
*/
public abstract String groupInfo(long groupNo) throws Exception,
RemoteException;
// 根据集团编号查询集团订购历史
public abstract String groupSubHistoryInfo(long groupNo) throws Exception;
}
实现类:IBbossGroupInfoServiceImpl.java
package com.asiainfo.b2p.soap.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.asiainfo.b2p.soap.interfaces.IBbossGroupInfoService;
/**
* @Product esop_dev
* @FileName IBbossGroupInfoServiceImpl.java
* @History TODO 根据集团编号,查询集团基本信息、集团用户信息、集团订购历史
* @Version 1.0.0
* @Date Nov 22, 2011
* @Author pantaipeng
* @Content 最初版本
*/
public class IBbossGroupInfoServiceImpl implements IBbossGroupInfoService {
private static transient Log log = LogFactory
.getLog(IBbossGroupInfoServiceImpl.class);
// 根据集团编号查询集团基本信息
public String groupInfo(long groupNo) throws Exception, RemoteException {
log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo);
//方法体我省略了,为了测试我仅加入一句打印语句
System.out.println("我是一个公共的方法,作用是根据集团编号查询集团基本信息");
String xml="<message>public_groupInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串
return xml;
}
// 根据集团编号查询集团订购历史
public String groupSubHistoryInfo(long groupNo) throws Exception {
log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo);
//方法体我省略了,为了测试我仅加入一句打印语句
System.out.println("我是一个公共的方法,作用是根据集团编号查询集团订购历史");
String xml="<message>public_groupSubHistoryInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串
return xml;
}
}
说明:为了更加的接近实际的开发,这个是本机上运行的程序,实现的功能是通过一个编号查询相关信息拼成一个字符串,方法体的部分我删除了,你需要用这个代码的话,直接拷贝修改包名称就可以直接用了。
(2)wsdd文件
wsdd文件只需加入一列几行(前提是你之前已经有wsdd文件了,没有的话可以在下载的apache的demo中拷贝一个):
<service name="GroupInfoService" type="" provider="java:RPC">
<parameter name="className" value="com.asiainfo.b2p.soap.impl.IBbossGroupInfoServiceImpl" ></parameter>
<parameter name="allowedMethods" value="*"/>
</service>
这个文件放在项目的WEB-INF下面。<service>标签的name属性是发布的webservice的名称,可以自己命名,第一个<parameter>标签的value属性指定实现类的完整路径,包括类名。其他的地方默认就好。
(3)配置web.xml文件
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
指定处理类以及映射就好,如果像这样配置的话,后面再写webservice的话,这个文件就不用再配置了。
第二步:客户端的开发
(1).动态调用接口
代码如下:
动态调用
package test.webserviceclient;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
public class Test {
/**
* 通过genClient.bat文件生成的webservice客户端调用webservice服务的步骤如下:
* 1.创建service对象
* 2.创建url对象
* 3.创建call对象,
* 4.调用webservice的方法
*/
public static void test1() {
try {
// 1.创建service对象,通过axis自带的类创建
org.apache.axis.client.Service service = new org.apache.axis.client.Service();
// 2.创建url对象
String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";//请求服务的URL
URL url = new URL(wsdlUrl);//通过URL类的构造方法传入wsdlUrl地址创建URL对象
// 2.创建服务方法的调用者对象call,设置call对象的属性
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);//给call对象设置请求的URL属性
String serviceName = "groupInfo";
call.setOperationName(serviceName);//给call对象设置调用方法名属性
call.addParameter("groupNo", XMLType.XSD_LONG, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式
call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型
//4.通过invoke方法调用webservice
long groupNo = 2100000014L;
String res = (String) call.invoke(new Object[] { groupNo });//调用服务方法
System.out.println(res);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
test1();
}
}
代码中的注释很详细,我就不介绍了。
(2).使用从WSDL生成的存根generated Stubs from Service WSDL description
第一步:配置genclient.bat文件
右键单击“编辑”打开bat文件如下(为了便于说明,每行的意思我就直接写在后面了):
set Axis_Lib=E:\esop\lib -----指定工程的lib目录
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% -----默认
set Output_Path=E:\esop\src -----指定工程的src目录
set Package=com.asiainfo.maks.webservices.pbosswebclient -----指定生成的四个文件的存放位置
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% ----- 默认http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl -----指定wsdl文件的路径
第二步:用genclient.bat生成四个客户端类
双击编译好的bat文件,执行后生成的四个java类如下:
第三步:写测试类调用webservice
wsdl
package test.webserviceclient;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;
public class Test {
/**
* 通过genClient.bat文件生成的webservice客户端调用webservice服务的步骤如下:
* 先介绍创建的四个文件分别为:
* IBbossGroupInfoServiceImpl 定义了web服务接口,
* IBbossGroupInfoServiceImplService 定义了用户获取web服务接口的方法
* IBbossGroupInfoServiceImplServiceLocator 接口IBbossGroupInfoServiceImplService的具体实现
* GroupInfoServiceSoapBindingStub web服务客户端桩,通过该类与服务器交互,该类实现了IBbossGroupInfoServiceImpl接口
* 1.创建service对象
* 2.创建url对象
* 3.创建client对象
* 4.调用webservice的方法
*/
public static void test1() {
// 1.创建一个service对象
IBbossGroupInfoServiceImplService service = new IBbossGroupInfoServiceImplServiceLocator();
try {
// 2.创建一个URL对象,传入wsdl的地址够过URL的构造方法创建
String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";
URL url = new URL(wsdlUrl);
// 3创建一个client对象
IBbossGroupInfoServiceImpl client = service
.getGroupInfoService(url);
// 4调用webservice的方法
long groupNo = 2100000014L;
String res = client.groupInfo(groupNo);
System.out.println(res);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
test1();
}
}
对这种生成客户端四个类的情况我要说明下,还有通过wsdltojava命令的方式生成客户端类,但是这个都是一种通过axis调用webservice的方式,既然有工具我们为什么不用呢?
所以能使用wsdltojava命令的方式,我就不介绍了。
test result:
代码的测试截图我就不贴了,感兴趣的可以试试看。
分享到:
相关推荐
eclipse+AXIS开发webservice.doc
eclipse+AXIS开发webservice.pdfeclipse+AXIS开发webservice.pdfeclipse+AXIS开发webservice.pdfeclipse+AXIS开发webservice.pdfeclipse+AXIS开发webservice.pdf
使用axis开发webservice使用的jar包
访问地址: http://127.0.0.1:8080/axis/services
借鉴网上的资源,弄了一个SpringBoot开发WebService之Axis示例。
Axis开发WebService实例.pdf
使用axis开发webservice,自己调用自己的服务,简单明了。
用eclipse+xdoclet+axis开发WebService.pdf
NULL 博文链接:https://zhaoshijie.iteye.com/blog/1299858
step by step 描述Axis构建webservice,从服务器端,到客户端调用。用例说明代码。
\axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF\lib\*.jar 注意:这些包在我们下载下来的AXIS:axis-bin-1_4.zip中 3. 修改WEB.XML文件,最简单的方法是:直接把 \axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF\web....
调用接口使用的 axis jar包,亲测可用。
网上很流行的一个文档,axis的一个helloworld开发,源文档中有四处错误,经本人修改后重新发布,eclipse调试通过
AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),...即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。
NULL 博文链接:https://sunny-java-163-com.iteye.com/blog/484526
本人写的用axis发布webserice程序,用ksoap2调用的实际例子,主要是演示了在手机上如何编写、调用webservice。从网上看到很多类似例子但大部分出错,经过摸索后,该例子能够正常运行,但没有考虑优化等。
axis全称Apache EXtensible Interaction System 即阿帕奇可扩展交互系统。 本例主要对axis用实例进行简单发布,实现两个项目之间的通信。
NULL 博文链接:https://lvqing.iteye.com/blog/1461735
从架构师的角度来理解:webservice是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。