AXIS实现Web应用
axis2 WebService 开发指南

Axis2.x WebService上次介绍了axis1.x的用法,这次继续上次的,将叙述axis2的用法。
Axis1.x在线博文:/hoojo/archive/2010/12/20/1911349.html一、准备工作1、开发准备首先需要下载axis2的相关jar包,到axis的官方网站即可获得开发的依赖包。
下载地址:/axis2/java/core/download.cgi现在最高的版本是1.5.4的然后你需要下载官方提供的axis的eclipse插件工具,可以帮助我们打包(aar)及其生产客户端调用代码。
下载页面:/axis2/java/core/tools/index.htmlService Archive Wizard - Eclipse Plug-inCode Generator Wizard - Eclipse Plug-in2、安装eclipse插件如果你的eclipse插件安装成功后,会看到如下效果:3、分析axis2-bin文件目录结构下载下来的axis2的依赖库,其中有一个axis2-1.5.3-bin.zip的库文件,目录结构如下:bin文件夹是axis2的常用工具,其中有将wsdl文件转换成客户端调用的wsdl2java工具及将java转换成wsdl文件的工具conf是axis2的配置文件lib运行所要的依赖库repository是发布过的axis服务和文件sample是示例webapp是web文件和jsp页面等4、我们需要将下载下来的axis2-1.5.3-war.zip中的axis2.war这个文件放在我们的tomcat目录下,启动tomcat就会把war文件转成一个可以跑起来的axis2的项目。
Tomcat启动后,在浏览器中输入:http://localhost:8080/axis2/你可以看到二、Axis2的简单WebService示例注意,上面的HelloWorldService是没有package的。
基于Axis2的web服务安全框架设计与实现

形式的多样性 ,详 细研究 了 Axs i 2的消 息处理 机制 ,并 在 SA O P通信 协议 基础上 ,设计 了一个 完整 的、符 合 w s 一 e
收 稿 日期 :2 1-01 ; 修 订 日期 :2 1-21 0 11 —0 0 11—5 基 金 项 目 : 国家 自然 科 学 基 金 项 目 (0 7 1 1 79 1 l )
21 0 2年 5 月
计 算机 工程 与设 计
C VPUTER OI L ENGI NEERI NG AND DES 3 No 5 13 .
第 3卷 3
第5 期
基于 A i xs 2的 w b服 务 安 全 框 架 设 计 与 实 现 e
De in a d i lme t t n o b s r ies c rt r me r a e n Ax s sg n mp e n ai fwe e vc e u iy fa wo k b s d o i2 o
X ONG Gu n -a ,MU - n , HANG Xi- a , I u — n I a gci De u Z j nj J oj 2 i G u
O 引 言
随 着 网络 技 术 的 发 展 ,we b服 务 以 其 良好 的 扩 展 性 和
据加密技术 ,文献 E ]研究 了 X 3 ML加密 用 于访 问控 制 , 文献 [—]提出 了基 于 S A 协议 的安全模 型 ,文献 [ — 45 O P 6 7 ]研究 了新 型 的 WSSc r y 全规 范 ,文献 [ ]在 A— -eui 安 t 8
数 字签名 、消息加 密和基 于角 色的访问控 制 ,能够接收各 种基 于 S A 协 议的客 户端请 求,具有很好 的安全性 和兼容 性, O P
Web+Services发布与调用(axis,xfire)

