Axis1.4开发webservice个人笔记
Axis1.4开发webservice
SOAP 是基于 XML 的简易协议,SOAP 即Simple Object Access Protocol(简单对象访问协议),可使应用程序在 HTTP 之上进行信息交换。 或者更简单地说: SOAP 是用于访问网络服务的协议。 SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信 |
目的:本节主要用于介绍使用axis开发webservice,包括服务端的创建、webservice的部署、客户端的调用
1.准备工作:
概念:SOAP(简单对象访问协议)、WSDL(web服务描述语言)、XML(可扩展标记语言)、axis(阿帕奇可扩展交互系统)
(1) 下载axis1.4,将lib下的jar文件拷贝到工程的WEB-INF\lib下
(2) 配置Java和Tomcat环境,设置axis环境,例如:
set AXIS_HOME= C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis set AXIS_LIB=%AXIS_HOME%\lib
set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar;
%AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
(3) 配置web.xml添加
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Apache-Axis</display-name> <listener> <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class> </listener> <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> <servlet-name>AdminServlet</servlet-name> <display-name>Axis Admin Servlet</display-name> <servlet-class> org.apache.axis.transport.http.AdminServlet </servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet> <servlet-name>SOAPMonitorService</servlet-name> <display-name>SOAPMonitorService</display-name> <servlet-class> org.apache.axis.monitor.SOAPMonitorService </servlet-class> <init-param> <param-name>SOAPMonitorPort</param-name> <param-value>5001</param-value> </init-param> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping <servlet-name>SOAPMonitorService</servlet-name> <url-pattern>/SOAPMonitor</url-pattern> </servlet-mapping> <session-config> <session-timeout>5</session-timeout> </session-config> <mime-mapping> <extension>wsdl</extension> <mime-type>text/xml</mime-type> </mime-mapping> <mime-mapping> <extension>xsd</extension> <mime-type>text/xml</mime-type> </mime-mapping> <welcome-file-list id="WelcomeFileList"> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.jws</welcome-file> </welcome-file-list> </web-app> |
(4)Axis 支持三种web service开发方式,分别为:
1 、Dynamic Invocation Interface ( DII)
2 、Dynamic Proxy方式
3 、Stubs方式
这里只讲解最常用的Stubs方式
2.实例演示
1.写一个方法类,以bean作为参数
//示例:以短信服务为例
package com.my.server; public class RequestMessage { private String from; private String to; private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } } |
package com.my.server; import org.omg.CORBA.Request; public class ResultResponse { //发送结果代码 private int code; private String errorText; //发送的原始信息 private RequestMessage message; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getErrorText() { return errorText; } public void setErrorText(String errorText) { this.errorText = errorText; } public RequestMessage getMessage() { return message; } public void setMessage(RequestMessage message) { this.message = message; } } |
package com.my.server; public class SendService { /*** 短信息发送Web服务接口*/ public ResultResponse send(RequestMessage msg) throws Exception { System.out.println("from:" + msg.getFrom()); System.out.println("to:" + msg.getTo()); System.out.println("CONTENT:" + msg.getContent()); ResultResponse res = new ResultResponse(); res.setMessage(msg); String contentString=msg.getContent(); if(contentString.length()>10) { res.setCode(0); res.setErrorText("发送内容不超过10个字符!"); } else { res.setCode(0); res.setErrorText("ok"); } return res; } } |
2. 编写deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="sendService" provider="java:RPC"> <parameter name="className" value="com.my.server.SendService" /> <parameter name="allowedMethods" value="*" /> <beanMapping qname="myNS:RequestMessage" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.my.server.RequestMessage" /> <beanMapping qname="myNS:ResultResponse" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.my.server.ResultResponse" /> </service> </deployment> |
3.编写undeploy.wsdd
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="sendService"/> </undeployment> |
4.发布接口(先启动tomcat)
进入到tomcat的WEB-INF目录下,执行命令进行发布。会在此目录下生成
server-config.wsdd文件(以后可以在此目录配置其他接口)
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://10.166.43.110:8080/zhangyiAxis/servlet/AxisServlet deploy.wsdd |
或者编写一个批处理文件:deploy.bat
set Axis_Lib=F:\webservice\axis-1_4\lib set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Axis_Servlet=http://10.166.43.110:8080/zhangyiAxis/servlet/AxisServlet %Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% D:\apache-tomcat-6.0.20\apache-tomcat-6.0.20\webapps\zhangyiAxis\WEB-INF\deploy.wsdd @echo 文件server-config.wsdd已经生成 @echo ----------------------------------------- @pause |
4.1下面命令用于取消一个已经发布的服务
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://10.166.43.110:8080/zhangyiAxis/servlet/AxisServlet undeploy.wsdd |
或者编写一个批处理文件:undeploy.bat
set Axis_Lib=F:\webservice\axis-1_4\lib set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Axis_Servlet=http://10.166.43.110:8080/zhangyiAxis/servlet/AxisServlet %Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% D:\apache-tomcat-6.0.20\apache-tomcat-6.0.20\webapps\zhangyiAxis\WEB-INF\undeploy.wsdd @echo 服务已经取消 @echo ----------------------------------------- @pause |
5.重启tomcat,访问工程目录,如:http://10.166.43.110:8080/zhangyiAxis/servlet/AxisServlet
(其中zhangyiAxis为工程名)
会看到新发布的webservice接口sendService,点击进入此接口的wsdl内容;
复制此页面内容,另存为如sendService.wsdl,用记事本等工具打开去掉开头的空格,替换去掉“-”;
6.可以经此文件sendService.wsdl放到一个,使用wsdl于批处理生成java客户端的目录:如我的目录F:\webservice 【也可以都放到WEB-INF目录下】
其中 wsdl生成java客户端文件.bat 为
set Axis_Lib=F:\webservice\axis-1_4\lib set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Output_Path=F:\webservice\Testclient set Package=com.my.client %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% F:\webservice\sendservice.wsdl @echo 客户端代码已经成功生成,代码在src目录下 @echo ----------------------------------------- @pause |
重启tomcat,执行“wsdl生成java客户端文件.bat”会生成文件夹Testclient,
打开复制com文件夹,到工程的src下即可
//Bean参数 ResultResponse.java //自动生成 SendService.java 定义了Web服务接口,此例中只有一个send方法。 |
7.写一个测试
package com.my.client.test; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import com.my.client.RequestMessage; import com.my.client.ResultResponse; import com.my.client.SendService; import com.my.client.SendServiceService; import com.my.client.SendServiceServiceLocator; public class Test { public static void main(String[] args) throws RemoteException, ServiceException, MalformedURLException { /* SendServiceService为接口; SendServiceServiceLocator为接口实现类 */ SendServiceService service = new SendServiceServiceLocator(); //调用接口中提供的服务方法 SendService client = service.getsendService(); //设置要使用的接口服务地址:多用于动态调用不同服务器上的接口 URL portAddress=new URL("http://localhost:8080/zhangyiAxis/services/sendService"); SendService client2 = service.getsendService(portAddress); //返回接口服务完整地址 String addr = service.getsendServiceAddress(); System.out.println(addr); //传参数bean RequestMessage msg = new RequestMessage(); msg.setContent("hello!"); msg.setFrom("www.qq.com"); msg.setTo("www.baidu.com"); //接收返回的结果 ResultResponse resp = client.send(msg); RequestMessage msgRec = resp.getMessage(); System.out.println("From:" + msgRec.getFrom() + "\nto :" + msgRec.getTo() + "\ncontent: " + msgRec.getContent() + "\ncode: " + resp.getCode() + "\nerror code : " + resp.getErrorText()); } } |
补充:批处理
WSDL生成服务端JAVA代码.bat
@echo ----------------------------------------- @echo 设置Output_Path设置为你要生成的路径 @echo Package设置为生成文件的包路径 @echo 最后是wsdl可以是文件路径 可以是URL @echo WSDL2Java -o [放在那个包下面] -d Session -s -S true [wsdl路径] @echo ----------------------------------------- @echo 切换到当前目录 set CURRENT_DIR=%cd% @echo %CURRENT_DIR% cd %CURRENT_DIR% set Axis_Lib=F:\webservice\axis-1_4\lib set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Output_Path=F:\webservice\AsServerClient set Package=com.huawei.asserver %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% -s -S true F:\webservice\sysMessageEx2.wsdl @echo 服务端代码已经成功生成,代码在src目录下 @echo ----------------------------------------- @pause |
java文件生成wsdl文件.BAT
set Axis_Lib=F:\webservice\axis-1_4\lib set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib% set Output_Path=F:\user.wsdl set Package=com.test.user set namespace=urn:userservice set url=http://localhost:8080/AxisTest2/services/UserService %Java_Cmd% org.apache.axis.wsdl.Java2WSDL -o%Output_Path% -l%url% -n%namespace% -p%Package%=%namespace% -y rpc com.test.service.UserService @echo wsdl已经成功生成 @echo ----------------------------------------- @pause |
Regular Invocation Example
URL url = new URL(“http://localhost:8080/wsrf/services/MyService"); MyServiceAddressingLocator locator = new MyServiceAddressingLocator(); MyService port = locator.getMyServicePort(url); port.hello();
|
根据WSDL生成服务端代码,(参考批处理文件)
生成的文件如下:
分析所生成的文件,服务器端比客户端多了一个PersonManageSoapBindingImpl.java的文件,该文件就是服务端的实现类文件。把生成服务端的代码加到工程里,相关的文件已被修改为支持远程SOAP调用。接下来我们可以在上述的实现类中添加逻辑就可以了。
修改后的代码如下:
UserManageSoapBindingImpl.java
/** * UserManageSoapBindingImpl.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package com.my.server; public class UserManageSoapBindingImpl implements com.my.server.UserManageInter { public void addUser(com.my.server.UserBean userBean) throws java.rmi.RemoteException { //此处为新增的业务 System.out.print("Info: ***** userBean="+userBean.toString()+"ID ="+userBean.getID()); System.out.println("Name = "+userBean.getName()+"Address ="+userBean.getAddress()); } } 参考文档《WEB SERVICE开发指南.pdf》 |
Axis1.4开发webservice个人笔记的更多相关文章
- axis1.4开发webservice服务端(快速入门)-基于jdk1.4
写在前面: 现在有很多开发webservice的方法以及框架,什么cxf等,但是这些在你编写服务类的时候都要用到注解这个功能.如果现在的jdk是1.4的,那么就不能使用注解这个功能了.所以这里可以用到 ...
- axis1.4开发webservice客户端(快速入门)-基于jdk1.4
写在前面: 对于客户端,服务端开发好了以后,客户端只需要调用就可以了.这里我们讲的是,根据服务的访问地址,来生成客户端所需要用到的代码(听说有几种调用方式,但是用到最常见的就是stub方式,貌似我说的 ...
- 使用URLConnection调用axis1.4开发的webservice
写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...
- 基于Axis1.4的webservice接口开发(接口调用)
基于Axis1.4的webservice接口开发(接口调用) 一.webservice接口代码参考上一篇博客: http://www.cnblogs.com/zhukunqiang/p/7125668 ...
- 基于Axis1.4的webservice接口开发(代码开发)
基于Axis1.4的webservice接口开发(代码开发) 一.开发环境: 我的开发环境是MyEclipse 2015+Apache-Tomcat-8.0.21. 二.代码开发: 1.新建一个Web ...
- 基于Axis1.4的webservice接口开发(环境搭建)
基于Axis1.4的webservice接口开发(环境搭建) 一.环境搭建: 1.搜索关键字“Axis1.4”下载Axis1.4相关的jar包. 下载地址:http://download.csdn.n ...
- Java WebService学习笔记 - Axis(一)
WebService 简介 实际开发中,很多系统都是基于历史遗留系统进行开发,有时,这些系统基于不同的语言,如C,C++,C#,java,PHP等等.为了实现历史系统的再利用,或向外部程序暴露调用接口 ...
- Java开发Webservice的组件
参考:http://bbs.csdn.net/topics/390900831 转自:http://blog.csdn.net/dragoo1/article/details/50759222 htt ...
- java开发webservice的几种方式(转载)
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...
随机推荐
- iOS应用程序状态图
理解应用的状态对于我们开发iOS大有裨益. 当前应用所处什么状态,什么促使它在各个状态间进行过渡,你的代码又是如何 唤醒这些过渡,等等等等. 先请看下图: 1. 当应用出于非运行状态时,它处于图中的& ...
- [置顶] 单例模式lua实现
--[[ 优点 一.实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 二.灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程. 缺点 一.开销 ...
- Azure Paas SQL 修改用户名密码的相关问题
现总结如下,供您参考: 1) 如何单独修改每个数据库的密码? 在portal中,我们提供了一个最高权限的,可管理服务器下所有数据库的服务器用户 跟密码,但在实际使用中,由于权限过大,会有潜在的安全隐 ...
- updateFilter
$.fn.updateFilter = function(filterType, paramVal) { // filter="DATE|GREATERTHANEQUALS|LESSTHAN ...
- Effective前端(3)用CSS画一个三角形
来源:https://zhuanlan.zhihu.com/p/26160325 三角形的场景很常见,打开一个页面可以看到各种各样的三角形: 由于div一般是四边形,要画个三角形并不是那么直观.你可以 ...
- Java Web(5) Spring 下使用Junit4 单元测试
1. 如何在不启动Tomcat服务器的情况下对,Dao这些不依赖使用Servlet API的类来进行单元测试呢? 其实在Spring框架体系中,已经有一套自己的测试代码,其中就是依赖使用Junit来进 ...
- java代码行数计算器
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util. ...
- 多线程场景下如何使用 ArrayList
ArrayList 不是线程安全的,这点很多人都知道,但是线程不安全的原因及表现,怎么在多线程情况下使用ArrayList,可能不是很清楚,这里总结一下. 1. 源码分析 查看 ArrayList 的 ...
- Kibana 日志查询
1 概述 很多系统的日志都会放在 Kibana 供查询,就是所谓的 ELK.Kibana 除了可以使用界面供的一些 tab 或者 button 去筛选日志,也可以在搜索栏中使用 Lucene 的语法简 ...
- wordpress搭建博客上传begin主题The themes is locked to another domain
如题, 在使用wordpress搭建个人博客过程中, 上传begin主题, 出现如下弹框的错误, 而且样式有误. 环境: Los Angeles CentOS 7 x64 nginx+mysql 解决 ...