首页 AXIS+Webservice教程

AXIS+Webservice教程

举报
开通vip

AXIS+Webservice教程 利用 AXIS开发 Webservice(一) —— 如何 发布自己的 webservice 先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在 http://ws.apache.org/axis/找到。 假设所有的环境你已 经搭好,并且 AXIS包也已经下好了。OK, Here we go~ 解压 axis-bin-1_4.zip这个包可以看到 webapp...

AXIS+Webservice教程
利用 AXIS开发 Webservice(一) —— 如何 发布自己的 webservice 先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在 http://ws.apache.org/axis/找到。 假设所有的环境你已 经搭好,并且 AXIS包也已经下好了。OK, Here we go~ 解压 axis-bin-1_4.zip这个包可以看到 webapps目录,双击进入把里面的 AXIS文件夹拷 到 %TOMCAT_HOME%\webapps 目录下,之后拷贝 activation.jar、mail.jar、tools.jar 到 %TOMCAT_HOME%\webapps\axis\WEB-INF\lib 目 录 下 。 启 动 tomcat , 访 问 http://localhost:8080/axis/happyaxis.jsp 如果访问成功,恭喜你!基本的配置你已经做完了。 PS:此处的%TOMCAT_HOME%指的是 Tomcat的安装目录,至于那另外的三个 jar包,J2EE 1.4库里就能找的到。 现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即 时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供 了一种非常简单的 webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发 布才是首选。这里也将会以定制发布为重点来介绍。 1.即时发布 JWS (Java Web Service) Files - Instant Deployment 即时发布提供了一种非常简单发布方式,发布者只要有 Java源代码(也就是.java文件), 然 后 把 其 后 缀 名 改 成 jws ( 也 就 是 java web service 的 缩 写 ) 拷 贝 到 %TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处 理接下来的所有事情。下面是一段示例代码: java 代码 public class HelloAXIS { public String Hello(String name){ return "AXIS say hello to " + name; } } 把 HelloAXIS.java 文 件 改 成 HelloAXIS.jws 然 后 拷 贝 到 %TOMCAT_HOME%\webapps\axis 目 录 下 , 启 动 Tomcat 之 后 访 问 http://localhost:8080/axis/HelloAXIS.jws 如果能看到 Click to see the WSDL这个超链接就说 明已经发布成功了,点击进去就可以看到这个 Webservice 的 WSDL 描述文件。server 端的 发布已经完成了,接下来就是编写 Client端测试代码了。 java 代码 package com.chnic.test; import java.net.URL; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class Test { public static void main(String[] args) throws Exception{ String targetEendPoint = "http://localhost:8080/axis/HelloAXIS.jws"; Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName(new QName(targetEendPoint, "Hello")); call.setTargetEndpointAddress(new URL(targetEendPoint)); String result = (String) call.invoke(new Object[]{"Robert"}); System.out.println(result); } } 测试代码很简单,如果熟悉 java反射机制的朋友不用两分钟就能看明白。运行后客 户端控制台出现 AXIS say hello Robert。测试成功。果然很简单吧。不过在这简单背后却是 以牺牲灵活性为代价的。假如你现在手里只有.class 或者一个 jar包,jws就不再能满足你的 需求了,最要命的就是即时发布不支持带包的类,这点 AXIS的用户手册上写的也很明白。 Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment. 2.定制发布 Custom Deployment - Introducing WSDD 比起即时发布定制发布更加烦琐也更复杂,但是换来的却是更大的灵活性,因此在实 际项目中定制发布还是不二的选择。定制发布需要你自己编写一个 WSDD(Web Service Deployment Descriptor)文件,这个东东类似与 XML 稍后会做出介绍。废话不多说,我们 来看代码: java 代码 package com.chnic.webservice; public class HelloWorld { public HelloWorld(){ } public String hello(String str){ return "Hello " + str; } public int add(int a, int b){ return a + b; } } 一 个 带 包 的 很 简 单 的 类 , 在 eclipse 下 编 译 后 按 照 包 名 拷 到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目录下。以这个类为例,拷贝完之后这 个 HelloWorld.class 的 路 径 就 是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS: 如果嫌这 样太麻烦,可以另外建一个 Java Web工程用 myeclipse的发布工具发布到 Tomcat之后,整 体一次性拷贝到 websericve的工程中。 接 下 来 就 需 要 编 写 发 布 文 件 deploy.wsdd 。 到 %TOMCAT_HOME%\webapps\axis\WEB-INF 目录下建立这个文件并在其中添加如下内容: xml 代码 简单的介绍下各个节点的含义,"HelloWorld"当然是这个 webservice的名字,后面紧 跟的 java:RPC指的是服务类型。这里一共有有 4种类型,分别是:RPC, Document, Wrapped 和 Message。有兴趣可以看下 org.apache.axis.providers这个包和子包下面的类的 API文档。 之后的 parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用 的方法。这里的配置告诉引擎可以调用所有的 public方法,当然你也可以自己指定。 编 写 完 配 置 发 布 文 件 之 后 , cmd 打 开 windows 的 控 制 台 , 进 入 %TOMCAT_HOME%\webapps\axis\WEB-INF目录下键入如下命令 java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd 之后控制台返回 Processing file deploy.wsdd 和 Done processing 这两段话即说明发 布成功。(此时会在同级目录生成一个 server-config.wsdd文件)在这里的AdminClient是AXIS 提供的一个客户端管理工具。至于 java.ext.dirs的含义可以去了解一下 classloader和 JVM类 装载机制方面的知识,在这里就不多解释。 还有一点要注意的是在发布的时候 Tomcat服务 必须处于启动状态,否则就会抛出一堆无法连接的异常信息。发布成功之后你可以通过访问 http://localhost:8080/axis/servlet/AxisServlet 来查看你所有的定制发布的服务。 客户端测试代码 String targetEendPoint = "http://localhost:8080/axis/services/HelloWorld"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new URL(targetEendPoint)); call.setOperationName(new QName(targetEendPoint, "hello")); String result = (String) call.invoke(new Object[]{"Robert"}); System.out.println(result); call.setOperationName(new QName(targetEendPoint, "add")); Integer res = (Integer) call.invoke(new Object[]{new Integer(1), new Integer(2)}); System.out.println("The result is: " + res); 运行测试代码,控制台显示 Hello Robert 和 The result is: 3 这两句话,说明发布成 功。仔细观察下发现其实除了那个 targetEndpoint 之外,即时发布和定制发布的客户端调用 代码基本上都是一样的。定制发布的 URL 可以在 WSDL 文件里找到。 其实定制发布还有 一些高级特性,这个就留到下一篇再说吧。 利用 AXIS 开发 Webservice(二 ) —— WSDD的一些高级特性 1、取消发布一个 webservice 开篇之前先把上篇的一个遗漏补充上,上篇只讲了怎么发布一个 webservice,但是如何取消 没有却没有提。其实取消一个已经发布的 webservce 也是非常简单的,我们就拿上篇的 HelloWorld来做例子吧。 发布 webservice 的时候我们有一个 deploy.wsdd 文件,当然在取消发布的时候就会有一个 undeploy.wsdd文件。这个文件的内容也很简单,xml的代码如下。 Xml代码 编写完这个 xml文件之后,把它同样 copy到%TOMCAT_HOM\webapps\axis\WEB-INF目录 下,然后 CMD打开控制台,在控制台输入一个我们很熟悉的命令 java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd 运行之后得到如下结果说明取消发布成功 Processing file undeploy.wsdd Done processing 2、WSDD的高级特性 说完取消发布之后就来说一下AXIS的一些高级特性,AXIS在编写 deploy.wsdd这个文件时, 每个节点下面会有这样一个子节点。 Xml代码 这个节点配置着你的 service object 也就是你 webservice 服务的那个 object,在后面的 value 里可以有三个选项 request, session, or application。熟悉 Jsp、Servlet、或者 EJB里的 SessionBean的朋友应该能很快能明白这个三 个配置选项的含义。 requst:这个选项会让 AXIS 为每一个 SOAP 的请求产生一个服务对象,可以想像如果这个 webservice的对象足够复杂,而且 SOAP的请求过多,这个选项是非常耗费服务器性能的。 session:如果选择了 session,程序就会给每个调用这个 webservice的客户端创造一个服务对 象。 application:这个选项最彪悍,程序只会在内存里 new 出来一个服务对象,然后为所有 webservice客户端服务。很显然这个选项不能储存客户端的一些个性化数据。所以在功能性 上很多时候不能满足要求。 3、高级特性 Handler 接下来说一下 Axis的 Handler和 Chain机制,Handler和 Chain是 Axis引擎提供的一个很强 大的工具。假如现在客户有这样一个需求,需要 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 某一个 webservice被调用的次数,这个 时候如果在 service object里去实现这个功能不仅麻烦,而且侵入了原有的程序也会对增加原 有程序的不稳定性。有了 Handler 我们就能见 easy 的解决这个问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。我们先来编写 handler 的代码。 Java代码 package com.chnic.handler; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; public class HelloWorldHandler extends BasicHandler{ private static final long serialVersionUID = 1L; public void invoke(MessageContext context) throws AxisFault { String status = (String) this.getOption("status"); System.out.println("HelloWorldHandler's status is: " + status); } } package com.chnic.handler; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; public class HelloWorldHandler extends BasicHandler{ private static final long serialVersionUID = 1L; public void invoke(MessageContext context) throws AxisFault { String status = (String) this.getOption("status"); System.out.println("HelloWorldHandler's status is: " + status); } } BasicHandler 是一个抽象类,Axis 提供了很多 Handler 的具体实现,BasicHandler 只是其中 最简单的一个。要实现一个自己的 handler首先要从继承 BasicHandler这个类开始并实现其 中的 invoke(MessageContext arg)这个方法。MessageContext可以看成是一个 Axis的上下文, 里面存储的是一些 Axis和 webservice的基本信息。想了解的朋友可以看一下 Axis的 API。 编写完 Handler代码之后我们连编写发布文件。 Xml代码 发布代码中有这样的一句,细心的朋友一定会发现。 Xml代码 看完这句代码再对比一下 Handler的实现代码中 的一句,相信大多数人都能明白了。 Java代码 String status = (String) this.getOption("status"); String status = (String) this.getOption("status");Handler通过 getOption(String)这个方法拿到了 配置文件中我配置的属性值。而我们上述所做的所有工作对于原来的 Webserivce 来说都是 透明的,不会对侵入原有的程序当中。 一个 Handler 可以被多个 service 所使用,通过 这个标签来引用到某一个 service 中,这里还要多提一句既然是一个 requestFlow,这个当然可以加不只一个的 Handler。接下来编写测试代码运行。在本地应用 服务器上会打出如下语句:HelloWorldHandler's status is: session说明测试成功,而且 handler 是配置在 requestflow标签中所以这段代码会在 service代码之前先执行。 4、高级特性 Chain 介绍完了 Handler 再来介绍 Chain。从 Chain 的字面意思就能猜到他实现的一连串 Handler 的功能。假如某个 service需要不止一个 Handler,或者要根据 Client的情况来选择需要那些 Handler。特别是后一个需求,我们无法用一个或者几个 Handler来解决,这个时候我们就需 要来实现了。我们先再编写一个 Handler,加上之前的那个 Handler我们来组成一条 锁链。 Java代码 package com.chnic.handler; import org.apache.axis.AxisFault; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; public class MyHandler extends BasicHandler { private static final long serialVersionUID = 1L; public void invoke(MessageContext context) throws AxisFault { System.out.println("This is MyHandler.."); } } 之后我们编写 Chain的代码 Java代码 package com.chnic.chain; import org.apache.axis.SimpleChain; import com.chnic.handler.HelloWorldHandler; import com.chnic.handler.MyHandler; public class HelloWorldChain extends SimpleChain { private static final long serialVersionUID = 1L; public HelloWorldChain(){ HelloWorldHandler hwh = new HelloWorldHandler(); MyHandler mh = new MyHandler(); this.addHandler(hwh); this.addHandler(mh); } } 在 Chain 的构造函数中,把我要的两个 Handler 用 addHandler()方法加载进去。之后我们来 编写发布文件。元素有些许不同在这里有必要多句嘴。 元素中的子元素只允许是或者。后者也就是允许在“锁链”里再嵌 套“锁链”,在这里就拿嵌套来举例,他同样有两种方式来实现。第一种是直接包 含: Xml代码 第二种是引用别的 Xml代码 因为我们这里的 Handler并没有由 BasicHandler来实现,而是由继承 SimpleChain这个类来 实现,严格意义上讲,SimpleChain 也可以算是一个 Handler,因为 SimpleChain 也是从 BasicHandler 继承而来,他同样实现了 invoke()这个方法。下面回归正题,来看我们的发布 代码。 Xml代码 从新发布 webservice之后,运行我们的测试代码。会发现在应用服务器的本地控制台上打出 两句 Handler 要输出的语句,说明测试成功。而且控制台打出语句的顺序是和我们加载 handler的顺序一样的。 除了之外,Axis 还提供了与之相应的,用法和是 requestflow 一样的,所不同的是一个在 service 执行之前一个是之后。可以加下面代码到发布文件中的 元素下就可以实现 responseflow的功能 Xml代码 最后简单提一下远程管理,也就是 Remote Administration。要实现远程管理在发布文件的 标签下加入下面一段语句就可以了。 Xml代码 不过远程管理会有安全方面的问题,所以不 建议 关于小区增设电动车充电建议给教师的建议PDF智慧城市建议书pdf给教师的36条建议下载税则修订调整建议表下载 使用。 一些高级部分就先说到这里,还有一些比如 RPC docuement Wrapped Message的区别和使, 如何传递一个 Javabean,还有一些配置方面的的问题就留到下节说吧。 利用 AXIS开发 Webservice(三) —— 如何 传递 javabean和你的对象 在第一篇介绍 Axis的文章里,我们做了一个简单的 webservice,我们 client side传递了 String 和 int类型的数据给 service object。Service处理之后返回处理结果给 Client。对于大多数需 求,那个 demo 显然已经足够应付了。但是如果 client 端需要传输一个对象给 server,那么 那个 demo就显得力不从心了。Axis中提供了远程传输对象的方法,通过那些方法我们同样 可以随心的传递自己的对象。 我们先从传递一个 JavaBean开始,首先编写一个 JavaBean。 Java代码 package com.chnic.bean; public class OrderBean { private String name; private int age; private String[] items; private int[] price; private boolean checked; public OrderBean() { } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public String[] getItems() { return items; } public void setItems(String[] items) { this.items = items; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int[] getPrice() { return price; } public void setPrice(int[] price) { this.price = price; } } 这个 JavaBean的前 4个属性都很清楚,要解释一下最后一个。因为这个 JavaBean被传递到 Service端处理之后要接着被传回,用来示例 webservce传进和传出。这个变量用来区别传进 和传出的差别。解释完我们来看下 service Java代码 package com.chnic.webservice; import com.chnic.bean.OrderBean; public class AnalyzeOrder { public AnalyzeOrder(){ } public OrderBean process(OrderBean order){ order.setChecked(true); System.out.println("name: " + order.getName() + " age: " + order.getAge()); for(int i=0; i 唯一不同的就是多了这个节点。qname 表示 XML 规范中定义的限定名称, 他由名称空间 URI、本地部分和前缀组成。除了本地部分其他都不是必须的,另外 QName 是不可变的。xmlns后面的 myNS是必须的。具体根据前面所指定的 qname来决定。之后可 以随意命名一个 namespace。最后的 languageSpecificType指定的是你传递的对象类型。第一 个属性的本地部分和第二个节点你自定义的命名空间会组成一个新的 QName,并将你要传 输的对象 mapping是上去。 发布这个 webservice,编写测试代码 Java代码 String targetEendPoint = "http://localhost:8080/axis/services/CheckOrder"; OrderBean order = new OrderBean(); order.setName("Beckham"); order.setAge(32); String [] items = new String[] { "Ipod", "ThinkPad" }; int [] price = new int [] { 999, 5000 }; order.setItems(items); order.setPrice(price); order.setChecked(false); System.out.println(order.isChecked()); Service service = new Service(); Call call = (Call) service.createCall(); QName qn = new QName("urn:AnalyzeOrder", "Order" ); call.registerTypeMapping(OrderBean.class, qn, new org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.class, qn)); call.setTargetEndpointAddress( new java.net.URL(targetEendPoint) ); call.setOperationName( new QName("CheckOrder", "process") ); call.addParameter( "arg1", qn, ParameterMode.IN ); call.setReturnClass(OrderBean.class); OrderBean result = (OrderBean) call.invoke( new Object[] {order} ); System.out.println("Success..."); System.out.println(result.isChecked()) 从控制台输出一些信息以便测试,里面大多代码都应该见过。new QName 和之后的 registerTypeMapping方法也是在实现我上面那段黑体字的内容。之后注册完参数和返回值类 型运行。 会发现在 tomcat控制台和本地控制台都会输出测试结果,值得注意的是 checked这个属性在 传入之前是 false 属性,传入之后我们改变了他的属性变为 true。返回之后在本地控制台打 印出来也为 true。 事实上 Axis除了可以传输 JavaBean之外还可以传输一些自定义的类型。比如 List、Map和 时间日期类型。Axis也为他们提供了专门的 SerializerFactory和 DeserializerFactory。这些工 厂类会产生串行化工具去序列化相应的对象。更多的 Factory Object 可以在 org.apache.axis.encoding.ser下面找到。 对于自定义序列化,Axis也提供了相对性的配置节点。具体配置如下: Xml代码 typeMapping 的前三个属性和上面讲的 beanMapping 都一样。不一样的是后三个。serializer 指定的是串行化类,dserializer 指定的是反串行化类。最后一个指定的编码方式。其实对于 typeMapping来说 beanMapping只不过是他的一个简化版而已。因为 beanMapping的串行化 和反串行化工厂类都是固定的,而编码方式也是固定的。 因为 typemapping和 beanMapping很相似,在这里就不再写 demo了。 有些人也许会问,既 然能串行化对象那能不能“串行化”文件呢? 利用 AXIS开发 Webservice(四) —— 如何 抛出自定义异常 上一篇介绍了如果在 Server 和 Client 端传递一个自己的对象。有些人也许会问传递异常行 不行? 答案 八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案 是可以。只不过传递异常的配置要稍微复杂一些。空口无凭,我还是用点代码来 说明。今天的例子稍微复杂点,用一下数据库(MySQL)。首先创建表和输入测试数据。 Sql代码 create table users(id integer primary key, name varchar(20) not null); insert into users values(1, 'Lincoln'),(2, 'Michael'),(4, 'Mahone'),(6, 'Sara'); 一个 user表,4条记录。等会我们 client段会发送一个 SOAP request给 server段,之后 server 段返回客户要的数据,如果没有则抛出一个自定义异常。表建立完成之后来编写 JavaBean。 Java代码 package com.chnic.bean; public class UserBean implements java.io.Serializable{ private static final long serialVersionUID = 1L; private int id; private String name; public UserBean(){ } 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; } } Bean有两个属性,Id和 Name。client会根据 ID来取要的 Name。编写完 Bean之后我们来 编写 Customer Exception的代码。 Java代码 package com.chnic.exception; import java.rmi.RemoteException; public class NoSuchUserException extends RemoteException { private String errorMessage = "No such user: "; private int id; private static final long serialVersionUID = 1L; public NoSuchUserException() { } public void printErrorMessage(){ System.out.println(errorMessage + id); } public int getId() { return id; } public v
本文档为【AXIS+Webservice教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_817467
暂无简介~
格式:pdf
大小:177KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2012-12-13
浏览量:5