目录一使用Axis和XFire发布Web Service (2)1.1 准备工作 (2)1.1.1 新建工程 (2)1.1.2 axis依赖文件 (3)1.1.3 XFire依赖文件 (3)1.2 Axis发布Web Service (4)1.2.1 传递简单数据类型的Web Service (4)1.2.2 带自定义对象传递的Web Service (8)1.3 XFire发布Web Services (10)1.3.1 传递简单数据类型的Web Service (10)1.3.2传递复杂数据类型的Web Service (12)附录: 1Server的结构 (16)二调用Web Services (17)2.1 准备工作 (17)2.1.1 新建工程 (17)2.1.2 启动Tomcat上发布的1Server服务 (17)2.2 Axis发布的Web Service调用方式 (18)2.2.1 Dynamic Invocation Interface (DII)方式 (18)2.2.2 Dynamic Proxy方式 (19)2.2.3 Stubs方式 (20)2.3调用XFire发布的Web Service (22)2.3.1服务以jar包形式发布的时候直接调用 (23)2.3.2 使用Axis的Client包 (23)2.3.3 使用Xfire的Client包 (24)附录2:2Client目录结构 (31)一使用Axis和XFire发布Web Service 1.1 准备工作Axis主页:/Axis下载:/dist/ws/XFire主页:/XFire下载:/Download去以上站点下载axis最新包和XFire最新包,包内有axis和XFire依赖的其他jar包。
1.1.1 新建工程1.1.2 axis依赖文件1.1.3 XFire依赖文件1.2 Axis发布Web Service1.2.1 传递简单数据类型的Web Service1.把Axis依赖的jar包放入lib文件夹下.2.在web.xml中加入如下:<!-- ****************** axis ws start ****************** --> <listener><listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener </listener-class></listener><servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class></servlet><servlet><servlet-name>AdminServlet</servlet-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><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><!-- uncomment this if you want the admin servlet --><!--<servlet-mapping><servlet-name>AdminServlet</servlet-name><url-pattern>/servlet/AdminServlet</url-pattern></servlet-mapping>--><session-config><!-- Default to 5 minute session timeouts --><session-timeout>5</session-timeout></session-config><!-- currently the W3C havent settled on a media type for WSDL;/TR/2003/WD-wsdl12-20030303/#ietf-draftfor now we go with the basic 'it's XML' response -->3.发布到Tomcat5.0+ 启动Tomcat服务启动的时候若出现下面错误。
Axis2从入门到精通--Webservice在eclipse下开发教程

Axis2 教程文章分类:Java编程Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。
Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。
这些都将在后面的系列教程中讲解。
在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService。
一、Axis2的下载和安装读者可以从如下的网址下载Axis2的最新版本:/axis2/在本文使用了目前Axis2的最新版本1.4.1。
读者可以下载如下两个zip包:axis2-1.4.1-bin.zipaxis2-1.4.1-war.zip其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件,axis2-1.4.1-war.zip文件用于将WebService发布到Web容器中。
将axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat。
在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。
图1二、编写和发布WebService对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。
在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。
其中POJO中所有的public方法将被发布成WebService方法。
下面我们来实现一个简单的POJO,代码如下:public class SimpleService{public String getGreeting(String name){return "你好 " + name;}public int getPrice(){return new java.util.Random().nextInt(1000);}}在SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。
Myeclpse6.0+Axis2 返回对象数组(List)的webservice例子

【wayfoon】最近公司要求实现一个webservice调用,之前也接触过,但只是看看,没有动手试试,于是现在正式开始学习webservice。
之前参照网上的例子写了一个简单的say hello webservice例子。
传递的对象是string,而且只有一个方法;但实际应用中,需要传递一些复制的对象,比如:数组,集合,对象数组。
由于webservice 是通过xml来交互数据的,而且是不分平台的。
因此,java 中的List等集合类的哦是通过数组来实现的。
学习webservice最好不要从一种语言的角度(java、c#)来对待问题,如果非要看成一中语言,那看成是c语言吧。
简单的hello world 例子见/mlzry0612/articles/185209.html?opt=admin里面有详细的axis+myeclipse5.5安装部署,图文并茂。
不同myeclipse版本有所不同。
在演示例子前,你必须已经安装好了Axis,并且已经知道怎样使用axis,知道通过wsdl生成webservice代码和生成aar发布文件。
不会的话,先学习前面的hello 例子。
下面演示一个比较复杂的例子。
例子实现:输入一个string 返回得到一个对象数组(输入里面所有的元素对象),注意是对象数组。
每个对象对应一个bean 实体。
使用axis的好处是可以根据wsdl自动生成大部分代码。
因此,采用axis开发webservice 的实现关键在于生成wsdl文件的编写。
生成wsdl文件可以采用两种方式:第一种:直接新建wsdl再通过wsdl设计器来设计(也就是hello例子里面将的)如果你对wsdl不是很熟悉,而且,输入或输出的参数都非常复杂,不清楚输入输出的组成结构时,你可以采用第二种方法。
这种方式,可以让你使用你最熟悉的语言来表达你的意思。
以java为例,你可以将对个对象放到List里面来表达你要输出的值,这个在 wsdl里面是另外一种表达方式(没有List)。
axis

2003.02.27
内容安排
相关背景 软件需求、软件介绍 环境配置、测试环境 部署、使用、撤销服务 一步步做自己的Web服务 相关资料 部署WebFlow
相关背景
XML简介 SOAP简介 Web服务简介 基于Java的Web服务开发流程
XML简介
XML,全称为可扩展标记语言(Extensible Markup Language),是一种可以自定义标记的 标记语言。 由万维网协会(W3C)创建,是为 Web 设计的, W3C 可以比较方便的进行信息交流的语言。 使用XML可以很容易的创建具备自我描述特征的 数据,克服了HTML的局限。
xerces.jar
Java API for XML Processing (必须)
activation.jar
JavaBeans Activation Framework (必须)
mail.jar
Mail API for java (可选)
xmlsec.jar
XML Security API (可选)
软件介绍 – Tomcat (5)
Tomcat的目录结构
bin - 包含启动/关闭tomcat的脚本文件 common – 放置常用的类或者jar文件 conf -包含不同的配置文件
server.xml - Tomcat的主要参数 web.xml - 为不同的web应用配置参数 tomcat-users.xml – 保存Tomcat的用户、角色
软件需求 - Tomcat
作用:为Axis提供运行环境 版本:最好4.0以上 性质:Free (with source code) 下载:/builds/jakartatomcat-4.0/release/v4.1.18/bin/jakarta-tomcat4.1.18.exe 文档:/tomcat/tomcat4.1-doc/index.html
手把手教Axis1.4利用wsdl生成webserice服务端
利用AXIS开发Webservice(一) ——如何发布自己的webservice先介绍下本人开发环境吧。
JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜)+ Tomcat 5.0.28 + AXIS 1.4。
AXIS 1.4包可以在/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目录下即完成了所有的发布工作。
axis2实现WebService之复合类型数据的传递
axis2实现WebService之复合类型数据的传递接着昨天的程序,今天又进了一步,学习了webservice 的复合类型数据的传递,尤其是教程上没有的部分,我自己尝试着写,虽说耗费了一个下午的时间,但是还是非常值的,废话少说,看招!在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。
数组与类(接口)是比较常用的复合类型。
在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类(接口)。
但要注意,在定义数组类型时只能使用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示:String[] strArray = new String[]{ "自行车,飞机,火箭","中国,美国,德国","超人,蜘蛛侠,钢铁侠" } ;上面的代码可以看作是一个3*3的二维数组。
在传递类的对象实例时,除了直接将数组类型声明成相应的类或接口,也可以将对象实例进行序列化,也就是说,将一个对象实例转换成字节数组进行传递,然后接收方再进行反序列化,还原这个对象实例。
下面的示例代码演示了如何传递数组与类(接口)类型的数据,并演示如何使用字节数组上传图像。
本示例的客户端代码使用Java编写。
要完成这个例子需要如下几步:一、实现服务端代码[java] view plaincopy<spanstyle="font-size:14px;">import java.io.FileOutputStream; import data.DataForm; public class ComplexTypeService { // 上传图像,imageByte参数表示上传图像文件的字节,// length参数表示图像文件的字节长度(该参数值可能小于imageByte的数组长度)public boolean uploadImageWithByte(byte[] imageByte, int length){ FileOutputStream fos = null; try{ // 将上传的图像保存在D盘的test1.jpg文件中fos = newFileOutputStream("d:\\test1.jpg"); // 开始写入图像文件的字节fos.write(imageByte, 0, length); fos.close(); }catch (Exception e) { return false; } finally{ if (fos != null){ try{ fos.close(); }catch (Exception e){ } } } return true; } // 返回一维字符串数组public String[] getArray() { String[] strArray = new String[]{ "自行车", "飞机", "火箭" }; return strArray; } // 返回二维字符串数组public String[] getMDArray() { String[] strArray = new String[]{ "自行车,飞机,火箭","中国,美国,德国", "超人,蜘蛛侠,钢铁侠" } ; return strArray; } // 返回DataForm类的对象实例public DataForm getDataForm() { return newDataForm(); } // 将DataForm类的对象实例序列化,并返回序列化后的字节数组public byte[] getDataFormBytes() throws Exception{ java.io.ByteArrayOutputStream baos = newjava.io.ByteArrayOutputStream();java.io.ObjectOutputStream oos = newjava.io.ObjectOutputStream(baos);oos.writeObject(new DataForm()); return baos.toByteArray(); } } </span>二、实现DataForm类[java] view plaincopy<spanstyle="font-size:14px;">package data; public class DataForm implements java.io.Serializable { private String name = "bill"; private int age = 20; setter…………getter方法} </span>三、发布WebService由于本示例的WebService类使用了一个Java类(DataForm类),因此,在发布WebService之前,需要先将DataForm.class文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\classes\data目录中,然后将ComplexTypeService.class文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中,最后启动Tomcat (如果Tomcat已经启动,由于增加了一个DataForm类,因此,需要重新启动Tomcat)。
AXIS实例
AXIS实现WebService需要修改web.xml文件,配置axis的servlet:<!-- axis webservice --><servlet><servlet-name>axis</servlet-name><servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class><load-on-startup>4</load-on-startup></servlet><!-- axis webservice filter --><servlet-mapping><servlet-name>axis</servlet-name><url-pattern>/axis/*</url-pattern></servlet-mapping>增加了一个wsdd文件server-config.wsdd在WebRoot/WEB-INF下面:<?xml version="1.0" encoding="UTF-8"?><deployment xmlns="/axis/wsdd/"xmlns:java="/axis/wsdd/providers/java"><globalConfiguration><parameter name="adminPassword" value="admin"/><parameter name="sendXsiTypes" value="true"/><parameter name="sendMultiRefs" value="true"/><parameter name="sendXMLDeclaration" value="true"/><parameter name="axis.sendMinimizedElements" value="true"/><requestFlow><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="session"/></handler><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="request"/><parameter name="extension" value=".jwr"/></handler></requestFlow></globalConfiguration><handler name="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <handler name="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder"/><handler name="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper"/><service name="User" provider="java:RPC"><parameter name="allowedMethods" value="*"/><parameter name="className"value="com.sillycat.core.webservice.impl.JaxRpcUserService"/><beanMappinglanguageSpecificType="java:com.sillycat.core.webservice.model.IUser"qname="ns:IUser" xmlns:ns="urn:BeanService"/></service><transport name="http"><requestFlow><handler type="URLMapper"/><handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/></requestFlow></transport><transport name="local"><responseFlow><handler type="LocalResponder"/></responseFlow></transport></deployment>其中的有些地方需要修改:<service name="User" provider="java:RPC"><parameter name="allowedMethods" value="*"/><parameter name="className"value="com.sillycat.core.webservice.impl.JaxRpcUserService"/><beanMappinglanguageSpecificType="java:com.sillycat.core.webservice.model.IUser"qname="ns:IUser" xmlns:ns="urn:BeanService"/></service>要改成自己的类名和包名webservice设置一个自己的spring配置文件,配置服务端和客户端,applicationContext-webservice.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""/dtd/spring-beans.dtd"><beans><!-- webservice axis server --><bean name="/user"class="org.springframework.remoting.httpinvoker.HttpInvokerService Exporter"><property name="service"><ref bean="jaxRpcUserService" /></property><property name="serviceInterface"><value>com.sillycat.core.webservice.IUserManager</value></property></bean><bean name="jaxRpcUserService"class="com.sillycat.core.webservice.impl.JaxRpcUserService"/><!-- webservice axis client --><bean id="userManagerRemote"class="com.sillycat.plugin.webservice.axis.AxisPortProxyFactoryBea n"lazy-init="true"><property name="serviceFactoryClass"><value>org.apache.axis.client.ServiceFactory</value></property><property name="wsdlDocumentUrl"><value>http://localhost/easyLife/axis/User?wsdl</value></property><property name="namespaceUri"><value>http://localhost/easyLife/axis/User</value></property><property name="serviceName"><value>JaxRpcUserServiceService</value></property><property name="portName"><value>User</value></property><property name="serviceInterface"><value>com.sillycat.core.webservice.IUserManager</value></property></bean></beans>配置就到这里结束了。
WebAssembly的应用场景和实现原理
WebAssembly的应用场景和实现原理WebAssembly,简称Wasm,是一种可以在Web浏览器里运行的二进制格式的代码语言。
它被设计出来的目的是为了让Web前端开发者可以使用更高效、更灵活、更安全的编程语言来开发Web应用,同时,WebAssembly也可以减少Web前端应用的大小和运行时的开销。
WebAssembly是一项新兴的技术,目前已经在许多领域发挥了重要的作用。
WebAssembly的应用场景WebAssembly的应用场景非常广泛,它可以应用于Web浏览器里的各种Web前端应用中,也可以应用于联机游戏、图形处理和计算机视觉等其他领域。
下面就来简单介绍一下WebAssembly的应用场景:1. Web前端开发WebAssembly是一种可以在Web浏览器里运行的代码语言,可以为Web前端开发者提供更高效、更灵活、更安全的编程语言。
Web前端开发者可以用WebAssembly来编写底层的算法和数据结构,进而提高Web前端应用的性能和体验。
2. 联机游戏WebAssembly可以使联机游戏在Web浏览器里实现本地化,因为它可以编译为原生的机器码。
这样,在Web浏览器里玩游戏的用户无需安装插件或下载软件,就可以享受到本地化的游戏体验,同时游戏的运行速度也更快。
3. 图形处理WebAssembly还可以用于图形处理,因为它可以很好地处理音频和视频文件。
这意味着,用WebAssembly来编写图形处理器,可以让Web前端应用的处理速度更快,同时也可以降低Web前端应用的大小。
4. 计算机视觉WebAssembly也可以用于计算机视觉领域。
通过使用WebAssembly,可以实现一些计算密集型的算法,例如语音识别、人脸识别等。
这些功能可以被集成到Web前端应用中,就像普通的JavaScript代码一样。
WebAssembly的实现原理WebAssembly是一种二进制格式的代码语言,它可以编译为原生的机器码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文主要介绍使用service方式实现Web服务、复杂类型参数或者返回值以及面向消息/文档的服务类型,同时还会简单提及Web服务的会话管理以及安全问题等等。
前段时间我的一篇文章《应用AXIS开始Web服务之旅》介绍了如何通过AXIS 这个项目来实现Web服务的功能。
该文章主要介绍AXIS的结构、如何使用jws文件的方式开发一个简单的Web服务,并用了比较大的篇幅来介绍Web 服务的客户端编程,应该说是使用AXIS开发Web服务的入门篇,本文假设你已经看过《应用AXIS开始Web服务之旅》并对AXIS有一定的基础,在这个基础上我们将要介绍的内容有几个方面包括使用service方式实现Web服务、复杂类型参数或者返回值以及面向消息/文档的服务类型,同时还会简单提及Web服务的会话管理以及安全问题等等。
在开始我们的文章之前,我们还需要搭建一个环境,我们需要一个支持Web服务的web应用程序并假设名字为axis,如何建立请参照《应用AXIS开始Web 服务之旅》文章中的介绍。
使用定制发布编写Web服务使用jws文件的方式编写Web服务具有方便、快捷的优点,它可以很快的将你已有的类发布成Web服务。
但是更多的时候这并不是一个好的主意,因为这种做法引发的问题是我们必须要将已有类的源码发布出来,因为更多的时候我们并不想这样做;另外虽然你可以先用工具开发并调试完毕一个java文件后再改名为jws,但是这多少有些便扭,而且并不是类中的所有方法你都想发布成可通过Web服务来访问的,这时候你就必须将这些方法的修饰符改为不是public 的,这就跟你原有的类不同步,以后的修改将会更加的麻烦。
在这里我把定制发布方式称为service方式,就好像JSP的出现不会使Servlet 失宠的道理一样,有了jws,service 方式还是有它的用武之地,而且是大放异彩。
发布一个service方式的Web服务需要两部分内容:类文件以及Web服务发布描述文件。
下面我们使用一个简单的例子来讲述这个过程。
首先我们需要一个service类,这个类跟普通的类没有任何区别,下面是我们实现一个城市便民服务的类,我们需要将CityService类的两个方法getZip和getTel发布成Web服务,编译该文件并把class文件拷贝到<webapp>/WEB-INF/classes对应目录下。
Package lius.axis.demo;/*** 该类实现了城市服务,用于发布成Web服务* @author Liudong*/public class CityService {/*** 获取指定城市的邮编* @param city* @return*/public String getZip(String city) {return "510630";}/*** 获取指定城市的长途区号* @param city* @return*/public String getTel(String city) {return "020";}}程序已经完成,下面是发布这个Web服务。
打开<webapp>/WEB-INF/server-config.wsdd 如果这个文件不存在则创建一个新的文件,内容如下:<?xml version="1.0" encoding="UTF-8"?><deployment xmlns="/axis/wsdd/"xmlns:java="/axis/wsdd/providers/java"> <globalConfiguration><parameter name="adminPassword" value="admin"/><parameter name="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl"/><parameter name="sendXsiTypes" value="true"/><parameter name="sendMultiRefs" value="true"/><parameter name="sendXMLDeclaration" value="true"/><parameter name="axis.sendMinimizedElements" value="true"/><requestFlow><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="session"/></handler><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="request"/><parameter name="extension" value=".jwr"/></handler></requestFlow></globalConfiguration><handler name="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder"/>< code sample is too wide > <handler name="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper"/><handler name="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> < code sample is too wide > <service name="city" provider="java:RPC"> <!-- 服务类名 --><parameter name="className" value="lius.axis.demo.CityService"/><!-- 允许访问所有方法 --><parameter name="allowedMethods" value="*"/></service><transport name="http"><requestFlow><handler type="URLMapper"/><handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/></requestFlow></transport><transport name="local"><responseFlow><handler type="LocalResponder"/></responseFlow></transport></deployment>其中粗斜体的部分是我们服务的配置信息,启动Tomcat并打开浏览求访问地址:http://localhost:8080/axis/services/city?wsdl ,下面是浏览器显示我们Web服务的WDSL数据。
当然了,这个过程比起jws方式来说是稍微麻烦一点,你可以把它想象成你发布一个servlet一样,创建servlet类然后在web.xml中加入配置信息。
处理复杂类型参数和返回值之前我们做的演示程序都很简单,方法的参数和返回值都是简单类型的数据,但是在实际应用过程中往往没有这么简单。
在使用面向对象的编程语言时,我们会希望数据类型可以是某个对象,比如我们提供一个接口用来发送短信息,那么我们希望接口的参数是一个消息对象,这个消息对象封装了一条信息的所有内容包括发送者、接收者、发送时间、优先级、信息内容等等,如果我们把每个内容都做成一个参数,那这个接口的参数可能会非常的多。
因此封装成对象是很有必要的。
在使用Axis来编写Web服务时对复杂类型数据的处理同样也是非常简单。
Axis 要求复杂类型对象的编写必须符合JavaBean的规范,简单的说就是对象的属性是通过getter/setter方法来访问的。
来看看下面这个简单的例子所输出的WSDL信息有何特殊的地方。
为了简便,我们还是使用jws来编写,需要编写三个文件:sms.jws,Message.java,Response.java。
//文件名:sms.jwsimport lius.axis.demo.*;public class sms{/*** 短信息发送Web服务接口*/public Response send(Message msg) throws Exception{ System.out.println("CONTENT:"+msg.getContent());Response res = new Response();res.setMessage(msg);res.setCode(0);res.setErrorText("");return res;}}//Message.javapackage lius.axis.demo;/*** 欲发送的信息* @author Liudong*/public class Message {private String from;private String to;private String content;private int priority;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 int getPriority() {return priority;}public void setPriority(int priority) {this.priority = priority;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}}//Response.javapackage lius.axis.demo;/*** 信息发送回应,在这里我们做了一个对Message 类的引用 * @author Liudong*/public class Response {private int code;//发送结果代码private String errorText;private Message 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 Message getMessage() {return message;}public void setMessage(Message message) {this.message = message;}}编译Message.java和Response.java并将编译后的类文件拷贝到axis/WEB-INF/classes对应包的目录下,sms.jws拷贝到axis目录,访问http://localhost:8080/axis/sms.jws?wsdl即可看到WSDL信息,这些信息与之前不同的在于下面列出的内容(注意粗斜体部分内容):<wsdl:types><schema targetNamespace="http://demo.axis.lius"xmlns="/2001/XMLSchema"><import namespace="/soap/encoding/" /> <complexType name="Message"><sequence><element name="content" nillable="true" type="xsd:string" /> <element name="from" nillable="true" type="xsd:string" /><element name="priority" type="xsd:int" /><element name="to" nillable="true" type="xsd:string" /></sequence></complexType><complexType name="Response"><sequence><element name="code" type="xsd:int" /><element name="errorText" nillable="true" type="xsd:string" /> <element name="message" nillable="true" type="tns1:Message" /> </sequence></complexType></schema></wsdl:types>这里定义了两个类型Message和Response,就是我们接口的参数类型以及返回值的类型。