﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-菠萝三国-文章分类-AXIS</title><link>http://www.blogjava.net/boluobn/category/24672.html</link><description>大江东去,浪淘尽...</description><language>zh-cn</language><lastBuildDate>Fri, 31 Aug 2007 07:03:42 GMT</lastBuildDate><pubDate>Fri, 31 Aug 2007 07:03:42 GMT</pubDate><ttl>60</ttl><item><title>Web Service深度编程——Axis序列化/反序列化器开发指南</title><link>http://www.blogjava.net/boluobn/articles/141322.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 30 Aug 2007 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/141322.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/141322.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/141322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/141322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/141322.html</trackback:ping><description><![CDATA[<h3>&nbsp;</h3>
<table class=blog-content>
    <tbody>
        <tr>
            <td>
            <p>JAVA——咖啡馆Velocity 的应用示例- -| 回首页 | 2005年索引 | - -Web Service 的开发层次<br>Web Service深度编程——Axis序列化/反序列化器- -<br>Tag： Web &nbsp; Service &nbsp; Axis &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br><br>Web Service深度编程——Axis序列化/反序列化器开发指南<br><br><br>作者：薛谷雨<br><br>作者简介<br><br>薛谷雨是NORDSAN(北京)信息科技开发有限公司高级JAVA研发工程师，正致力于企业级异构数据交换的服务器产品的研发，在J2EE和WEB SERVICE方面有较为丰富的开发经验，你可以通过 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#97;&#105;&#110;&#105;&#103;&#104;&#116;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><font color=#3d7db3>rainight@126.com</font></a> 与他取得联系。<br><br>前言<br><br>Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目。Axis为开发者提供了大量的序列化/反序列化器，能够基本满足大部分应用。但在某些情况下，对特定的对象，现有的序列化/反序列化器不能胜任，于是只有开发人员自己实现专用于此对象的序列化/反序列化器插入到Axis中来完成序列化工作。考虑到Web Service是一门新兴技术，中文资料大多是泛泛的讲解，关于序列化/反序列化器的开发鲜有较为深入的介绍，本文提供一份较为完整的开发指南，并提供了一个十分有用的实现，即序列化JDOM模型的Element,使其可以通过Web 服务在网络上传输，我想这一扩展是许多采用JDOM作为XML解析工具的开发人员都梦寐以求的功能。通过本文的介绍和实例，希望能起到抛砖引玉的作用，读者在阅读完本文之后可以轻松的实现针对于任何非符合BEAN规范的对象的序列化/反序列化器。<br><br>本文所面对的读者需要有一定的使用Axis做Web服务开发的开发经验，因此关于如何Axis的基础知识并不在本文的介绍范围，如果读者对此感兴趣，可以参考本文最后的参考资料部分，去相应的网站进行学习。<br><br>序列化/反序列化器简介<br><br>序列化/反序列化器在英文中的对应翻译是Serializer/Deserializer，一个序列化器的功能是遵循一定的映射规则和编码风格，将一种类型的JAVA对象通过某种特定的机制，转换成为XML描述的形式；反序列化器的功能是序列化器所做工作的逆操作，两者相辅相成，成对出现。Axis中的序列化/反序列化器采用设计范式中的工厂模式，每一个Serializer唯一对应一个SerializerFactory；每一个Deserializer唯一对应一个DeserializerFactory。一种类型的JAVA对象具体要采用哪个序列化/反序列化器需要在提供Web服务的服务器和调用Web服务的客户端分别配置，关于这一部分如何配置，我将在本文后面的内容中进行详细介绍。Axis已经为开发者提供了丰富的序列化/反序列化器,对于java的基本数据类型，绝大部分常用的容器类(比如数组类型，Vector类型等)都提供了实现，特别是提供了对W3C的DOM对象(比如Document, Element等)和符合Bean规范的JAVA对象提供了功能完善的序列化/反序列化器，因此我们在需要的时候只要在配置文件中配置一下就可以直接使用。如果对象中包含其它类型的对象，比如Vector中包含一组Bean对象，Axis会自动叠代的调用序列化器，最终拼装成唯一的XML表述。在还原成JAVA对象时，也遵循这样的叠代操作逆向进行。关于Axis到底内置了哪些序列化/反序列化器，您可以参照Axis的API文档中包org.apache.axis.encoding.ser下的类的名称"望文生义"的了解一下，在以后的开发中做到心中有数。但对于一些特殊类型的对象(其实我们自己开发的很大一部分类都是这种特殊类型的对象，很少有绝对符合Bean规范的)，需要通过Web服务进行传递，我们不得不开发自己的序列化/反序列化器。<br><br>开发篇<br><br>开发自己的序列化/反序列化器是一个激动人心的工作，但是却并不复杂,需要做的事情包括实现名成为org.apache.axis.encoding的包中的SerializerFactory，Serializer，DeserializerFactory和Deserializer这四个接口。下面我将结合一个实例来讲解序列化/反序列化器的开发方法，希望读者能够一边参看本文提供的源代码一边学习。<br><br>JDOM作为一款比较"另类"的XML解析工具(因为它不符合W3C的DOM模型，自己另立一套)默默地占领着java世界里的xml解析器的半壁江山，由于其简洁的设计和方便灵活的API调用，已经渐渐成为了许多开发人员在进行XML开发的首选。但是Axis是建立在W3C的DOM模型的基础之上，师出名们正派，自然不屑与JDOM为伍。因此当开发人员想将自己已经写好的基于JDOM的应用模块采用Web服务的方式发布的时候，不可避免的会遇到如何将JDOM模型下的对象如Document, Element等序列化的问题。在软件工程师不会自己扩展Axis的序列化/反序列化器的时候，我们只能有两个办法达到这个目的，第一个就是更改以前应用模块内的API设计,使暴露的入口参数和返回值参数都是W3C的对象类型，但这种做法并不现实，因为这一应用模块往往不是独立存在，牵一发将动全身，导致旧有系统架构的崩塌；另一种做法就是为这个模块做一个代理类，它做的工作就对外接收或返回DOM模型的对象，对内转换成JDOM模型的对象，然后转发给应用模块，繁琐且效率低下。当我们向Axis注入了针对于JDOM模型的序列化/反序列化器后，这一工作便可以由Axis代劳了。下面我们将逐个开发这四个类：<br><br>JDomElementSerializerFactory<br><br>JDomElementSerializerFactory是一个工厂类，需要通过某种机制注册到Axis引擎(具体方法见下面"服务器端应用篇")；Axis通过调用它，来实例化JDomElementSerializer。Axis 提供了BaseSerializerFactory,这个类是一个抽象类，并实现其中包含了一些可重用的代码。我们自己开发的工厂类只需简单继承这个类就可以。构造函数中需要调用父类的构造函数将序列器类下面是它的源代码：<br><br>package org.apache.axis.encoding.ser;<br><br>public class JDomElementSerializerFactory <br>extends BaseSerializerFactory {<br><br>public JDomElementSerializerFactory() {<br>&nbsp; super(JDomElementSerializer.class);<br>}<br>}<br><br>JDomElementSerializer<br><br>JDomElementSerializer实现org.apache.axis.encoding.Serializer接口，其核心API是serialize()，我们需要在这个方法的内部完成对JDOM模型的Element的序列化工作,序列化的结果要保存在入口参数传入的序列化上下文对象（SerializationContext）中：<br><br>public void serialize(QName name, Attributes attributes, Object value,<br>SerializationContext context) throws java.io.IOException {<br><br>&nbsp; if (!(value instanceof Element))<br>&nbsp; &nbsp; throw new IOException(<br>&nbsp; &nbsp; Messages.getMessage("cant Serialize Object"));<br><br>&nbsp; //获取符合JDOM的Element对象<br>&nbsp; Element root=(Element)value;<br><br>&nbsp; //输出到StringWriter<br>&nbsp; XMLOutputter outputter=new XMLOutputter();//创建一个JDOM的XML输出器<br>&nbsp; StringWriter sw=new StringWriter();<br>&nbsp; outputter.output(root,sw);<br><br>&nbsp; //用支持W3C的DOM模型的Xerces解析器解析文本流<br>&nbsp; DOMParser parser=new DOMParser();//创建一个DOM的XML解析器<br>&nbsp; try {<br>&nbsp; &nbsp; parser.parse(new org.xml.sax.InputSource(<br>&nbsp; &nbsp; &nbsp; &nbsp; new java.io.StringReader(sw.toString())));<br>&nbsp; }catch (Exception ex) {<br>&nbsp; &nbsp; throw new java.io.IOException("序列化时产生错误");<br>&nbsp; }<br><br>&nbsp; //获取符合DOM模型的Element对象<br>&nbsp; org.w3c.dom.Element w3c_root =<br>&nbsp; &nbsp; &nbsp; parser.getDocument().getDocumentElement();<br><br>&nbsp; //放入序列化上下文对象中<br>&nbsp; context.startElement(name, attributes);<br>&nbsp; context.writeDOMElement(w3c_root);<br>&nbsp; context.endElement();<br>}<br><br>JDomElementDeserializerFactory<br><br>反序列化器的工厂类同序列化器的工厂类一样的设计，在此不在赘述。代码：<br><br>package org.apache.axis.encoding.ser;<br><br>public class JDomElementDeserializerFactory <br>extends BaseDeserializerFactory {<br><br>public JDomElementDeserializerFactory() {<br>&nbsp; super(JDomElementDeserializer.class);<br>}<br><br>}<br><br>JDomElementDeserializer<br><br>用过SAX解析XML的读者，对反序列化的实现比较容易理解，反序列化也采用了消息触发的机制，我们只需继承org.apache.axis.encoding.DeserializerImpl类，并覆盖其中的onEndElement方法：<br><br>/**<br>&nbsp; * 在元素结束触发反序列化的方法<br>&nbsp; * @param namespace String 命名空间<br>&nbsp; * @param localName String 本地名称<br>&nbsp; * @param context DeserializationContext 反序列化上下文<br>&nbsp; * @throws SAXException<br>&nbsp; */<br>public void onEndElement(String namespace, String localName, <br>&nbsp; DeserializationContext context) throws SAXException {<br><br>&nbsp; try {<br>&nbsp; &nbsp; //从反序列化上下文对象中获取原始的消息元素<br>&nbsp; &nbsp; MessageElement msgElem = context.getCurElement();<br>&nbsp; &nbsp; if (msgElem != null) {<br>&nbsp; &nbsp; MessageContext messageContext = context.getMessageContext();<br>&nbsp; &nbsp; Boolean currentElement = (Boolean) messageContext.getProperty(<br>&nbsp; &nbsp; &nbsp; &nbsp; DESERIALIZE_CURRENT_ELEMENT);<br><br>&nbsp; &nbsp; //如果当前的消息元素本身需要反序列化<br>&nbsp; &nbsp; if (currentElement != null &amp;&amp; currentElement.booleanValue()) {<br>&nbsp; &nbsp; &nbsp; org.w3c.dom.Element element = msgElem.getAsDOM();<br>&nbsp; &nbsp; &nbsp; org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();<br>&nbsp; &nbsp; &nbsp; value=db.build(element);<br>&nbsp; &nbsp; &nbsp; messageContext.setProperty(DESERIALIZE_CURRENT_ELEMENT, <br>&nbsp; &nbsp; &nbsp; &nbsp; Boolean.FALSE);<br>&nbsp; &nbsp; &nbsp; return;<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; //反序列化消息元素中的消息体<br>&nbsp; &nbsp; java.util.ArrayList children = msgElem.getChildren();<br>&nbsp; &nbsp; if (children != null) {<br><br>&nbsp; &nbsp; &nbsp; //取得消息体<br>&nbsp; &nbsp; &nbsp; msgElem = (MessageElement) children.get(0);<br>&nbsp; &nbsp; &nbsp; if (msgElem != null) {<br>&nbsp; &nbsp; &nbsp; &nbsp; org.w3c.dom.Element ret = msgElem.getAsDOM();<br>&nbsp; &nbsp; &nbsp; &nbsp; org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();<br><br>&nbsp; &nbsp; &nbsp; &nbsp; //用DOMBuilder将DOM模型的Element,转换成JDOM模型的Element<br>&nbsp; &nbsp; &nbsp; &nbsp; value=db.build(ret);<br>&nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; }<br>&nbsp; }<br>&nbsp; catch (Exception ex) {<br>&nbsp; &nbsp; //错误，则记日志,并抛SAXException<br>&nbsp; &nbsp; log.error(Messages.getMessage("exception00"), ex);<br>&nbsp; &nbsp; throw new SAXException(ex);<br>&nbsp; }<br>}<br><br>完成这四个类的编码，序列化/反序列化器的开发工作基本完成，下面将详细讲解使用及部署方法。<br><br>服务器端应用篇<br><br>为了简单起见，我们将一个很简单的类通过Web服务发布,类中只有一个名称为hello函数，函数的返回值为JDOM模型的Element。代码如下：<br><br>package test;<br><br>import org.jdom.*;<br>import java.rmi.RemoteException;<br><br>public class Sample1 implements java.rmi.Remote{<br>public Sample1() {<br>}<br><br>public Element hello(String name){<br>&nbsp; Element root=new Element("root");<br>&nbsp; Element hello=new Element("hello");<br>&nbsp; hello.setText("hello,"+name+"!");<br>&nbsp; root.addContent(hello);<br>&nbsp; return root;<br>}<br><br>}<br><br>关于如何将一个类发布成Web服务，在此并不进行介绍，相信读者可以自己完成，我们只关注如何将序列化/反序列化器加入到我们的Web服务中。打开web服务的配置文件server-config.xml,编辑关于Sample1的服务的配置部分：<br><br><br><br>注意上面代码中的粗体字部分，是我们现在要添加的，它表述了如何将序列化反序列化器部署到Web服务中。<br><br>部署到Web Server<br><br>解压缩本文后面附带的源代码，根目录下有build.xml文件，读者需要正确安装配置好Apache Ant，然后运行<br><br>Ant make<br><br>编译后可生成压缩文件sample.war。将生成的war包部署到Tomcat4.1下，启动Tomcat,本文默认的Tomcat监听的http端口为8080。后面的客户端测试程序也将通过连接这一端口访问此Web服务。如果读者的Tomcat不在8080端口上工作，那么客户端程序也要进行相应的修改。最后启动Tomcat,这部分操作完成。 <br><br>客户端应用篇<br><br>下面我们将编写客户端程序访问刚才部署的Web服务，讲解如何把我们编写的序列化/反序列化器加载到客户端应用程序中，下面是客户端调用的代码,注意斜体字部分，是关于序列化/反序列化器的注册过程(如果你的Web服务器不是工作在8080端口，或采用了其他Web服务名，请自行更改下面程序中的url变量中的值)，我们在test包下创建了一个名称为 Client的类，代码如下：<br><br>package test;<br><br>import org.apache.axis.client.Service;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.utils.Options;<br>import javax.xml.namespace.QName;<br><br>public class Client {<br>public Client() {<br>}<br><br>public static void main(String[] args) throws Exception{<br>&nbsp; if(args.length&lt;1){<br>&nbsp; &nbsp; System.out.println("错误：缺少参数");<br>&nbsp; &nbsp; System.exit(0);<br>}<br>&nbsp; //Web服务的URL<br>&nbsp; String url="<a href="http://localhost:8080/sample/services/Sample1" target=_blank><font color=#3d7db3>http://localhost:8080/sample/services/Sample1</font></a>";<br>&nbsp; Service service=new Service();<br>&nbsp; Call call = (Call)service.createCall();<br>&nbsp; call.setTargetEndpointAddress(url);<br><br>&nbsp; //注册序列化/反序列化器<br>&nbsp; call.registerTypeMapping(org.jdom.Element.class,<br>&nbsp; &nbsp; &nbsp; new QName("<a href="http://jdom.org/" target=_blank><font color=#3d7db3>http://jdom.org</font></a>","Element"),<br>&nbsp; &nbsp; new org.apache.axis.encoding.ser.JDomElementSerializerFactory(),<br>&nbsp; &nbsp; new org.apache.axis.encoding.ser.JDomElementDeserializerFactory());<br><br>&nbsp; //设置调用方法<br>&nbsp; call.setOperationName(<br>&nbsp; &nbsp; &nbsp; new javax.xml.namespace.QName("<a href="http://test/" target=_blank><font color=#3d7db3>http://test</font></a>", "hello"));<br><br>&nbsp; //Web服务调用<br>&nbsp; java.lang.Object _resp = call.invoke(new java.lang.Object[] {args[0]});<br><br>&nbsp; //输出到屏幕<br>&nbsp; org.jdom.output.XMLOutputter out=new org.jdom.output.XMLOutputter();<br>&nbsp; out.output( (org.jdom.Element) _resp, System.out);<br><br>}<br><br>}<br><br>编译后运行该程序，在控制台窗口工程的根目录下输入<br><br>run world ( 其中"world"为调用例程中API的入口参数)<br><br>经过一次web通讯，一两秒后屏幕将显示运行结果：<br><br><br>&nbsp; hello,world!<br><br><br>至此我们完成了一次Web服务的访问过程。如果在程序执行过程中，我们用TCP Moniter之类的工具监视这一次访问中的在网络中流入流出的数据，可以看到客户端发起调用的xml数据流如下：<br><br>POST /sample/services/Sample1 HTTP/1.0<br>Content-Type: text/xml; charset=utf-8<br>Accept: application/soap+xml, <br>application/dime, multipart/related, text/*<br>User-Agent: Axis/1.1<br>Host: 127.0.0.1<br>Cache-Control: no-cache<br>Pragma: no-cache<br>SOAPAction: ""<br>Content-Length: 430<br><br><br>&nbsp; world<br><br><br><br><br>服务器端返回的结果的XML输出流如下：<br><br>HTTP/1.1 200 OK<br>Content-Type: text/xml; charset=utf-8<br>Date: Wed, 31 Mar 2004 06:42:18 GMT<br>Server: Apache Coyote/1.0<br>Connection: close<br><br>&nbsp; <br>&nbsp; hello,world!<br>&nbsp; <br><br>结语<br><br>以上详细讲解了Axis的序列化/反序列化器的开发过程，相信读者已经从中学到了不少知识，并能够应用于自己的项目开发中去。通过掌握这一技术，我们将更为深刻的理解Axis的内部结构和Web服务的工作机理，这些经验是市面上那些泛泛的讲解JAVA Web服务的参考书上所学不到的。后续的文章还将向您展示一些在Java Web服务深度开发中的高级技术，让您真正驾驭Axis。<br><br>参考资料<br><br>附件中提供了本文中的全部源码，它是一个完整的工程,可以参考学习。 <br>在apache的网站您可以获得最新的Axis库及其开发文档：<a href="http://ws.apache.org/axis/" target=_blank><font color=#3d7db3>http://ws.apache.org/axis/</font></a> 本文中提到的Tomcat Web服务器可以在这里免费获得：<a href="http://jakarta.apache.org/tomcat/index.html" target=_blank><font color=#3d7db3>http://jakarta.apache.org/tomcat/index.html</font></a> <br>《IBM DEVELOPWORK》中一个关于web服务的教程《从JAVA类创建web服务》，是您快速掌握Web服务开发的很好教材，初学者可以进行学习。 <br>JDOM类库可以去<a href="http://www.jdom.org/" target=_blank><font color=#3d7db3>www.jdom.org</font></a>下载，CSDN上有一篇不错的文章可以让您快速掌握JDOM的使用方法。<a href="http://www.csdn.net/develop/Read_Article.asp?Id=13806" target=_blank><font color=#3d7db3>http://www.csdn.net/develop/Read_Article.asp?Id=13806</font></a> <br></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/boluobn/aggbug/141322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-30 12:42 <a href="http://www.blogjava.net/boluobn/articles/141322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis开发Webservice传Bean对象返回String串的实例</title><link>http://www.blogjava.net/boluobn/articles/141311.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 30 Aug 2007 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/141311.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/141311.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/141311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/141311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/141311.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.blogjava.net/waterjava/archive/2007/06/29/127044.html"><u><font color=#800080>Axis开发Webservice传Bean对象返回String串的实例 </font></u></a></h2>
这几天也一直在为了设计与实现一个业务平台,想用Webservice 来作为核心技术来实现,也一直想精溢求精地把这个东东搞好, 突然觉得好久没来这里写日志了.呵,时间如白驹过隙啊!
<p>&nbsp;</p>
<p>&nbsp; 对于webService 以前也接触过.但只是皮毛,这次可是来真格的.来就来吧,年轻人这就是机会.一定得把握好,干它一票! 呵,就在网上到处找找啊,在本地机器上左试试,右试试啊, 什么法子都用一遍。就不信搞不定它，小样！</p>
<p>&nbsp;</p>
<p>&nbsp; 网上的例子也比较散，比较简易的，达不我想要的业务水平，只能慢慢搜索与摸索吧。。。。。。就这样天天想着这事，也没什么心情来这里写写。</p>
<p>&nbsp;</p>
<p>&nbsp; 近些天，也快回深圳了，定在下周四动身吧。这边的工作也得告一节了。把我前一些日子，搞一个完整的Samples 放到这里来，与大家共享。希望对有心人有些启发，也希望高人指点与点评。。。。。。。、</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; ****************************************************<br>&nbsp;&nbsp; *Axis开发Webservice传Bean对象返回String串的实例.rtf*<br>&nbsp;&nbsp; ****************************************************</p>
<p>&nbsp;</p>
<p>在ECLIPSE 里新建一工程，其次建包，再次建类，<br>基本包：samples.userguide.example5<br>基本类： Order.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>内容：<br>&nbsp;&nbsp;&nbsp; *&nbsp; Order.java *<br>*《********************************</p>
<p>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>blackskin@126.com</font></u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/<br>public class Order {<br>&nbsp;/** Who's ordering */<br>&nbsp;private String customerName;</p>
<p>&nbsp;/** Where do they live */<br>&nbsp;private String shippingAddress;</p>
<p>&nbsp;/** Which items do we want */<br>&nbsp;private String itemCodes[];</p>
<p>&nbsp;/** And how many */<br>&nbsp;private int quantities[];</p>
<p>&nbsp;// Bean accessors</p>
<p>&nbsp;public String getCustomerName() {<br>&nbsp; return customerName;<br>&nbsp;}</p>
<p>&nbsp;public void setCustomerName(String name) {<br>&nbsp; customerName = name;<br>&nbsp;}</p>
<p>&nbsp;public String getShippingAddress() {<br>&nbsp; return shippingAddress;<br>&nbsp;}</p>
<p>&nbsp;public void setShippingAddress(String address) {<br>&nbsp; shippingAddress = address;<br>&nbsp;}</p>
<p>&nbsp;public String[] getItemCodes() {<br>&nbsp; return itemCodes;<br>&nbsp;}</p>
<p>&nbsp;public void setItemCodes(String[] items) {<br>&nbsp; itemCodes = items;<br>&nbsp;}</p>
<p>&nbsp;public int[] getQuantities() {<br>&nbsp; return quantities;<br>&nbsp;}</p>
<p>&nbsp;public void setQuantities(int[] quants) {<br>&nbsp; quantities = quants;<br>&nbsp;}<br>}</p>
<p>********************************》*</p>
<p>&nbsp;</p>
<p>主服务包: samples.userguide.example5<br>主服务类: BeanService.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;如下：<br>&nbsp;&nbsp;&nbsp; * BeanService.java *<br>**《*******************************<br>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>blackskin@126.com</font></u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/</p>
<p>public class BeanService {<br>&nbsp;public String processOrder(Order order) {<br>&nbsp; String sep = System.getProperty("line.separator");</p>
<p>&nbsp; String response = "Hi, " + order.getCustomerName() + "!" + sep;</p>
<p>&nbsp; response += sep + "You seem to have ordered the following:" + sep;</p>
<p>&nbsp; String[] items = order.getItemCodes();<br>&nbsp; int[] quantities = order.getQuantities();</p>
<p>&nbsp; for (int i = 0; i &lt; items.length; i++) {<br>&nbsp;&nbsp; response += sep + quantities[i] + " of item : " + items[i];<br>&nbsp; }</p>
<p>&nbsp; response += sep + sep + "If this had been a real order processing system, "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + sep + "we'd probably have charged you about now.";</p>
<p>&nbsp; return response;<br>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) throws Exception{<br>&nbsp; /** Who's ordering */<br>&nbsp; String customerName = "Black Skin";<br>&nbsp; /** Where do they live */<br>&nbsp; String shippingAddress = "001 xingan Street, bayuquan, YK";<br>&nbsp; /** Which items do we want */<br>&nbsp; String[] items = new String[] { "apple", "160ml-Milk" }; <br>&nbsp; /** And how many */<br>&nbsp; int[] quantities = new int[] { 2, 4 };<br>&nbsp; /** request class init() */<br>&nbsp; Order order = new Order();<br>&nbsp; order.setCustomerName(customerName);<br>&nbsp; order.setShippingAddress(shippingAddress);<br>&nbsp; order.setItemCodes(items);<br>&nbsp; order.setQuantities(quantities); <br>&nbsp; /** server class init() */<br>&nbsp; BeanService beanservice = new BeanService();<br>&nbsp; String result = beanservice.processOrder(order);<br>&nbsp; /** OutPut the result */<br>&nbsp; System.out.println(" " + result);&nbsp; <br>&nbsp;}<br>&nbsp; <br>}</p>
<p>********************************》*</p>
<p>&nbsp;</p>
<p>&nbsp;BeanService.java里有个本地测试方法(samples.userguide.example5.BeanService.main())，来测试此应用的可运行性；</p>
<p><br>到此，服务端类写完了，接着来把此类的方法发布成 WebService 接口</p>
<p>手写一个deploy.wsdd 文件，可以参考下面的例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *deploy.wsdd例子*<br>*《********************************<br>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/</font></u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt; <br>&lt;service name="服务名" provider="java:RPC"&gt; <br>&lt;parameter name="className" value="服务类文件的实际路径（包括包的信息）"/&gt; <br>&lt;parameter name="allowedMethods" value="*（即为所有方法都可访问，如要指定多个可用空格分隔开）"/&gt; <br>&lt;parameter name="allowedRoles" value="user"/&gt; <br>&lt;parameter name="scope" value="Session"/&gt; <br>&lt;requestFlow&gt; <br>&lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt; <br>&lt;/requestFlow&gt; <br>&lt;/service&gt; <br>&lt;/deployment&gt; <br>********************************》*</p>
<p>显然，简单，造一个deploy.wsdd 信手捏来,如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *deploy.wsdd*<br>*《********************************<br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/</font></u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;service name="OrderProcessor" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="samples.userguide.example5.BeanService"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="processOrder"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beanMapping qname="myNS:Order" xmlns:myNS="urn:BeanService" languageSpecificType="java:samples.userguide.example5.Order"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&lt;/deployment&gt;<br>********************************》*</p>
<p>有了deploy.wsdd文件了，接着通过它来生成 server-config.wsdd.<br>OK! 用命令直接生成就行；在deploy.wsdd 的文件夹下新建一个 makeWsdd.bat.<br>其中的写法有下面的例子来参考：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * makeWsdd.bat 例子*<br>*《********************************<br>set AXISCLASSPATH= &#8220;应用发布的路径&#8221;<br>set AXIS_LIB= &#8220;AXIS框架的内部JAR包LIB路径&#8221;<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;<br>%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java -Djava.ext.dirs=%AXISCLASSPATH% org.apache.axis.client.AdminClient <br>&nbsp;-S服务名\services\AdminService -p端口号（如果你的端口号不是默认的8080需要指定。<br>&nbsp;例如：8899）deploy.wsdd <br>********************************》*</p>
<p><br>如此，我写了一&#8220;makeWsdd.bat&#8221;文件。如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * makeWsdd.bat*<br>*《********************************<br>set AXISCLASSPATH=C:\Axis_webservice\Tomcat_4.1\webapps\axis<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;<br>%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java -Djava.ext.dirs=%AXISCLASSPATH% org.apache.axis.client.AdminClient <br>&nbsp;-SBeanServer\services\AdminService -p 8080 deploy.wsdd<br>********************************》*</p>
<p>保存好，接下来架设Webservice.</p>
<p>环境架设：<br>首先，安装JDK...（略）...本例用JDK版本号V1.4.<br>其次，安装Tomcat...（略）...本例用Tomcat版本号V4.1.<br>再次，AXIS...（略）...本例用AXIS版本号V1.4. 去AXIS官方网站：<a href="http://www.apache.org/"><u><font color=#800080>http://www.apache.org</font></u></a>下载AXIS，解压后得，<br>&nbsp;&nbsp; |- axis-1_4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- docs <br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- lib<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis-ant.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- commons-discovery-0.2.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- commons-logging-1.0.4.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- jaxrpc.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- log4j-1.2.8.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- log4j.properties<br>&nbsp;&nbsp;&nbsp;&nbsp; |- saaj.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- wsdlj-1.5.1.jar<br>&nbsp;|- samples<br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- webapps<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- xmls<br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;&nbsp;&nbsp; 将解压后，C:\axis-1_4\webapps 目录下的 axis 目录 Copy 到 tomcat/webapps目录（C:\Axis_webservice\Tomcat_4_1\webapps）下，</p>
<p>架设AXIS：<br>首先，将deploy.wsdd文件Copy到 %AXISCLASSPATH%/WEB-INF 目录下；<br>其次，将之前的类编译后，连路径一起Copy到 %AXISCLASSPATH%/WEB-INF/classes目录下，<br>最后，将tomcat的 catalina 服务启动.<br>（即：C:\Axis_webservice\Tomcat_4.1\bin,</p>
<p>&nbsp;&nbsp; [特别注意的是：]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ａ。tomcat务必启动。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ｂ。在写如上的命令行时，务必注意参数的写法。&#8220;-D&#8221;　与 &#8220;-S&#8221;与其值间不能有空格。切记！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C。各XX的路径里，最好是不要有空格，因为JAVA里对大小写与路径空格有校验。<br>，）</p>
<p>测试：<br>命令行启动方法；运行"cmd",在命令行里写："cd C:\Axis_webservice\Tomcat_4.1\bin",回车，再写："&nbsp; catalina run ",回车，OK！<br>后台会报错：<br>"<br>- Unable to find config file.&nbsp; Creating new servlet engine config file: /WEB-INF/server-config.wsdd<br>2007-1-20 10:07:48 org.apache.coyote.http11.Http11Protocol start<br>信息: Starting Coyote HTTP/1.1 on port 8080<br>"<br>说明，在../WEB-INF/下没有"server-config.wsdd",暂时忽略。<br>在IE地址栏写：<a href="http://localhost:8080/axis"><u><font color=#0000ff>http://localhost:8080/axis</font></u></a><br>可见，axis 欢迎首页，点击 "list" 便可看到默认情况下发布了两个服务下各有一个方法。一切准备工作已经OK！</p>
<p><br>再回到，刚才我们写的那个批处理文件：" makeWsdd.bat"，<br>直接双击，便可执行， 有一个警告，可以忽略的。执行完成后，在相应的<br>%AXISCLASSPATH%/WEB-INF下便有一&#8220;server-config.wsdd&#8221;文件，如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *server-config.wsdd*<br>*《********************************</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/</font></u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0000ff>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt;<br>&nbsp;&lt;globalConfiguration&gt;<br>&nbsp; &lt;parameter name="sendMultiRefs" value="true"/&gt;<br>&nbsp; &lt;parameter name="disablePrettyXML" value="true"/&gt;<br>&nbsp; &lt;parameter name="adminPassword" value="admin"/&gt;<br>&nbsp; &lt;parameter name="attachments.Directory" value="C:\Axis_webservice\Tomcat_4.1\webapps\axis\WEB-INF\attachments"/&gt;<br>&nbsp; &lt;parameter name="dotNetSoapEncFix" value="true"/&gt;<br>&nbsp; &lt;parameter name="enableNamespacePrefixOptimization" value="false"/&gt;<br>&nbsp; &lt;parameter name="sendXMLDeclaration" value="true"/&gt;<br>&nbsp; &lt;parameter name="sendXsiTypes" value="true"/&gt;<br>&nbsp; &lt;parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/&gt;<br>&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="scope" value="session"/&gt;<br>&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="scope" value="request"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="extension" value=".jwr"/&gt;<br>&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp;&lt;/globalConfiguration&gt;<br>&nbsp;&lt;handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/&gt;<br>&nbsp;&lt;handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/&gt;<br>&nbsp;&lt;handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp;&lt;service name="AdminService" provider="java:MSG"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="AdminService"/&gt;<br>&nbsp; &lt;parameter name="enableRemoteAdmin" value="false"/&gt;<br>&nbsp; &lt;parameter name="className" value="org.apache.axis.utils.Admin"/&gt;<br>&nbsp; &lt;namespace&gt;http://xml.apache.org/axis/wsdd/&lt;/namespace&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;service name="Version" provider="java:RPC"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="getVersion"/&gt;<br>&nbsp; &lt;parameter name="className" value="org.apache.axis.Version"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;service name="OrderProcessor" provider="java:RPC"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="processOrder"/&gt;<br>&nbsp; &lt;parameter name="className" value="samples.userguide.example5.BeanService"/&gt;<br>&nbsp; &lt;beanMapping languageSpecificType="java:samples.userguide.example5.Order" qname="ns1:Order" xmlns:ns1="urn:BeanService"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;transport name="http"&gt;<br>&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="URLMapper"/&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp; &lt;parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/&gt;<br>&nbsp; &lt;parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/&gt;<br>&nbsp; &lt;parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/&gt;<br>&nbsp;&lt;/transport&gt;<br>&nbsp;&lt;transport name="local"&gt;<br>&nbsp; &lt;responseFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="LocalResponder"/&gt;<br>&nbsp; &lt;/responseFlow&gt;<br>&nbsp;&lt;/transport&gt;<br>&lt;/deployment&gt;</p>
<p><br>********************************》*<br>&nbsp; <br>再去打开："<a href="http://localhost:8080/axis/servlet/AxisServlet"><u><font color=#0000ff>http://localhost:8080/axis/servlet/AxisServlet</font></u></a>",或者，再刷新。<br>便可以看到，我们新发布的一个webservice接口服务，其名为："OrderProcessor "<br>此服务下的个方法：其名为："processOrder "。</p>
<p>点击服务对应的"（WSDL）"可见服务WSDL描述内容。在其中也可以得服务的访问地址：<br>"<a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u><font color=#0000ff>http://localhost:8080/axis/services/OrderProcessor?wsdl</font></u></a>"<br><span><strong class=g onmouseover='isShowAds = false;isShowAds2 = false;isShowGoogle = true;InTextAds_GoogleLayer="_u670D_u52A1_u5668_u7AEF";ads.ShowGoogleAds(this,"_u670D_u52A1_u5668_u7AEF",event)' style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline" onclick='javascript:window.open("http://www.google.com/pagead/iclk?sa=l&amp;ai=B8tpgaYyERqaCN4rasQKGnOCgBMjIzy24mYrsAqqQqaQG0IYDEAEYASDN2PgHOAFQ5_KzzAJgncHegdgFmAGVhwGYAb6IAaAB6u6K_gOqAQoxMDAwMDAwMTQ4yAEByALE63PZA9XD9EBc3ens&amp;num=1&amp;adurl=http://search.china.alibaba.com/offer/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E7%25AB%25AF.html%3Fcosite%3Dgooglejj1%26location%3Dkw_diannao_%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E7%25AB%25AF")' onmouseout='isShowGoogle = false;InTextAds_GoogleLayer="_u670D_u52A1_u5668_u7AEF"'>服务器端</strong>的开发，搞定了！</span></p>
<p>-:)&nbsp;&nbsp;&nbsp; -:)&nbsp;&nbsp;&nbsp; -:)&nbsp;&nbsp; </p>
<p>接下来，准备开发，客户端的开发。</p>
<p>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Client.java *<br>*《********************************<br>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>blackskin@126.com</font></u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/</p>
<p>import java.net.URL;</p>
<p>import org.apache.axis.AxisFault;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>import org.apache.axis.utils.Options;</p>
<p>import javax.xml.namespace.QName;<br>import javax.xml.rpc.ParameterMode;</p>
<p>public class Client {<br>&nbsp;public static void main(String[] args) throws Exception {<br>&nbsp; //Options options = new Options(args);<br>&nbsp; String urlWsdl = "<a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u><font color=#0000ff>http://localhost:8080/axis/services/OrderProcessor?wsdl</font></u></a>";</p>
<p>&nbsp; Order order = new Order();<br>&nbsp; order.setCustomerName("Black Skin");<br>&nbsp; order.setShippingAddress("275 Grove Street, Newton, MA");</p>
<p>&nbsp; String[] items = new String[] { "apple", "160ml-Milk" };<br>&nbsp; int[] quantities = new int[] { 8, 4 };</p>
<p>&nbsp; order.setItemCodes(items);<br>&nbsp; order.setQuantities(quantities);</p>
<p>&nbsp; Service service = new Service();<br>&nbsp; Call call = (Call) service.createCall();<br>&nbsp; QName qn = new QName("urn:BeanService", "Order");</p>
<p>&nbsp; call.registerTypeMapping(Order.class, qn,<br>&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanSerializerFactory(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order.class, qn),<br>&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanDeserializerFactory(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order.class, qn));<br>&nbsp; String result;<br>&nbsp; try {<br>&nbsp;&nbsp; //call.setTargetEndpointAddress(new java.net.URL(options.getURL()));<br>&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(urlWsdl));<br>&nbsp;&nbsp; call.setOperationName(new QName("OrderProcessor", "processOrder"));<br>&nbsp;&nbsp; call.addParameter("arg1", qn, ParameterMode.IN);<br>&nbsp;&nbsp; call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);</p>
<p>&nbsp;&nbsp; result = (String) call.invoke(new Object[] { order });<br>&nbsp; } catch (AxisFault fault) {<br>&nbsp;&nbsp; result = "Error : " + fault.toString();<br>&nbsp; }</p>
<p>&nbsp; System.out.println(result);<br>&nbsp;}<br>}</p>
<p>********************************》*</p>
<p>oK! 到此，一个完整的Webservice例子就搞定了。</p>
<p>另外，Axis 还提供了一些工具，如:" wsdl2java "、" java2wsdl "</p>
<p>处理的方式与方法：<br>&nbsp; java2wsdl:<br>&nbsp;&nbsp; 1. 以上为例，在以上工程的class输出目录新建一BAT文件：名为：&#8220;java2wsdl.bat&#8221;<br>&nbsp;&nbsp; 2. 其内容为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * java2wsdl.bat *<br>*《********************************<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java org.apache.axis.wsdl.Java2WSDL -o Order.wsdl&nbsp; -l"<a href="http://localhost:8080/axis/services/OrderProcessor"><u><font color=#0000ff>http://localhost:8080/axis/services/OrderProcessor</font></u></a>" -n "urn:BeanService"&nbsp; -p"samples.userguide.example5.Order" "urn:Order" samples.userguide.example5.BeanService<br>********************************》*</p>
<p>把AXIS_LIB设为正确的本地包路径，再运行&#8220;java2wsdl.bat&#8221;，<br>便可以在目录下看到一个文件：&#8220;Order.wsdl&#8221;，通过这个WSDL文件，可以生成Webservice接口服务的框架，<br>既可以是服务器端，也可以是客户端框架。其细节，可以参考下一节。</p>
<p><br>处理的方式与方法：<br>&nbsp; wsdl2java :<br>&nbsp;&nbsp; 1. 以上为例，把Order.wsdl拷贝过来，在其目录下新建一BAT文件：名为：&#8220;wsdl2java.bat&#8221;<br>&nbsp;&nbsp; 2. 其内容为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wsdl2java.bat *<br>*《********************************<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java org.apache.axis.wsdl.WSDL2Java Order.wsdl<br>********************************》*</p>
<p>或者有另外的作法：把服务端的应用启动，直接写成：<br>&#8220;<br>java org.apache.axis.wsdl.WSDL2Java <a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u><font color=#0000ff>http://localhost:8080/axis/services/OrderProcessor?wsdl</font></u></a><br>&#8221;<br>保存好后，运行这个BAT文件，<br>便会自动生成:<br>BeanService_pkg\<br>&nbsp; BeanService.java<br>&nbsp; BeanServiceService.java<br>&nbsp; BeanServiceServiceLocator.java<br>&nbsp; OrderProcessorSoapBindingStub.java&nbsp;&nbsp;&nbsp; <br>&nbsp; Order.java</p>
<p>ok.</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/141311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-30 12:32 <a href="http://www.blogjava.net/boluobn/articles/141311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Apache Axis部署 Web服务时的常见问题及其解决方法</title><link>http://www.blogjava.net/boluobn/articles/137337.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 16 Aug 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/137337.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/137337.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/137337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/137337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/137337.html</trackback:ping><description><![CDATA[<blockquote>本文详细介绍了在Linux环境下以Apache Axis+ Resin作为Web服务平台部署Web服务时的常见问题及解决方法。衷心希望本文对Web服务的开发人员或对Web服务感兴趣的读者能起到一定的帮助作用。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name=1><span class=atitle>1 引言</span></a></p>
<p><br>随着Web服务技术的发展和成熟，其方便性和易用性已逐渐被人们所接受，越来越多的合作伙伴之间开始利用Web服务来实现合作方之间的数据接口。使用Apache Axis和Linux平台是一种低成本的Web服务解决方案，但Apache Axis文档的FAQ对开发者来说内容还不够丰富，本文作者将自己使用Axis时遇到的问题和解决方法整理成文，奉献给Web服务的开发人员和对此感兴趣的读者朋友，旨在帮助大家节约一些宝贵的时间。有关Web服务的基础知识，读者可以阅读参考文献中推荐的文档。作者未在文中介绍Apache和Resin的安装方法，读者可以参考相关网站的说明文档。 </p>
<p>作者使用的软件环境如下。 </p>
<p>操作系统：Red Hat Linux 7.2 </p>
<p>Web服务器: Apache 1.3.27 </p>
<p>应用服务器：Resin 2.1.8 ( <a href="http://www.caucho.com/"><u><font color=#5c81a7>http://www.caucho.com/</font></u></a> ) </p>
<p>SOAP服务器：Apache Axis 1.1 </p>
<p>XML解析器：Xerces 2.5.0，Xalan 2.5.1 </p>
<p>JDK版本：JDK 1.4.1 <br></p>
<p><a name=2><span class=atitle>2 使用Axis时的常见问题及其解决方法</span></a></p>
<p>
<p>2.1 Axis运行需要哪些jar文件 </p>
<p>对Axis解包后，将axis-1_1/webapps/axis/WEB-INF/lib/目录下的jar文件复制到/usr/local/apache/htdocs/WEB-INF/lib目录下(Web应用程序的目录)。应包括以下jar文件。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>axis-ant.jar
            axis.jar
            commons-discovery.jar
            commons-logging.jar
            jaxrpc.jar
            log4j-1.2.8.jar
            name.txt
            saaj.jar
            wsdl4j.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果需要使用axis提供的测试页面，还要将axis-1_1/webapps/axis/目录下的文件复制到/usr/local/apache/htdocs/axis/目录下。应包括以下募? </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>EchoHeaders.jws
            fingerprint.jsp
            happyaxis.jsp
            index.html
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N10088><span class=smalltitle><strong><font face=Arial>2.2 应该使用哪一种XML解析器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>XML解析器选用不当，经常会导致使用Apache Axis时出现一些莫名其妙的问题。 </p>
<p>由于Apache Axis 并未对Resin内置的xml解析器进行过测试，因此推荐读者使用已通过测试的Xerces xml解析器。可以从 <a href="http://xml.apache.org/xalan-j/index.html"><u><font color=#5c81a7>http://xml.apache.org/xalan-j/index.html</font></u></a> 处下载Xalan的Java版XSLT处理器，其中包含了Xerces的Java版XML解析器，不需要再单独下载xml解析器。 </p>
<p>Xalan 2.5.1解包后，将bin/目录下的xercesImpl.jar、xml-apis.jar和xalan.jar复制到resin安装目录的lib/目录下，例如/usr/local/resin/lib。 </p>
<p>编辑/etc/目录下的profile文件，找到设置CLASSPATH环境变量的位置，在其后加入下面的内容(B shell)。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>XMLPARSER=$RESIN_HOME/lib/xalan.jar:$RESIN_HOME/lib/xercesImpl.jar:$RESIN_HOME/lib/xml-apis.jar
            export CLASSPATH=$XMLPARSER:$CLASSPATH
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.2.1 注意事项 <br>如果CLASSPATH中包含其它的XML解析器设置，应将其从CLASSPATH环境变量的设置中去掉，以免发生冲突。 </p>
<p><a name=N100A9><span class=smalltitle><strong><font face=Arial>2.3 如何在Resin中使用Xerces的XML解析器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>通过修改resin.conf将resin的XmlParser置换为Xerces的XmlParser。在resin.conf对应的Web应用程序配置中加入以下设置。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/&gt;
            &lt;system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/&gt;
            &lt;system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/&gt;
            &lt;system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>配置完成后重新启动Resin。</p>
<p><a name=N100BB><span class=smalltitle><strong><font face=Arial>2.4 如何排除XML解析器出现的异常</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.4.1 问题描述</p>
<p>使用http://test.com/axis查看已部署的服务时出现Axis内部错，显示有关WSDD配置的异常信息。如果把WEB-INF目录下的server-config.wsdd删除，再查看就正常了，但只能看到AdminService和Version两个系统缺省的服务，后来部署的服务都看不到了。 </p>
<p>2.4.2 原因分析</p>
<p>Axis会在WEB应用程序的WEB-INF/目录下自动生成一个名字为server-config.wsdd的xml文件，其中记录了已部署的WEB服务。每部署一个新的WEB服务时，Axis都会将新服务的描述信息加入到server-config.wsdd中。 </p>
<p>故障站点使用的XmlParser是resin内置的XmlParser，Axis并未对其对进行过兼容性测试，查看WEB服务信息时需要从server-config.wsdd(这是一个xml文件)取得已部署的WEB服务描述信息，当server-config.wsdd的内容较复杂时，resin内置的XmlParser因某种原因出现异常，导致Axis内部错误。Server-config.wsdd中记录的Web服务描述信息较少时不会出现异常。 </p>
<p>2.4.3 解决方法 </p>
<p>修改resin.conf，将resin的XmlParser置换为Xerces的XmlParser。置换方法参见2.3节。</p>
<p>2.4.4 小结 </p>
<p>如果Axis报告的错误中有关于xml解析器的错误，建议读者参照本小节描述的方法更换应用服务器的xml解析器，将会有助于问题的解决。 </p>
<p><a name=N100DE><span class=smalltitle><strong><font face=Arial>2.5 如何将Axis集成到Resin或其它应用服务器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>Axis是以Servlet的方式运行的，而Resin的作用相当于Servlets容器(Container)，因此只要配置得当，就可以使Axis在Resin环境中运行，这一点也适用于Resin以外的其它应用服务器。在Resin中配置Axis的方法如下。 </p>
<p>将axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置项复制到resin.conf中对应的Web应用程序配置中。通常应包括以下内容。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode> &lt;!-- Axis Web-Service Configuration Start --&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.transport.http.AxisServlet
            &lt;/servlet-class&gt;
            &lt;/servlet&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
            &lt;display-name&gt;Axis Admin Servlet&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.transport.http.AdminServlet
            &lt;/servlet-class&gt;
            &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
            &lt;/servlet&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
            &lt;display-name&gt;SOAPMonitorService&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.monitor.SOAPMonitorService
            &lt;/servlet-class&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;SOAPMonitorPort&lt;/param-name&gt;
            &lt;param-value&gt;5001&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
            &lt;/servlet&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/axis/servlet/AxisServlet&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/SOAPMonitor&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;!-- uncomment this if you want the admin servlet --&gt;
            &lt;!--
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/axis/servlet/AdminServlet&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            --&gt;
            &lt;!-- currently the W3C havent settled on a media type for WSDL;
            http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
            for now we go with the basic 'it's XML' response --&gt;
            &lt;mime-mapping&gt;
            &lt;extension&gt;wsdl&lt;/extension&gt;
            &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
            &lt;/mime-mapping&gt;
            &lt;mime-mapping&gt;
            &lt;extension&gt;xsd&lt;/extension&gt;
            &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
            &lt;/mime-mapping&gt;
            &lt;!-- Axis Web-Service Configuration End --&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N100F0><span class=smalltitle><strong><font face=Arial>2.6 Axis提供了哪些开发工具</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>Apache Axis提供了WSDL2Java和Java2WSDL两个开发工具。 </p>
<p>WSDL2Java利用已知的WSDL文件生成服务端和客户端代码。该WSDL文件可以是由合作伙伴提供的，也可以是利用Java2WSDL生成的。Java2WSDL根据已有的Java类文件生成WSDL文件，Java类文件可以是接口类文件，并不需要实现细节。 </p>
<p>此外Axis还提供了SoapMonitorApplet和TCPMon工具，可用于监测Web服务。 </p>
<p><a name=N10101><span class=smalltitle><strong><font face=Arial>2.7 如何生成Web服务的服务端和客户端代码</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.7.1 生成或取得WSDL文件</p>
<p>Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成，例如下面的接口文件SoftwarePrice.java。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>package samples.userguide.example6;
            /**
            * Interface describing a web service to set and get software prices.
            **/
            public interface SoftwarePrice {
            public void setWidgetPrice(String softWareName, String price);
            public String getWidgetPrice(String softWareName);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>编译SoftwarePrice.java。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>javac SoftwarePrice.java
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>将SoftwarePrice.class复制到正确的package路径下。 </p>
<p>执行下面的命令: </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl  -l"http://test.com:80/services/SoftwarePrice" -n "urn:SoftwarePrice"
            -p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.SoftwarePrice
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>各参数的含义如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>-o：指定输出的WSDL文件的文件名。
            <br>
            -l：指定服务的位置。
            <br>
            -n：WSDL文件的目标名字空间。
            <br>
            -p：指定从package到名字空间的映射，这里可以有多个映射。
            <br>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>最后面的类文件包含了Web服务的接口。 </p>
<p>该命令执行后，将生成sp.wsdl文件。 </p>
<p>如果按CLASSPATH的设置找不到指定的类文件，Axis将报告异常，如下所示。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
            at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
            at java.security.AccessController.doPrivileged(Native Method)
            &#8230;&#8230;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果出现上面的问题，请检查是否已将有关类文件复制到正确的位置或CLASSPATH设置是否正确。 </p>
<p>生成WSDL文件以后，就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了。 </p>
<p>2.7.1.1 注意事项 </p>
<p>WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者，开发者只要按照既定的WSDL文件生成客户端或服务端代码就可以了。 </p>
<p>2.7.2 生成客户端或服务端代码 </p>
<p>WSDL2Java工具用于从WSDL文件生成客户端存根（stub）代码，服务端框架（skeleton）代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码，因此该工具极大地减轻了开发人员的编码负担。WSDL2Java的使用举例如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true MyService.wsdl
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>执行上述命令后将生成下列文件。 </p>
<p>
<table cellSpacing=0 cellPadding=5 width="90%" border=1>
    <tbody>
        <tr>
            <td width="20%">No.</td>
            <td width="40%">文件</td>
            <td width="40%">用途</td>
        </tr>
        <tr>
            <td>1.</td>
            <td>deploy.wsdd</td>
            <td>MyService服务的部署描述文件</td>
        </tr>
        <tr>
            <td>2.</td>
            <td>MyService.java</td>
            <td>MyService服务的接口文件</td>
        </tr>
        <tr>
            <td>3.</td>
            <td>MyServiceService.java</td>
            <td>获得MyService服务的接口文件</td>
        </tr>
        <tr>
            <td>4.</td>
            <td>MyServiceServiceLocator.java</td>
            <td>实现MyServiceService接口</td>
        </tr>
        <tr>
            <td>5.</td>
            <td>MyServiceSoapBindingImpl.java</td>
            <td>实现MyService接口，应向其中补充业务逻辑</td>
        </tr>
        <tr>
            <td>6.</td>
            <td>MyServiceSoapBindingSkeleton.java</td>
            <td>MyService服务的服务端框架代码,实现MyService, org.apache.axis.wsdl.Skeleton接口</td>
        </tr>
        <tr>
            <td>7.</td>
            <td>MyServiceSoapBindingStub.java</td>
            <td>MyService服务的客户端存根代码,实现MyService接口</td>
        </tr>
        <tr>
            <td>8.</td>
            <td>undeploy.wsdd</td>
            <td>注销MyService服务的部署描述文件</td>
        </tr>
    </tbody>
</table>
</p>
<p>2.7.3 编写Web服务客户端代码</p>
<p>Web服务的客户端程序完成对Web服务的调用，其程序结构如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空间;
            public class TestClient {
            public static void main (String[] args) throws Exception
            {
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = new  SPInterfaceForVNetLocator();//获得一个locator对象
            locator.setMaintainSession(true);
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = locator.getSPInterfaceForVNetSoap();//获得服务对象
            com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
            //初始化Web服务中定义的数据类型
            try {
            feedbackRes =  service.generalLedgerFeedback();//调用Web服务的方法并取得返回值
            System.out.println("FeedbackResult :");
            if(feedbackRes != null)
            {
            System.out.println("SPID: " +feedbackRes.getSPID());
            System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
            System.out.println("result: " +feedbackRes.getResult());
            }else
            {
            System.out.println("feedbackRes is null!");
            }
            } catch (java.rmi.RemoteException re) {
            //           throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re );
            re.printStackTrace();
            }
            }//End of main()
            }//End of TestClient class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>测试客户端程序是非常简单的，将客户端程序编译后，执行"java TestClient"即可。</p>
<p><a name=N101DF><span class=smalltitle><strong><font face=Arial>2.8 如何编写服务端代码</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>向MyServiceSoapBindingImpl.java添加相关的业务逻辑代码后，将WSDL2Java生成的源程序编译，打包成jar文件，复制到/usr/local/apache/htdocs/WEB-INF/lib/目录下。 </p>
<p><a name=N101EA><span class=smalltitle><strong><font face=Arial>2.9 如何发布Web服务</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>有了deploy.wsdd文件并准备好类文件后，就可以发布MyService服务了。Axis在安装后自动发布了AdminService，利用它可以发布新的Web服务。方法如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            上面的命令执行后，有如下提示。
            Processing file deploy.wsdd
            &lt;Admin&gt;Done processing&lt;/Admin&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101F9><span class=smalltitle><strong><font face=Arial>2.10 执行WSDL2Java时报告" 类型被引用但未定义"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.10.1 问题描述</p>
<p>执行WSDL2Java时报告下面的异常：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java.io.IOException: Type {http://schemas.xmlsoap.org/wsdl/} ArrayOfFailedRecord is referenced but not defined.
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.10.2 原因分析</p>
<p>出现上述情况可能的原因有：</p>
<p>类型未定义就被引用。</p>
<p>使用了错误的名字空间。 </p>
<p>WSDL文件中存在输入错误。 </p>
<p>2.10.3 解决方法</p>
<p>经过仔细检查发现wsdl文件中的</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;s:element minOccurs="0" maxOccurs="1" name="FailedRecords" type="s0:ArrayOfFailedRecord" /&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>的type=" s0:ArrayOfFailedRecord"中的s0:前面有一个空格，将空格删除后问题解决了。</p>
<p>2.10.4 小结</p>
<p>WSDL文件中出现的编辑错误有可能导致执行WSDL2Java时出现"类型被引用但未定义"错误。</p>
<p><a name=N1022D><span class=smalltitle><strong><font face=Arial>2.11 server-config.wsdd的作用是什么</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>server-config.wsdd记录了axis已发布的Web服务的描述信息。</p>
<p>2.12 发布Web服务时报告"Exception:: (404)Not Found"</p>
<p>2.12.1 问题描述</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>执行java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd命令发布WEB服务时报告如下内容。
            Processing file deploy.wsdd
            Exception:: (404)Not Found
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>Apache的access_log显示如下。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>127.0.0.1 - - [17/Sep/2003:15:56:33 +0800] "POST /services/AdminService HTTP/1.0" 404 293
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.12.2 原因分析</p>
<p>出现这个问题的比较简单的原因可能是端口不对，或URL路径不对(例如路径中多写了目录)，Axis的SoapMonitor服务按指定的端口或URL找不到AdminService，需要检查正确的端口号和URL路径。 </p>
<p>比较深层次的原因就复杂得多了。</p>
<p>本文作者遇到的是下面的情况。 </p>
<p>AdminService是一个已发布的WEB服务。 </p>
<p>AdminClient使用soap协议同AdminService通信，需要按指定的端口和URL定位AdminService，而原来使用的resin.conf中，有两个web-app配置项，配置A的摘要如下所示。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;host id=' '&gt;
            &lt;app-dir&gt;/usr/local/apache/htdocs/&lt;/app-dir&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>配置B的摘要如下所示。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;host id='test.com'&gt;
            &lt;app-dir&gt;/usr/local/apache/htdocs/esales/&lt;/app-dir&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>Axis的有关配置在配置B中。</p>
<p>Httpd.conf中的DocumentRoot是/usr/local/apache/htdocs/。</p>
<p>使用java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd发布WEB服务时，需要按http协议解析url: //localhost:80/services/AdminService。由于htdocs/目录下并没有services/目录(services是Axis在resin.conf中的servlet-mapping)，因此应用服务器按resin.conf中的配置去定位AdminService ，因为url的主机名为localhost，因此resin不会到&lt;host id='test.com'&gt;(配置B)中去定位url，而是到配置A中去定位，在配置A中并没有Axis的配置，找不到与AdminService相关的url，因此报告了前面描述的异常情况。 </p>
<p>2.12.3 解决方法</p>
<p>知道了原因后，按如下方法就可以解决了。</p>
<p>将配置B中全部关于Axis的配置移到配置A中，注意相应地要改变/etc/profile中的CLASSPATH变量的值。 </p>
<p>保存resin.conf后，重新登录服务器(使新的CLASSPATH生效)，重新启动resin。再次发布WEB服务。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>屏幕显示如下。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Processing file deploy.wsdd
            &lt;Admin&gt;Done processing&lt;/Admin&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>WEB服务终于发布成功了。 </p>
<p>在发布成功的情况下apache的access_log中会看到如下的log： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>tail -f access_log|grep vice
            127.0.0.1 - - [17/Sep/2003:16:05:00 +0800] "POST /services/AdminService HTTP/1.0" 200 296 "-" "Axis/1.1"
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.12.4 小结</p>
<p>本小节描述的问题可能是读者遇到的出现最多的异常，但原因并不是唯一的。遇到该问题时，建议读者冷静分析出现问题的可能原因，多实验几种解决方法，最终一定可以成功！ </p>
<p><a name=N10296><span class=smalltitle><strong><font face=Arial>2.13 如何监测SOAP请求和响应流</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.13.1 引言 </p>
<p>发布了Web服务以后，如何观察请求和响应数据呢？记录运行日志是一种传统且有效的方法，但对于调试程序来讲还不够方便和直观。值得欣慰的是，Axis为我们提供了在客户端观察SOAP请求和响应流数据的工具SoapMonitor，经过适当配置后，可以实时地观察到Web服务的SOAP请求和响应数据。SoapMonitor是一个Java Applet程序，通过浏览器下载到客户端运行。下面就介绍SoapMonitor的配置和使用方法。 </p>
<p>2.13.2 准备SOAPMonitor 小应用程序</p>
<p>在Axis 1.1中，没有为我们编译SOAPMonitor.java程序，但我们可以在axis-1_1/webapps/axis/目录下找到名字为SOAPMonitorApplet.java的源程序文件，自己进行编译。该程序编译后，会生成如下的类文件： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>SOAPMonitorApplet.class
            SOAPMonitorApplet$ServiceFilterPanel.class
            SOAPMonitorApplet$SOAPMonitorData.class
            SOAPMonitorApplet$SOAPMonitorFilter.class
            SOAPMonitorApplet$SOAPMonitorPage.class
            SOAPMonitorApplet$SOAPMonitorTableModel.class
            SOAPMonitorApplet$SOAPMonitorTextArea.class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>读者需要把上述类文件复制到自己的Web应用程序目录下，本例中是/usr/local/apache/htdocs/目录。 </p>
<p>在浏览器地址样中输入SOAPMonitor的地址，例如 <a href="http://test.com/SOAPMonitor"><u><font color=#5c81a7>http://test.com/SOAPMonitor</font></u></a> ，浏览器会提示用户正在下载Applet程序，下载完毕后，读者可以在浏览器窗口中看到如图4-1所示的用户界面。如果上述类文件的位置不正确，浏览器会报告"找不到类"的错误。此时应检查是否已将上述类文件复制到正确的目录下。 </p>
<br><img alt="" src="http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/image01.gif"> <br>
<p><strong>图 2-1 SOAPMonitor的界面</strong> </p>
<p>2.13.3 发布SOAPMonitor服务</p>
<p>图2-1所示的SOAPMonitor界面出现后，并不意味着就可以观察到Web服务的SOAP请求流与响应流了，首先需要发布SOAPMonitorService。该Web服务是由Axis提供的，但需要由用户自己进行发布，方法如下。 </p>
<p>获得SOAPMonitor服务的WSDD文件deploy.wsdd，内容如下(也可到 <a href="http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html"><u><font color=#5c81a7>http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html</font></u></a> 复制该文件)： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
            &lt;handler name="soapmonitor"
            type="java:org.apache.axis.handlers.SOAPMonitorHandler"&gt;
            &lt;parameter name="wsdlURL"
            value="/axis/SOAPMonitorService-impl.wsdl"/&gt;
            &lt;parameter name="namespace"
            value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/&gt;
            &lt;parameter name="serviceName" value="SOAPMonitorService"/&gt;
            &lt;parameter name="portName" value="Demo"/&gt;
            &lt;/handler&gt;
            &lt;service name="SOAPMonitorService" provider="java:RPC"&gt;
            &lt;parameter name="allowedMethods" value="publishMessage"/&gt;
            &lt;parameter name="className"
            value="org.apache.axis.monitor.SOAPMonitorService"/&gt;
            &lt;parameter name="scope" value="Application"/&gt;
            &lt;/service&gt;
            &lt;/deployment&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>发布SOAPMonitor服务：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.13.4 修改deploy.wsdd</p>
<p>发布SOAPMonitor服务后，还要对被监测的Web服务进行配置。方法是先注销该Web服务，然后修改该服务对应的WSDD文件，在其中增加请求流和响应流的配置，否则是观测不到SOAP请求和响应流的。 </p>
<p>注销Web服务的方法如下。 </p>
<p>进入该Web服务的undeploy.wsdd文件所在的目录，执行 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改WSDD文件的方法如下。 </p>
<p>以Axis提供的MyService为例，对MyService的WSDD文件做如下修改。 </p>
<p>修改前: </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>...
            &lt;service name="MyService" provider="java:RPC"&gt;
            &lt;parameter name="className" value="samples.userguide.example3.MyService"/&gt;
            &lt;parameter name="allowedMethods" value="*"/&gt;
            ...
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改后: (有下划线的行是新加入的内容)</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>...
            &lt;service name="MyService" provider="java:RPC"&gt;
            &lt;requestFlow&gt;
            &lt;handler type="soapmonitor"/&gt;
            &lt;/requestFlow&gt;
            &lt;responseFlow&gt;
            &lt;handler type="soapmonitor"/&gt;
            &lt;/responseFlow&gt;
            &lt;parameter name="className" value="samples.userguide.example3.MyService"/&gt;
            &lt;parameter name="allowedMethods" value="*"/&gt;
            ...
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改WSDD文件后，重新发布MyService服务：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.13.5 启动SOAPMonitor小应用程序</p>
<p>按2.13.2节介绍的方法启动SOAPMonitor小应用程序。</p>
<p>使用客户端程序测试MyService服务： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>#  java samples.userguide.example3.Client -lhttp://vnet.sohu.com/services/MyService "test"
            结果为：You typed : test
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>注意，一定要先启动SOAPMonitor小应用程序，后调用Web服务才能观察到SOAP请求和响应流。</p>
<p>2.13.6 观察SOAP请求和响应流</p>
<p>这时在SoapMonitorApplet的窗口中可以观察到SOAP和请求和响应消息，如图2-2所示。 </p>
<br><img alt="" src="http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/image02.gif"> <br>
<p><strong>图2-2 MyService的Soap请求和响应流</strong> </p>
<p><a name=N1033B><span class=smalltitle><strong><font face=Arial>2.14 使用客户端程序测试Web服务时报告"Exception:: (404)Not Found"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.14.1 问题描述</p>
<p>WEB服务接口编写完成并发布后，客户端测试程序收不到WEB服务的返回结果，Apache或Resin的log中也看不到访问记录。但测试程序返回结果为0(成功)，在没有部署该WEB服务的情况下，也是这个结果，因此怀疑调用的是WSDL文件的提供者自己测试用的WEB服务接口，可能与另一方提供的WSDL文件有关。 </p>
<p>2.14.2 原因分析</p>
<p>合作伙伴调用WEB服务就能够成功，从WEB服务主机自己的客户端调用就接收不到数据，估计与合作伙伴提供的WSDL文件有关，该WSDL文件影响了WSDL2Java生成的客户端stub代码。检查stub代码，发现其soapAction都指向了合作伙伴的测试地址。 </p>
<p>2.14.3 解决方法</p>
<p>修改stub代码中的soapAction，改为sp(Service Provider)自己的WEB服务URL。重新编译程序并发布Web服务，问题解决。 </p>
<p>_call.setSOAPActionURI("sp自己的Web服务地址"); </p>
<p>2.14.4 小结</p>
<p>本小节描述的问题出现于Web服务提供方按合作伙伴统一提供的WSDL文件生成客户端代码的情况。遇到这类问题，读者可直接检查WSDL2Java自动生成的代码的有关部分。 </p>
<p>在WSDL文件中可以看到与下列内容相似的设置。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;wsdl:service name="SPInterfaceForVNet"&gt;
            &lt;wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap"&gt;
            &lt;wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" /&gt;
            &lt;/wsdl:port&gt;
            &lt;/wsdl:service&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中 <a href="http://test.com/services/SPInterfaceSoap"><u><font color=#5c81a7>http://test.com/services/SPInterfaceSoap</font></u></a>即为已发布的WEB服务的URL，供客户端调用。 </p>
<p><a name=N1036C><span class=smalltitle><strong><font face=Arial>2.15 如何列出已发布的Web服务</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>使用下面的命令： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/  list
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>实际上该命令的输出就是server-config.wsdd文件的内容。 </p>
<p><a name=N1037E><span class=smalltitle><strong><font face=Arial>2.16 发布Web服务时报告"调用目标异常"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.16.1 问题描述 </p>
<p>在部署WEB服务时报告：java.lang.reflect.InvocationTargetException异常。 </p>
<p>2.16.2 原因分析 </p>
<p>在WSDL文件中自定义的名字空间与Axis的services名字空间冲突。 </p>
<p>2.16.3 解决方法 </p>
<p>修改WSDL文件，将services改为别的名字。 </p>
<p><a name=N10398><span class=smalltitle><strong><font face=Arial>2.17 WSDL文件中的targetNamespace的作用是什么</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>TargetNamespace指明目标名字空间，用于验证xml文档。 </p>
<p>在WSDL文件中，&lt;definitions&gt;中的targetNamespace与&lt;types&gt;中的targetNamespace应保持一致。 </p>
<p><a name=N103A6><span class=smalltitle><strong><font face=Arial>2.18 Web服务部署成功但检测不到</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.19 客户端程序找不到可用的Web服务</p>
<p>2.19.1 问题描述</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>执行
            java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>时显示&lt;Admin&gt;Done processing&lt;/Admin&gt;，却检查不到新的服务，在WEB-INF/目录下的server-config.wsdd文件中也看不到相应的配置项。 </p>
<p>2.19.2 原因分析</p>
<p>新的WEB服务的类文件没有重新编译并复制到正确的位置。 </p>
<p>2.19.3 解决方法</p>
<p>WEB服务的类文件可以打包为jar文件。在CLASSPATH环境变量中正确设置jar文件的路径。例如：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jar cvf  SPInterfaceSoap.jar com/zx/service/v1_0/*.class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>将SPInterfaceSoap.jar复制到WEB-INF/lib/目录下，重新发布WEB服务。 </p>
<p><a name=N103CE><span class=smalltitle><strong><font face=Arial>2.20 如何排除原因不明的错误</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>有时，在对WEB服务执行客户端测试时会出现慕名其妙的错误。为保证环境是正确的，可以按下面的步骤排除原因不明的错误。 </p>
<p>1. Undeploy被测试的服务 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2. 重新启动resin: /usr/local/resin/bin/httpd.sh restart(如果是其它的应用服务器，请按相应的方法重新启动) </p>
<p>3. 重新发布WEB服务 </p>
<p>4. 进行测试 </p>
<br>
<p><a name=3><span class=atitle>3 小结</span></a></p>
<p><br>目前有很多可以使用的应用服务器和Web服务平台软件，本文仅以Apache Axis和Resin为例介绍了在部署Web服务的过程中可能遇到的问题及其解决方法，其中并未讨论Web服务的安全性问题。对于如何高效地开发和部署Web服务以及如何确保Web服务的安全性，还希望对此感兴趣的读者共同参与讨论，对于文中存在的错误和不足之处也希望读者朋友们能够不吝批评指正。 </p>
<br>
<img src ="http://www.blogjava.net/boluobn/aggbug/137337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-16 17:04 <a href="http://www.blogjava.net/boluobn/articles/137337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>生成客户端client stub文件</title><link>http://www.blogjava.net/boluobn/articles/137288.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 16 Aug 2007 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/137288.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/137288.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/137288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/137288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/137288.html</trackback:ping><description><![CDATA[今天是感恩节，差点又要在公司加班了。好在Web Service程序并不是特别难搞，下午终于在eclipse下调通过了，正确产生了服务器端和客户端的Java代码，apache的东西的确很不错。
<p>　　说道Web Service的程序开发，<a href="http://www.williamlong.info/archives/441.html" target=_blank><u><font color=#0000ff>八个月前</font></u></a>我加班调试<a href="http://www.williamlong.info/archives/428.html" target=_blank><u><font color=#0000ff>公司和中国电信的商务领航系统的接口</font></u></a>的时候，用的就是Web Service，Web Service有很多优点，使用Web Service可以在不同编程语言间实现数据交换，而我那时对Web Service也不熟，就由同事帮我生成了一大堆Web Service的框架代码，我则只单独开发业务代码。</p>
<p>　　这次的另外一个项目也要用Web Service了，不过人手也少了，没有人帮做Web Service了，只好自己动手。</p>
<p>　　好在开发前，有个同事先给我们不熟悉Web Service的程序员进行了一些培训，我才知道原来以前的Web Service都是可以自动生成代码的，而且也不难，试了一个下午客户端和服务器端的Web Service代码就都调试通过了，真不错。</p>
<p>　　为了更多喜爱开发的程序员也能迅速了解Web Service的开发，我这里整理了一些通过Axis开发Web Service的一些要点，希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。</p>
<p>　　<strong>一、Axis环境的安装</strong></p>
<p>　　1、安装环境 J2SE SDK 1.4，Tomcat 5.0，eclipse 3.2。</p>
<p>　　2、到 <a href="http://xml.apache.org/" target=_blank><u><font color=#0000ff>http://xml.apache.org</font></u></a>&nbsp;网站下载Axis安装包。</p>
<p>　　3、将Axis相关包文件放在WEB-INF\lib目录下。</p>
<p>　　4、Axis可选的包：activation.jar； mail.jar； xmlsec-1.4.Beta1.jar拷贝到WEB-INF目录下，生成客户端时候需要使用。</p>
<p>　　Axis支持三种web service的部署和开发，分别为：</p>
<p>　　1、Dynamic Invocation Interface （DII）</p>
<p>　　2、Dynamic Proxy方式</p>
<p>　　3、Stubs方式</p>
<p>　　前两种方式我就不介绍了，同事告诉我他们自己都不使用前两种方式，他们建议我们使用Stubs方式，因此我就主要就介绍一下第三种方式。注意，我自己的Java源代码是放在D：\workspace\test\目录下，Axis相关包文件放在D：\workspace\test\WEB-INF目录下。</p>
<p>　　<strong>二、编写wsdd发布web服务，编写stub client访问web服务</strong></p>
<p>　　1、编写服务端程序server，SayHello.java，编译server.SayHello.java</p>
<p>package server;<br>public class SayHello<br>{<br>&nbsp;&nbsp;&nbsp; public String getName(String name)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "hello "+name;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>　　2、编写wsdd文件</p>
<p>　　deploy.wsdd文件内容如下：</p>
<p>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<br>&nbsp;&lt;service name="SayHello" provider="java:RPC"&gt;<br>&nbsp; &lt;parameter name="className" value="server.SayHello.getName"/&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&lt;/service&gt;<br>&lt;/deployment&gt;</p>
<p>　　3、发布服务：</p>
<p>　　编辑一个deploy.bat，Axis_Lib为axis.jar路径。内容如下：</p>
<p>set Axis_Lib=D:\workspace\test\WEB-INF\lib<br>set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%<br>set Axis_Servlet=http://localhost:8080/test/servlet/AxisServlet<br>%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd</p>
<p>　　执行这个批处理文件，这时候，如果提示成功的话，访问<a href="http://localhost:8080/test/services"><u><font color=#0000ff>http://localhost</font><font color=#000000>:</font><font color=#0000ff>8080/test/services</font></u></a> 就会显示服务列表。</p>
<p>　　4、生成客户端client stub文件</p>
<p>　　在浏览器上访问服务器端的服务，可以下载到WSDL文件，通过Axis的相关工具，可以自动从WSDL文件中生成Web Service的客户端代码。</p>
<p>　　编写一个WSDL2Java.bat文件，其内容如下：</p>
<p>set Axis_Lib=D:\workspace\test\WEB-INF\lib<br>set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%<br>set Output_Path=D:\workspace\test\src<br>set Package=server.SayHello<br>%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% SayHello.wsdl</p>
<p>　　执行这个批处理文件就可以生成client stub.</p>
<p>　　生成的stub client文件列表为：SayHello.java，SayHelloService.java，SayHelloServiceLocator.java，SayHelloSoapBindingStub.java .</p>
<p>　　5、编写客户端程序，编译并执行</p>
<p>　　下面是一段junit测试客户端代码。</p>
<p>import java.net.URL;<br>import junit.framework.Test;<br>import junit.framework.TestCase;<br>import junit.framework.TestSuite;</p>
<p>public class TestWSClient extends TestCase {</p>
<p>&nbsp;&nbsp;&nbsp; public TestWSClient(String string) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(string);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void SayHelloClient() throws Exception {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SayHelloService service = new SayHelloServiceLocator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SayHello_PortType client = service.getSayHello() ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String retValue = client.getName("clientname");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(retValue);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static Test suite() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestSuite suite = new TestSuite();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suite.addTest(new TestWSClient("SayHelloClient"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return suite;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>　　至此，整个服务器端和客户端的Web Service框架代码就完成了，剩下的就是在里面加入你的业务代码了，怎么样，Web Service并不难开发吧。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/137288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-16 15:40 <a href="http://www.blogjava.net/boluobn/articles/137288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS学习笔记（一）</title><link>http://www.blogjava.net/boluobn/articles/137207.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 16 Aug 2007 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/137207.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/137207.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/137207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/137207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/137207.html</trackback:ping><description><![CDATA[<p>一、软件环境</p>
<p>&nbsp;1、axis-1_2&nbsp; (从apache网站下载最新axis-bin-1_2.zip解压即可）</p>
<p>&nbsp;2、Tomcat5.0 </p>
<p>&nbsp;3、JDK5.0</p>
<p>二、相关配置</p>
<p>&nbsp;1、在你的%TOMCAT_HOME%\common\lib下需要加入三个包 activation.jar、mail.jar、tools.jar</p>
<p>&nbsp;2、环境变量设置</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; AXIS_HOME 即axis-bin-1_2.zip解压的目录（我的是在F:\soap\axis-1_2）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; AXIS_LIB&nbsp;&nbsp;&nbsp;&nbsp;即 %AXIS_HOME%\lib</p>
<p>&nbsp;&nbsp;&nbsp; AXISCLASSPATH 即 %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;也就是把%AXIS_LIB%下所用JAR文件都导入</p>
<p>三、实验一下</p>
<p>&nbsp;&nbsp; 在%AXIS_HOME%\webapps下找到axis文件夹，将其整个拷贝到%TOMCAT_HOME%\webapps下，启动</p>
<p>&nbsp; Tomcat,打开浏览器访问<a href="http://localhost:8080/axis/"><font color=#000080>http://localhost:8080/axis/</font></a>，出现以下页面说明你配置成功了。很简单吧：）</p>
<p>&#160;</p>
<p>四、发布我们的第一个程序</p>
<p>&nbsp;&nbsp; 第一个程序简单的返回HELLO WORLD！</p>
<p>&nbsp; HelloWorld.java</p>
<p>public class HelloWorld {<br>&nbsp; public String sayHello()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return "HELLO WORLD!"; <br>&nbsp; }&nbsp;<br>}</p>
<p>我们的第一种发布方式：</p>
<p>将HelloWorld.java拷贝到%TOMCAT_HOME%\webapps\axis下，然后将其改名为HelloWorld.jws,这样AXIS就自然将其发布了。现在写个客户端程序访问一下：</p>
<p>TestClient.java</p>
<p>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;</p>
<p>import javax.xml.rpc.ParameterMode;</p>
<p>public class TestClient<br>{<br>&nbsp;&nbsp; public static void main(String [] args) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpoint = "<a href="http://localhost/"><font color=#000080>http://localhost/</font></a>:" +"8080"+&nbsp;"/axis/HelloWorld.jws";//指明服务所在位置</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service&nbsp; service = new Service();&nbsp; //创建一个Service实例，注意是必须的！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp; = (Call) service.createCall();//创建Call实例，也是必须的！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress( new java.net.URL(endpoint) );//为Call设置服务的位置</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName( "sayHello" );//注意方法名与HelloWorld.java中一样！！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String res = (String) call.invoke( new Object[] {} );//返回String，没有传入参数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( res );<br>&nbsp;&nbsp; }<br>}</p>
<p>我的测试是在jbuilder2005中，注意项目中要导入其自带的AXIS包（当然应该把其中JAR文件替换一下），可以看到程序返回了 "HELLO WORLD!"</p>
<p>可以看到在AXIS里发布服务其实是一件很容易的事，这是因为这个服务很简单的原因：）下面我们介绍第二种发布方式，这是常用的。</p>
<p>我们的第二种发布方式：</p>
<p>1、将HelloWorld.java编译成HelloWorld.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下</p>
<p>2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件，即SOAP服务发布描述文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; deploy.wsdd</p>
<p>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><font color=#000080>http://xml.apache.org/axis/wsdd/</font></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><font color=#000080>http://xml.apache.org/axis/wsdd/providers/java</font></a>"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;service name="HelloWorld" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="HelloWorld"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="sayHello"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&lt;/deployment&gt;</p>
<p>在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF，命令：</p>
<p>java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd</p>
<p>你会发现目录下多了一个server-config.wsdd文件，这就是AXIS的配置文件，以后所有的服务发布描述都会在里面找到。（当然，你可以直接修改它，不用再写deploy.wsdd）然后打开浏览器<a href="http://localhost:8080/axis/servlet/AxisServlet"><font color=#000080>http://localhost:8080/axis/servlet/AxisServlet</font></a>，你就会看到你的服务已发布</p>
<p>同样用客户端程序访问一下：（注意和上边的差别！！）</p>
<p>HelloClient.java</p>
<p>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;</p>
<p>public class HelloClient<br>{<br>&nbsp;&nbsp; public static void main(String [] args) throws Exception {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpoint = "<a href="http://localhost/"><font color=#000080>http://localhost/</font></a>:" +"8080"+ "/axis/services/HelloWorld";//注意！差别仅仅在这里！！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service&nbsp; service = new Service();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp; = (Call) service.createCall();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress( new java.net.URL(endpoint) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName("sayHello"&nbsp; );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String res = (String) call.invoke( new Object[] {} );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( res );<br>&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/137207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-16 13:24 <a href="http://www.blogjava.net/boluobn/articles/137207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS-是用AdminClient部属时要注意的</title><link>http://www.blogjava.net/boluobn/articles/137206.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 16 Aug 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/137206.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/137206.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/137206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/137206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/137206.html</trackback:ping><description><![CDATA[<p>如果使用java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient&nbsp; deploy.wsdd</p>
<p>将自动部署到axis web应用的server-config.wsdd</p>
<p>要想部署到自己的web 应用下，比如boyoi，要使用以下的方式</p>
<p>java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient <br>&nbsp;&nbsp;&nbsp;&nbsp; -lhttp://localhost:8080/boyoi/services/AdminService deploy.wsdd<br></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/137206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-16 13:23 <a href="http://www.blogjava.net/boluobn/articles/137206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> AXIS全攻略（一）</title><link>http://www.blogjava.net/boluobn/articles/137203.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 16 Aug 2007 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/137203.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/137203.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/137203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/137203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/137203.html</trackback:ping><description><![CDATA[<p>一、Axis简介</p>
<p><br>1. 什么是SOAP</p>
<p>SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出，随着不断地完善和改进，SOAP很快被业界广泛应用，目前完全发布版本是1.1。在其发展过程中，W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时，SOAP1.2草案已经发布，1.2对1.1中相对混乱的部分做了改进。<br>SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。</p>
<p><br>2. 什么是Axis</p>
<p>Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C++的版本正在开发之中。Axis v1.1软件包可以从<a href="http://ws.apache.org/axis/dist/1_1/">http://ws.apache.org/axis/dist/1_1/</a>下载得到。<br>但是Axis不仅仅是一个SOAP引擎，它还包括：<br>&nbsp;&nbsp;&nbsp; 一个独立运行的SOAP服务器<br>&nbsp;&nbsp;&nbsp; 一个servlet引擎的插件，这个servlet引擎可以是Tomcat<br>&nbsp;&nbsp;&nbsp; 对WSDL的扩展支持<br>&nbsp;&nbsp;&nbsp; 一个将WSDL的描述生成JAVA类的工具<br>&nbsp;&nbsp;&nbsp; 一些示例代码<br>&nbsp;&nbsp;&nbsp; 还有一个监控TCP/IP包的工具<br>&nbsp;<br>二、Axis的安装</p>
<p>应用Axis开发Web Services，你需要安装如下软件：<br>1.JDK1.4.2<br>2.一个支持Servlet的服务器引擎，比如广为人知的Tomcat。</p>
<p>当安装好Tomcat之后，只需将下载的Axis软件包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下即可。</p>
<p>三、Axis的配置</p>
<p>Axis基于Java开发，可以部署于多种操作系统，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p>
<p>CATALINA_HOME<br>C:\Tomcat_4_1</p>
<p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）</p>
<p>AXIS_HOME<br>%CATALINA_HOME%\webapps\axis</p>
<p>AXIS_LIB<br>%AXIS_HOME%\lib</p>
<p>AXISCLASSPATH<br>%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</p>
<p>CLASSPATH 中加入：<br>%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</p>
<p>四、Axis的测试</p>
<p>安装配置完毕后，应测试一下是否Axis可以正确运行了。</p>
<p>　　启动Tomcat服务器，在浏览器中访问<a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jsp</a>，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功。现在可以开始开发你的Web Services应用了。</p>
<p>五、服务的发布<br>Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。</p>
<p>1. 使用即时发布 Java Web Service(JWS)</p>
<p>　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使服务器重启了也不必对其做任何处理，使用非常简单快捷。</p>
<p>　　使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下即可。<br>&nbsp;&nbsp;&nbsp; 在此给出一个从英里到公里的长度单位转换的服务，其源码如下：</p>
<p>文件Distance.jws</p>
<p>public class Distance<br>{<br>&nbsp;&nbsp;&nbsp; public double convertMile2Kilometre( double mile )<br>&nbsp;&nbsp;&nbsp; {&nbsp;<br>&nbsp;return mile * 1.609;&nbsp;&nbsp;//实现英里到公里的距离转换<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>将其放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录，通过访问<a href="http://localhost:8080/axis/Distance.jws?wsdl">http://localhost:8080/axis/Distance.jws?wsdl</a>可以看到这个服务的WSDL描述文件，这说明Distance服务被成功发布了。描述的WDSL代码如下：<br>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br>- &lt;wsdl:definitions targetNamespace="<a href="http://192.168.0.26:8080/axis/Distance.jws">http://192.168.0.26:8080/axis/Distance.jws</a>" xmlns="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>"&nbsp; <br>&nbsp;&nbsp; xmlns:apachesoap="<a href="http://xml.apache.org/xml-soap">http://xml.apache.org/xml-soap</a>" xmlns:impl="<a href="http://192.168.0.26:8080/axis/Distance.jws">http://192.168.0.26:8080/axis/Distance.jws</a>" xmlns:intf="<a href="http://192.168.0.26:8080/axis/Distance.jws">http://192.168.0.26:8080/axis/Distance.jws</a>" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>" xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br>- &lt;wsdl:message name="convertMile2KilometreRequest"&gt;<br>&nbsp; &lt;wsdl:part name="mile" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:message name="convertMile2KilometreResponse"&gt;<br>&nbsp; &lt;wsdl:part name="convertMile2KilometreReturn" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:portType name="Distance"&gt;<br>- &lt;wsdl:operation name="convertMile2Kilometre" parameterOrder="mile"&gt;<br>&nbsp; &lt;wsdl:input message="impl:convertMile2KilometreRequest" name="convertMile2KilometreRequest" /&gt; <br>&nbsp; &lt;wsdl:output message="impl:convertMile2KilometreResponse" name="convertMile2KilometreResponse" /&gt; <br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:portType&gt;<br>- &lt;wsdl:binding name="DistanceSoapBinding" type="impl:Distance"&gt;<br>&nbsp; &lt;wsdlsoap:binding style="rpc" transport="<a href="http://schemas.xmlsoap.org/soap/http">http://schemas.xmlsoap.org/soap/http</a>" /&gt; <br>- &lt;wsdl:operation name="convertMile2Kilometre"&gt;<br>&nbsp; &lt;wsdlsoap:operation soapAction="" /&gt; <br>- &lt;wsdl:input name="convertMile2KilometreRequest"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" namespace="<a href="http://defaultnamespace/">http://defaultnamespace/</a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:input&gt;<br>- &lt;wsdl:output name="convertMile2KilometreResponse"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" namespace="<a href="http://192.168.0.26:8080/axis/Distance.jws">http://192.168.0.26:8080/axis/Distance.jws</a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:output&gt;<br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:binding&gt;<br>- &lt;wsdl:service name="DistanceService"&gt;<br>- &lt;wsdl:port binding="impl:DistanceSoapBinding" name="Distance"&gt;<br>&nbsp; &lt;wsdlsoap:address location="<a href="http://192.168.0.26:8080/axis/Distance.jws">http://192.168.0.26:8080/axis/Distance.jws</a>" /&gt; <br>&nbsp; &lt;/wsdl:port&gt;<br>&nbsp; &lt;/wsdl:service&gt;<br>&nbsp; &lt;/wsdl:definitions&gt;</p>
<p>需要注意的是：JWS的web服务发布是一个很简单的Web服务发布方式，在页面中你不能使用包，而且由于代码是在运行期被编译的，所以在部署之后，你也很难找到错误所在。</p>
<p>2. 使用定制发布 Web Service Deployment Descriptor(WSDD)</p>
<p>　　即时发布是一项令人激动的技术，它使Web服务的开发变得如此简单；然而即时发布并不总是最好的选择，比如有些应用系统是第三方提供的，我们没有购买源代码，只有.class文件，但我们又希望将这个应用系统的一些功能对外发布成Web服务，使其能够在更大范围内产生作用，这个时候即时发布技术就无能为力了。此外，即时发布技术并不灵活，无法进行更多的服务配置，这使得它并不能满足一些特定系统的需求。</p>
<p>　　因此，Axis提供了另一种服务发布方式，这就是定制发布。</p>
<p>　　在此给出一个从加仑到升的容积单位转换的服务，其源码如下：</p>
<p>　　文件Capacity.java<br>&nbsp;&nbsp;&nbsp; package samples.capacity;<br>&nbsp;&nbsp;&nbsp; public class Capacity<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double convertGallon2Litre( double gallon )<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; return gallon * 4.546;//实现加仑到升的容积转换<br>&nbsp;}//convertGallon2Litre()</p>
<p>&nbsp;&nbsp;&nbsp; }/* Capacity */<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 将其编译成.class文件，放置到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，即可着手进行发布。<br>&nbsp;&nbsp;&nbsp; 定制发布不需要构建.jws文件，但必须创建服务发布描述文件deploy.wsdd（Web Service Deployment Descriptor的缩写），这个文件负责描述服务的名称、入口等信息，其内容如下：<br>&nbsp;&nbsp;&nbsp; 文件deploy.wsdd</p>
<p>&nbsp;&nbsp;&nbsp; &lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>"&gt;<br>&nbsp;&lt;service name="Capacity" provider="java:RPC"&gt;<br>&nbsp;&lt;parameter name="className" value="samples.capacity.Capacity"/&gt;<br>&nbsp;&lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/deployment&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 在这里服务的提供者是&#8220;java:RPC&#8221;，它被内建在Axis中，而且指明了一个JAVA RPC服务，做这个处理的类是org.apache.axis.providers.java.RPCProvider。<br>&nbsp;&nbsp;&nbsp; 我们是通过一个&lt;parameter&gt;标签告诉RPC服务应该调用的类，而另外一个&lt;parameter&gt;标签则告诉引擎，它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表，来指明那些方法可以被调用。</p>
<p>　　将该文件也放到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。<br>&nbsp;&nbsp; 在&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，运行：</p>
<p>&nbsp;&nbsp; java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd</p>
<p>&nbsp;&nbsp; 如果运行时说没有找到类，那么可能是类路径没有配置好，建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:</p>
<p>&nbsp;&nbsp; java org.apache.axis.client.AdminClient deploy.wsdd<br>&nbsp;&nbsp; 可以看到以下运行结果：</p>
<p>&nbsp;Processing file deploy.wsdd<br>&nbsp;&lt;Admin&gt;Doneprocessing&lt;/Admin&gt;</p>
<p>　　这表明Capacity服务定制发布完成。<br>&nbsp;<br>&nbsp;&nbsp; 你也可以调用：<br>&nbsp;java org.apache.axis.client.AdminClient undeploy.wsdd&nbsp; 来取消部署。</p>
<p>&nbsp;&nbsp; 你也可以调用：<br>&nbsp;java org.apache.axis.client.AdminClient list 来获得所有的已经部署的服务的列表。在这里你会看到services, handlers, transports等等，注意这个调用只是列出了WEB-INF\server-config.wsdd的文件内容。</p>
<p>&nbsp;&nbsp; 一定要注意：编译后的class文件要拷贝到web-inf/classes的目录中，如果该文件中有包存在的话，别忘了还要在classes目录下创建包的目录<br>&nbsp;&nbsp; 通过访问<a href="http://localhost:8080/axis/services/Capacity?wsdl">http://localhost:8080/axis/services/Capacity?wsdl</a>可以看到这个服务的WSDL描述文件，这说明Capacity服务被成功发布了。<br>&nbsp;&nbsp; 你也可以通过访问<a href="http://localhost:8080/axis/servlet/AxisServlet">http://localhost:8080/axis/servlet/AxisServlet</a>查看所有定制发布的服务。<br>&nbsp;&nbsp; WDSL如下：<br>&nbsp; &lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br>- &lt;wsdl:definitions targetNamespace="<a href="http://localhost:8080/axis/services/Capacity">http://localhost:8080/axis/services/Capacity</a>" xmlns="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>"<br>&nbsp;&nbsp;&nbsp; xmlns:apachesoap="<a href="http://xml.apache.org/xml-soap">http://xml.apache.org/xml-soap</a>" xmlns:impl="<a href="http://localhost:8080/axis/services/Capacity">http://localhost:8080/axis/services/Capacity</a>" xmlns:intf="<a href="http://localhost:8080/axis/services/Capacity">http://localhost:8080/axis/services/Capacity</a>" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>" xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br>- &lt;wsdl:message name="convertGallon2LitreResponse"&gt;<br>&nbsp; &lt;wsdl:part name="convertGallon2LitreReturn" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:message name="convertGallon2LitreRequest"&gt;<br>&nbsp; &lt;wsdl:part name="in0" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:portType name="Capacity"&gt;<br>- &lt;wsdl:operation name="convertGallon2Litre" parameterOrder="in0"&gt;<br>&nbsp; &lt;wsdl:input message="impl:convertGallon2LitreRequest" name="convertGallon2LitreRequest" /&gt; <br>&nbsp; &lt;wsdl:output message="impl:convertGallon2LitreResponse" name="convertGallon2LitreResponse" /&gt; <br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:portType&gt;<br>- &lt;wsdl:binding name="CapacitySoapBinding" type="impl:Capacity"&gt;<br>&nbsp; &lt;wsdlsoap:binding style="rpc" transport="<a href="http://schemas.xmlsoap.org/soap/http">http://schemas.xmlsoap.org/soap/http</a>" /&gt; <br>- &lt;wsdl:operation name="convertGallon2Litre"&gt;<br>&nbsp; &lt;wsdlsoap:operation soapAction="" /&gt; <br>- &lt;wsdl:input name="convertGallon2LitreRequest"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" namespace="<a href="http://capacity.samples/">http://capacity.samples/</a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:input&gt;<br>- &lt;wsdl:output name="convertGallon2LitreResponse"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" namespace="<a href="http://localhost:8080/axis/services/Capacity">http://localhost:8080/axis/services/Capacity</a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:output&gt;<br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:binding&gt;<br>- &lt;wsdl:service name="CapacityService"&gt;<br>- &lt;wsdl:port binding="impl:CapacitySoapBinding" name="Capacity"&gt;<br>&nbsp; &lt;wsdlsoap:address location="<a href="http://localhost:8080/axis/services/Capacity">http://localhost:8080/axis/services/Capacity</a>" /&gt; <br>&nbsp; &lt;/wsdl:port&gt;<br>&nbsp; &lt;/wsdl:service&gt;<br>&nbsp; &lt;/wsdl:definitions&gt;</p>
<p>&nbsp; WSDD 的高级功能：<br>&nbsp; (1) AXIS支持三种对象范围：<br>&nbsp;&nbsp;&nbsp;&nbsp; "request"范围：这是默认的情况，每一次Soap请求的时候都将创建新的对象。<br>&nbsp;&nbsp;&nbsp;&nbsp; "application"范围：将会为所有的请求生成一个单独的共享的对象。<br>&nbsp;&nbsp;&nbsp;&nbsp; "session"范围：为每一个session期的客户端请求创建一个对象。<br>&nbsp; 指定方法如下：<br>&nbsp; &lt;service name="MyService"...&gt;<br>&nbsp; &lt;parameter name="scope" value="value"/&gt;<br>&nbsp; ...<br>&nbsp; &lt;/service&gt;<br>&nbsp; (2) 更多部署内容：Handlers and Chains<br>&nbsp; 让我们来深入挖掘一下Axis引擎的更强大的特性。如果我们想跟踪我们的服务被调用了多少次，那么我们只需要包含一个简单的handler，它存放在samples/log目录下。要使用这个handler，你就首先应该部署这个handler，然后使用在部署服务时给它指定的名字。下面是一个wsdd文件的例子：<br>&nbsp; &lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>"&gt;<br>&nbsp;&nbsp; &lt;!-- define the logging handler configuration --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;handler name="track" type="java:samples.userguide.example4.LogHandler"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="filename" value="MyService.log"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp; <br>&nbsp;&nbsp; &lt;!-- define the service, using the log handler we just defined --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;service name="LogTestService" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;handler type="track"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requestFlow&gt;<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="samples.userguide.example4.Service"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&nbsp; &lt;/deployment&gt;</p>
<p>&nbsp; 第一段指明了一个名为track的handler，它是samples.userguide.example4.LogHandler类的实例。另外还指定了一个参数filename，用于指定日志文件名称。<br>&nbsp; 下面的那段指明了一个RPC服务，和我们在上面的例子中看到的一样，所不同的是在service标签中的&lt;requestFlow&gt;标签，它指定了一些在调用服务前应该被调用的handler集。也就是由于我们在部署中插入了这个"track"的引用，所以我们确定每次调用服务的时候都将被记录到日志文件中去。<br>&nbsp; <br>&nbsp; (3)远程管理：<br>&nbsp; &lt;service name="AdminService" provider="java:MSG"&gt;<br>&nbsp;&lt;parameter name="className" value="org.apache.axis.util.Admin"/&gt;<br>&nbsp;&lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&lt;parameter name="enableRemoteAdmin" value="true"/&gt;<br>&nbsp; &lt;/service&gt;<br>&nbsp; WARNING: enabling remote administration may give unauthorized parties access to your machine. If you do this, please make sure to add security to your configuration!<br>&nbsp; 所以远程管理涉及到安全问题，不建议采用。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/137203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-16 13:20 <a href="http://www.blogjava.net/boluobn/articles/137203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结合Axis和Ant开发Web服务</title><link>http://www.blogjava.net/boluobn/articles/136198.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sun, 12 Aug 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/136198.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/136198.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/136198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/136198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/136198.html</trackback:ping><description><![CDATA[<p><span>本文结合一个简单示例讲解了怎样把</span><span>Axis</span><span>和</span><span>Ant</span><span>结合起来进行</span><span>Web</span><span>服务的开发。帮助读者从简单的</span><span>java</span><span>源代码或者从一个服务描述文件（</span><span>wsdl</span><span>）开始，用</span><span>Ant</span><span>工具进行构建，设置，并把服务部署到</span><span>Axis</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>首先假定您熟悉</span><span> AXIS </span><span>处理系统和</span><span>Ant</span><span>工具。文中示例所需要的软件如下：</span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Apache Axis 1.1</font></span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Apache Ant 1.5.3</font></span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Jarkat Tomcat 4.1.24</font></span></p>
<p><span>在开始前，假定上述软件已经安装和配置好了。</span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><strong><span>Axis</span></strong><strong><span>和</span></strong><strong><span>Ant</span></strong><strong><span>简介</span></strong><strong></strong></p>
<p><span>Axis </span><span>框架是来自</span><span> Apache Group </span><span>的、基于</span><span> java </span><span>的、最新的</span><span> SOAP </span><span>规范（</span><span>SOAP 1.2</span><span>）和</span><span> SOAP with Attachments </span><span>规范（来自</span><span> Apache Group </span><span>）的开放源代码实现。其本质上是一个</span><span>SOAP</span><span>引擎－－一个构建诸如客户端、服务器、网关等</span><span>SOAP</span><span>处理器的框架。是</span><span>Apache SOAP</span><span>的后继项目。但是，</span><span>Axis</span><span>使用</span><span>SAX</span><span>（基于事件）解析器获得了比</span><span>Apache SOAP</span><span>早期版本</span><span>(</span><span>使用</span><span>DOM</span><span>解析</span><span>)</span><span>非常明显的速度优势。另外，它还具有很强的灵活性和稳定性，支持</span><span>Web</span><span>服务描述语言</span><span>1.1</span><span>版。</span></p>
<p><span>Apache Ant</span><span>是</span><span>Apache</span><span>软件基金会</span><span>jakarta</span><span>项目中的一个子项目，是一个基于</span><span>Java</span><span>的构建工具，类似于</span><span>make</span><span>，但它没有</span><span>make</span><span>那么复杂繁琐。</span><span>Ant</span><span>由一些内置任务（</span><span>task</span><span>）和可选择的任务组成，还可以配置第三方提供的任务。它的构建配置文件基于</span><span>XML</span><span>的，所以容易书写和维护，而且结构清晰。</span><span>Ant</span><span>还可以集成到一些开发环境中（例如</span><span>visual age,jbuilder,Elipse)</span><span>。</span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><strong><span>Axis</span></strong><strong><span>对</span></strong><strong><span>Ant</span></strong><strong><span>的支持</span></strong><strong></strong></p>
<p><span>Axis</span><span>为支持</span><span>Ant</span><span>构建，提供了一个</span><span>axis-ant.jar</span><span>文件。该文件包含三个可选任务</span><span>(task)</span><span>的定义和实现：</span><span>axis-wsdl2java</span><span>，</span><span>axis-java2wsdl</span><span>和</span><span>axis-admin</span><span>。任务</span><span>axis-wsdl2java</span><span>与</span><span>Axis</span><span>提供的工具</span><span>WSDL2Java</span><span>具有同样的功能，根据</span><span>web</span><span>服务描述文件生成对应的</span><span>Java</span><span>源程序，它的属性设置与</span><span>WSDL2Java</span><span>的命令参数设置类似。而任务</span><span>axis-java2wsdl</span><span>则相反，它与</span><span>Java2WSDL</span><span>工具一样，是根据已有的类文件来生成</span><span>Web</span><span>服务描述文件。最后一个任务</span><span>axis-admin</span><span>是用于</span><span>web</span><span>服务的部署和取消部署的，对应于</span><span>Axis</span><span>的</span><span>AminClient</span><span>工具。</span></p>
<p><span>为了使</span><span>Ant</span><span>能够正确使用上述三个任务（</span><span>task</span><span>），还需要做一些配置。注意：</span><span>Apache Ant</span><span>的版本必须是</span><span>1.5.1</span><span>或更高版本。</span></p>
<p><span>1</span><span>．设置系统的环境变量</span><span>CLASSPATH</span><span>包含</span><span>Axis</span><span>提供的</span><span>axis-ant.jar</span><span>文件，或者在</span><span>Ant</span><span>的配置文件（通常是</span><span>build.xml</span><span>）中设置路径包含它。例如，</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;path id="axis.classpath"&gt;</font></span></p>
<p><span><font size=3>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span>&lt;fileset dir="${axis.home}/lib"&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;include name="**/*.jar" /&gt;</font></span></p>
<p><span><font size=3>&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp; </span>&lt;/fileset&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;/path&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>2</span><span>．然后使用</span><span>&lt;taskdef&gt;</span><span>声明导入</span><span>axis-ant.jar</span><span>文件中的属性文件所定义的任务（</span><span>task</span><span>）列表。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;taskdef resource="axis-tasks.properties"</span></p>
<p><span>&nbsp;classpathref="axis.classpath" /&gt;</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp; </span>3</span><span>．设置在构建过程中可能要需要的</span><span>java</span><span>包，例如，</span><span> <span>Axis</span></span><span>所有的</span><span>jar</span><span>包，</span><span>wsdl4j.jar</span><span>，</span><span>junit.jar</span><span>等等。</span></p>
<p><span>&nbsp;</span></p>
<p><strong><span>实例开发</span></strong><strong></strong></p>
<p><span>下面就用一个实例来讲解怎样把</span><span>Ant</span><span>和</span><span>Axis</span><span>结合来开发</span><span>Web</span><span>服务。为了注重本文的目的，我们开发一个比较简单的</span><span>Web</span><span>服务，它接受客户端传入的字符串数组，如果传入的参数为</span><span>null</span><span>，则抛出一个自定义的异常，否则把每个字符串连接起来返回给客户端。</span></p>
<p><span>首先定义一个</span><span>Web</span><span>服务接口</span><span>Hello</span><span>，如下所示：</span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span><font size=3>&nbsp;package com.bidlink.hello;</font></span></p>
<p><span><font size=3>&nbsp;public interface Hello{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>public String echo(String[] content ) throws<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>java.rmi.RemoteException,com.bidlink.hello.MyException;</font></span></p>
<p><span><font size=3>&nbsp;}</font></span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span>&nbsp;</span><span>自定义异常</span><span>MyException</span><span>包含一个时间值，以记录异常出现的时间，如下：</span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span><font size=3>&nbsp;package com.bidlink.hello;</font></span></p>
<p><span><font size=3>public class MyException extends org.apache.axis.AxisFault implements java.io.Serializable{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>private java.util.Calendar occurTime;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public MyException() {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public MyException(</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>java.util.Calendar occurTime) {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.occurTime = occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public java.util.Calendar getOccurTime() {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public void setOccurTime(java.util.Calendar occurTime) {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.occurTime = occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></p>
<p><span><font size=3>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><font size=3><strong><span>1</span></strong><strong><span>．</span><span>axis-java2wsdl</span></strong><strong><span>：从类文件生成服务描述文件</span></strong></font></p>
<p><span>编译上面定义的两个文件</span><span>Hell.java</span><span>和</span><span>MyException.java</span><span>。接着编写</span><span>Ant</span><span>的配置文件</span><span>build.xml</span><span>（文件详细信息请查看示例源代码），使用</span><span>axis-java2wsdl</span><span>任务根据类</span><span>Hello</span><span>来生成</span><span>Web</span><span>服务描述文件</span><span>hello.wsdl</span><span>。任务具体配置如下：</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;axis-java2wsdl classname="com.bidlink.hello.Hello"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>location="http://localhost:8080/axis/services/Hello"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>namespace="http://hello.bidlink.com"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>output="hello.wsdl"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>style="RPC"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>extraclasses="com.bidlink.hello.MyException"&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;classpath&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;pathelement path="${dist}"/&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/classpath&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/axis-java2wsdl&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>其中，</span><span>&lt;pathelement path="${dist}"/&gt;</span><span>指出</span><span>Hello.class</span><span>和</span><span>MyException.class</span><span>文件的位置。</span></p>
<p><span>运行命令</span><span>ant java2wsdl</span><span>，构建出</span><span>Web</span><span>服务描述文件</span><span>hello.wsdl</span><span>。</span></p>
<p><font size=3><strong><span>2</span></strong><strong><span>．</span><span>axis-wsdkl2java</span></strong><strong><span>：从服务描述文件生成服务源程序</span></strong></font></p>
<p><span>下面讲解怎样根据刚刚得到的</span><span>hello.wsdl</span><span>文件生成服务所需要的</span><span>java</span><span>源程序。在这里需要用到任务</span><span>axis-wsdl2java</span><span>。任务属性设置如下：</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;axis-wsdl2java all="true" </font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp; </span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>url="hello.wsdl"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>deployscope="Request"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>output="${gensrc}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>serverside="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>skeletondeploy="false"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>testcase="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>noimports="false"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>typemappingversion="1.2"&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/axis-wsdl2java&gt; </font></span></p>
<p><span><font size=3>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>运行</span><span>ant wsdl2java</span><span>，根据</span><span>axis-wsdl2java</span><span>任务的属性配置生成相应的</span><span>java</span><span>源程序，本例所生成的文件包括：服务端服务接口文件</span><span>Hello.java</span><span>及其实现</span><span>HelloSoapBindingImpl.java</span><span>，以及客户端的</span><span>HelloService.java</span><span>，</span><span>HelloServiceLocator.java</span><span>，</span><span>HelloServiceLocator.java</span><span>和客户端存根文件</span><span>HelloSoapBindingStub.java</span><span>。又因为属性</span><span>testcase="true"</span><span>，所以还生成了测试文件</span><span>HelloServiceTestCase.java</span><span>。当然，自定义异常</span><span>MyException</span><span>也是重新生成的。</span></p>
<p><font size=3><strong><span>3</span></strong><strong><span>．</span><span>axis-admin</span></strong><strong><span>：向</span><span>Axis</span></strong><strong><span>部署</span><span>Hello</span></strong><strong><span>服务</span></strong></font></p>
<p><span>服务源程序生成后，需要根据服务的功能修改</span><span>HelloSoapBindingImpl.java</span><span>文件，以真正实现该</span><span>Web</span><span>服务。修改如下：</span></p>
<p><span><font size=3>&nbsp;/**</font></span></p>
<p><span><font size=3>&nbsp;* HelloSoapBindingImpl.java</font></span></p>
<p><span><font size=3>&nbsp;*</font></span></p>
<p><span><font size=3>&nbsp;* This file was auto-generated from WSDL</font></span></p>
<p><span><font size=3>&nbsp;* by the Apache Axis WSDL2Java emitter.</font></span></p>
<p><span><font size=3>&nbsp;*/</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>package com.bidlink.hello;</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>public class HelloSoapBindingImpl implements com.bidlink.hello.Hello{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public java.lang.String echo(java.lang.String[] in0) throws java.rmi.RemoteException, com.bidlink.hello.MyException {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(in0 == null)</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw new MyException(java.util.Calendar.getInstance());</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String retStr = "";</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for(int i=0; i&lt; in0.length; i++)</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>retStr += in0[i];</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return retStr;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>}</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>编译所有的生成的源程序，最后使用</span><span>axis-admin</span><span>任务向</span><span>Axis</span><span>部署</span><span>Hello Web</span><span>服务。</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;axis-admin</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>port="${target.port}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>hostname="${target.server}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>failonerror="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>servletpath="${target.appname}/services/AdminService"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>debug="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>xmlfile="deploy.wsdd"/&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>运行</span><span>ant deploy</span><span>，部署</span><span>Hello</span><span>服务。</span></p>
<p><font size=3><span><span>&nbsp;&nbsp; </span><strong>&nbsp;</strong></span><strong><span>测试</span></strong></font><strong></strong></p>
<p><span>现在可以测试所部署的</span><span>Web</span><span>服务</span><span>hello</span><span>。可以通过浏览器，也可以利用刚才生成的测试文件</span><span>HelloServiceTestCase.java</span><span>来进行该项工作。如果利用测试文件</span><span>HelloServiceTestCase.java</span><span>，那么还需要对它进行稍作修改。具体来说，就是添加一个</span><span>main</span><span>函数，然后修改所生成的测试方法。</span></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/136198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-12 17:04 <a href="http://www.blogjava.net/boluobn/articles/136198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Axis开发基于Java的Web服务</title><link>http://www.blogjava.net/boluobn/articles/134812.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134812.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134812.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134812.html</trackback:ping><description><![CDATA[<strong><font color=#ac0000>概述<br><br></font></strong>　　本文介绍了一个比较简单实用的基于Java的SOAP引擎——Apache组织推出的Axis——的安装、配置和应用开发方法，希望对有兴趣做基于Java的Web Services应用开发的朋友有所帮助。
<p>　　<strong><font color=#ac000>Axis简介</font></strong><br><br>　　Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C 的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。</p>
<p>　　<strong>Axis的安装</strong><br><br>　　应用Axis开发Web Services，你需要有一个支持Servlet的服务器引擎，比如广为人知的Tomcat（Tomcat也是由Apache组织所提供的，目前的最新版本为4.1.24，下载地址为http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/）。在此之前当然你机器必须已经装好了JDK1.3以上的版本，当安装好Tomcat之后，只需将下载的Axis软件包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下即可。</p>
<p>　　<strong>Axis的配置</strong><br><br>　　Axis基于Java开发，可以部署于多种操作系统，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p>
<p>CATALINA_HOME<br>C:\Tomcat_4_1</p>
<p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）<br><br>AXIS_HOME<br>蔜ALINA_HOME%\webapps\axis<br><br>AXIS_LIB<br>%AXIS_HOME%\lib<br><br>AXISCLASSPATH<br>%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<br></p>
<p>　　如果你不愿做这么繁琐的类路径设置，可以直接将axis软件包中&#8220;lib&#8221;目录下的所有.jar文件加入到系统环境变量CLASSPATH中即可。</p>
<p>　　<strong>Axis的测试</strong><br><br>　　安装配置完毕后，应测试一下是否Axis可以正确运行了。</p>
<p>　　启动Tomcat服务器，在浏览器中访问http://localhost:8080/axis/happyaxis.jsp，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功，如下图所示：</p>
<p><br><br>　　现在可以开始开发你的Web Services应用了。</p>
<p><br>　　<font color=#ac000><strong>概述</strong></font><br><br>　　本文介绍了一个比较简单实用的基于Java的SOAP引擎——Apache组织推出的Axis——的安装、配置和应用开发方法，希望对有兴趣做基于Java的Web Services应用开发的朋友有所帮助。
<p>　　<strong><font color=#ac000>Axis简介</font></strong><br><br>　　Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C 的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。</p>
<p>　　<strong>Axis的安装</strong><br><br>　　应用Axis开发Web Services，你需要有一个支持Servlet的服务器引擎，比如广为人知的Tomcat（Tomcat也是由Apache组织所提供的，目前的最新版本为4.1.24，下载地址为http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/）。在此之前当然你机器必须已经装好了JDK1.3以上的版本，当安装好Tomcat之后，只需将下载的Axis软件包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下即可。</p>
<p>　　<strong>Axis的配置</strong><br><br>　　Axis基于Java开发，可以部署于多种操作系统，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p>
<p>CATALINA_HOME<br>C:\Tomcat_4_1</p>
<p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）<br><br>AXIS_HOME<br>蔜ALINA_HOME%\webapps\axis<br><br>AXIS_LIB<br>%AXIS_HOME%\lib<br><br>AXISCLASSPATH<br>%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<br></p>
<p>　　如果你不愿做这么繁琐的类路径设置，可以直接将axis软件包中&#8220;lib&#8221;目录下的所有.jar文件加入到系统环境变量CLASSPATH中即可。</p>
<p>　　<strong>Axis的测试</strong><br><br>　　安装配置完毕后，应测试一下是否Axis可以正确运行了。</p>
<p>　　启动Tomcat服务器，在浏览器中访问<a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jsp</a>，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功，如下图所示：</p>
<p><br><br>　　现在可以开始开发你的Web Services应用了。<br></p>
<p>&#160;</p>
<strong><font color=#ac000>服务的发布</font></strong><br><br>　　Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。
<p>&#160;</p>
<p>　　<strong>使用即时发布</strong><br><br>　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使服务器重启了也不必对其做任何处理，使用非常简单快捷。<br><br>使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下即可。</p>
<p>　　在此给出一个从英里到公里的长度单位转换的服务，其源码如下：</p>
<p>文件Distance.jws<br><br>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class Distance</p>
<p>{</p>
<p>public double convertMile2Kilometre( double mile )</p>
<p>{</p>
<p>//实现英里到公里的距离转换</p>
<p>return mile * 1.609;</p>
<p>}//convertMile2Kilometre()</p>
<p>}/* Distance */<br></p>
<p>　　将其放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录，通过访问http://localhost:8080/axis/Distance.jws?wsdl可以看到这个服务的WSDL描述文件，这说明Distance服务被成功发布了。如下图所示：</p>
<p><br><br>　　<strong>使用定制发布</strong><br><br>　　即时发布是一项令人激动的技术，它使Web服务的开发变得如此简单；然而即时发布并不总是最好的选择，比如有些应用系统是第三方提供的，我们没有购买源代码，只有.class文件，但我们又希望将这个应用系统的一些功能对外发布成Web服务，使其能够在更大范围内产生作用，这个时候即时发布技术就无能为力了。此外，即时发布技术并不灵活，无法进行更多的服务配置，这使得它并不能满足一些特定系统的需求。</p>
<p>　　因此，Axis提供了另一种服务发布方式，这就是定制发布。</p>
<p>　　在此给出一个从加仑到升的容积单位转换的服务，其源码如下：</p>
<p>　　文件Capacity.java<br><br>package samples.capacity;</p>
<p>&#160;</p>
<p>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class Capacity</p>
<p>{</p>
<p>public double convertGallon2Litre( double gallon )</p>
<p>{</p>
<p>//实现加仑到升的容积转换</p>
<p>return gallon * 4.546;</p>
<p>}//convertGallon2Litre()</p>
<p>}/* Capacity */<br></p>
<p>　　将其编译成.class文件，放置到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，即可着手进行发布。</p>
<p>　　定制发布不需要构建.jws文件，但必须创建服务发布描述文件deploy.wsdd（Web Service Deployment Descriptor的缩写），这个文件负责描述服务的名称、入口等信息，其内容如下：</p>
<p>　　文件deploy.wsdd<br><br>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"</p>
<p>xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;</p>
<p>&#160;</p>
<p>&lt;service name="Capacity" provider="java:RPC"&gt;</p>
<p>&lt;parameter name="className" value="samples.capacity.Capacity"/&gt;</p>
<p>&lt;parameter name="allowedMethods" value="*"/&gt;</p>
<p>&lt;/service&gt;</p>
<p>&#160;</p>
<p>&lt;/deployment&gt;<br></p>
<p>　　将该文件也放到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。</p>
<p>　　在&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，运行：</p>
<p>java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd<br></p>
<p>　　可以看到以下运行结果：</p>
<p>Processing file deploy.wsdd</p>
<p>&lt;Admin&gt;Doneprocessing&lt;/Admin&gt;<br></p>
<p>　　这表明Capacity服务定制发布完成。</p>
<p>　　通过访问<a href="http://localhost:8080/axis/services/Capacity?wsdl">http://localhost:8080/axis/services/Capacity?wsdl</a>可以看到这个服务的WSDL描述文件，这说明Capacity服务被成功发布了。如下图所示：<br><br></p>
<p>&#160;</p>
<p><strong><font color=#ac000>服务的访问</font></strong><br><br>　　<strong>GET方式的服务访问</strong><br><br>　　一般的SOAP消息都是采用POST方式实现传递，但也可以通过GET方式来访问。比如以下给出的一个服务——&#8220;HelloWorld&#8221;，其源码如下： </p>
<p>&#160;</p>
<p>文件HelloWorld.jws<br><br>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class HelloWorld</p>
<p>{</p>
<p>public String helloWorld()</p>
<p>{</p>
<p>//在服务器端打印输出</p>
<p>System.out.println( "Hello World!" );</p>
<p>&#160;</p>
<p>//返回相应字符串</p>
<p>return "Hello World!";</p>
<p>}//helloWorld()</p>
<p>&#160;</p>
<p>}/* HelloWorld */<br></p>
<p>　　这个服务给出一个名位&#8220;helloWorld&#8221;的无入口参数的操作，返回一个内容为&#8220;Hello World！的字符串&#8221;，同时在服务器端打印&#8220;Hello World！&#8221;，将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下，即可通过GET方法直接访问该服务，访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld，可以看到返回的SOAP信封消息，同时服务器端给出了相应的显示信息&#8220;Hello World！&#8221;这表明HelloWorld服务被成功访问了。如下图所示：</p>
<p><br><br>　　<strong>客户端服务访问编程</strong><br><br>　　Axis提供了一套API来实现SOAP，从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。</p>
<p>　　其中，org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类，一般的客户端程序欲访问一个Web Service时，都要生成一个客户端的Service对象和Call对象，在访问服务之前，首先要对Call对象设置相应的参数，包括服务的位置、操作名、入口参数、返回值类型等，最后调用Call对象的invoke方法访问服务。</p>
<p>　　以下给出了一个客户端访问Web服务的例程——AXISTest.java：</p>
<p>　　文件AXISTest.java<br><br>package axisexercise;</p>
<p>&#160;</p>
<p>import org.apache.axis.client.Call;</p>
<p>import org.apache.axis.client.Service;</p>
<p>import org.apache.axis.encoding.XMLType;</p>
<p>&#160;</p>
<p>import javax.xml.rpc.ParameterMode;<br></p>
<p>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class AXISTest</p>
<p>{</p>
<p>public static void main( String[] args ) throws Exception</p>
<p>{</p>
<p>Service service = new Service();</p>
<p>Call call = ( Call ) service.createCall();</p>
<p>&#160;</p>
<p>&#160;</p>
<p>//////////访问即时发布的Distance服务</p>
<p>//设置访问点</p>
<p>call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );</p>
<p>&#160;</p>
<p>//设置操作名</p>
<p>call.setOperationName( "convertMile2Kilometre" );</p>
<p>&#160;</p>
<p>//设置入口参数</p>
<p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p>
<p>call.setReturnType( XMLType.XSD_DOUBLE );</p>
<p>Double d1 = new Double( 190 );</p>
<p>&#160;</p>
<p>//调用服务</p>
<p>System.out.println( d1 " 英里相当于 " </p>
<p>call.invoke( new Object[] {d1} ) " 公里！" );</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>//////////访问定制发布的Capacity服务</p>
<p>call = ( Call ) service.createCall();</p>
<p>//设置访问点</p>
<p>call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );</p>
<p>&#160;</p>
<p>//设置操作名</p>
<p>call.setOperationName( "convertGallon2Litre" );</p>
<p>&#160;</p>
<p>//设置入口参数</p>
<p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p>
<p>call.setReturnType( XMLType.XSD_DOUBLE );</p>
<p>d1 = new Double( 10.00 );</p>
<p>&#160;</p>
<p>//调用服务</p>
<p>System.out.println( d1 " 加仑相当于 " </p>
<p>call.invoke( new Object[] {d1} ) " 升！" );</p>
<p>} //main()</p>
<p>}/* AXISTest */<br></p>
<p>　　编译运行后运行可以看到以下的结果：</p>
<p>　　190.0英里相当于305.71公里！</p>
<p>　　10.0加仑相当于45.46升！<br>　 <br>　　注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同，前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws，而后者的则为http://localhost:8080/axis/services/Capacity。</p>
<p>　　<strong><font color=#ac000>总结</font></strong><br><br>　　Web Services是未来网络应用的发展方向，SOAP和WSDL是Web Services的核心协议，Axis给出了一个很好的SOAP实现，它使得开发Web Services应用变得轻松而有趣。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:47 <a href="http://www.blogjava.net/boluobn/articles/134812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用jws来创建web services </title><link>http://www.blogjava.net/boluobn/articles/134811.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134811.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134811.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134811.html</trackback:ping><description><![CDATA[用jws来创建web services是一个最简单的方法，下面借助一个简单的例子说明一下具体过程<br>1.编写一个java文件，经javac编译后没有错误，把该文件另存为.jws文件。例如合HelloWorld.jws:<br>&nbsp; public class HelloWorld{<br>&nbsp; public String sayHello(String name){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello"+name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>然后把它放到对应的webapps/axis下.<br>2。启动服务器，axis会自动把它变成一个服务，生成相关的wsdl文档，并把jws用java编译成class文件放到axis\WEB-INF\jwsClasses目录下。打开IE,输入：<a href="http://127.0.0.1:7001/axis/HelloWorld.jws">http://127.0.0.1:7001/axis/HelloWorld.jws</a>，即可发现有一个wsdl和该服务。<br>3。编写一应用程序客户端来访问该web services.例如：<br>import javax.xml.rpc.ParameterMode;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>import org.apache.axis.encoding.XMLType;<br>public class ServiceClient{<br>&nbsp;public static void main(String[] args) throws Exception{<br>&nbsp;&nbsp;String endpoint="<a href="http://127.0.0.1:7001/axis/HelloWorld.jws">http://127.0.0.1:7001/axis/HelloWorld.jws</a>";<br>&nbsp;&nbsp;String name="gaolong1";<br>&nbsp;&nbsp;Service service=new Service();<br>&nbsp;&nbsp;Call call=(Call) service.createCall();<br>&nbsp;&nbsp;call.setUsername("glong1");<br>&nbsp;&nbsp;call.setPassword("131001");//这是服务所用的安全的认证<br>&nbsp;&nbsp;call.setTargetEndpointAddress(new java.net.URL(endpoint));<br>&nbsp;&nbsp;call.setOperationName("sayHello");<br>&nbsp;&nbsp;call.addParameter("name",XMLType.XSD_STRING,ParameterMode.IN);<br>&nbsp;&nbsp;call.setReturnType(XMLType.XSD_STRING);//XMLType.XSD_STRING);<br>&nbsp;&nbsp;String ret=(String)call.invoke(new Object[] {name});<br>&nbsp;&nbsp;System.out.println(ret);<br>&nbsp;}<br>}<br>运行后，会显示其调用信息。<br>在使用的过程中，要用到tcpmontor来监听截取soap消息：<br>用：java org.apache.axis.utils.tcpmon 7003 localhost 7001 (其中前者是截听得代理端口，中间是目标地址，后者是所用的目标端口）<br>&nbsp;通过tcpmontor来监听tcp:7001得到的soap消息如下：<br>请求消息：<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"&gt;<br>&lt;soapenv:Body&gt;<br>&nbsp; &lt;sayHello soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name xsi:type="xsd:string"&gt;gaolong1&lt;/name&gt;<br>&nbsp; &lt;/sayHello&gt;<br>&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;<br>回应消息：<br>&lt;?xml version="1.0" encoding="utf-8"? &gt;<br>&nbsp;&lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"&gt;<br>&lt;soapenv:Body&gt;<br>&nbsp; &lt;sayHelloResponse soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sayHelloReturn xsi:type="xsd:string"&gt;Hellogaolong1&lt;/sayHelloReturn&gt;<br>&nbsp; &lt;/sayHelloResponse&gt;<br>&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;
<img src ="http://www.blogjava.net/boluobn/aggbug/134811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:44 <a href="http://www.blogjava.net/boluobn/articles/134811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用wsdd来开发web services </title><link>http://www.blogjava.net/boluobn/articles/134810.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134810.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134810.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134810.html</trackback:ping><description><![CDATA[<p>用wsdd(服务部署描述语言)，主要是编写java文件和编写wsdd文件。<br>1。编写java文件，最好是定义在某一个包下，否则便以后直接放到\WEB-INF\classes下，有时会出错，原因是在用deploy.wsdd部署时映射不对。然后直接包对应的包放到\WEB-INF\classes中。HelloWorldG.java文件：<br>&nbsp;&nbsp;&nbsp; package test.gaolong;<br>public class HelloWorldG{<br>&nbsp; public String sayHelloG(String name){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "HelloG "+name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>2。编写wsdd文件，根据wsdd文件的规范编写相关文档。例如：(deploy.wsdd) <br>&nbsp;&nbsp; &lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>"&gt;&lt;--命名空间--&gt;<br>&nbsp; &lt;service name="HelloWorldG" provider="java:RPC"&gt;&lt;-服务名--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="test.gaolong.HelloWorldG"/&gt;&lt;--对应的主类---&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;&lt;---注册相应的方法，如果只有一个方法，可以直接注册方法名---&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedRoles" value="user"/&gt;&lt;--定义用户认证---&gt;<br>&nbsp;&nbsp;&nbsp; &lt;requestFlow&gt;&lt;-用户认证的描述文件--&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp; &lt;/service&gt;<br>&lt;/deployment&gt;<br>3。部署wsdd文件：打开命令口，切换到deploy.wsdd目录下，运行java org.apache.axis.client.AdminClient即可完成部署。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这儿可能出错，正确的显示：<br>D:\bea\user_projects\domains\mydomain\applications\axis\WEB-INF\classes&gt;java org.apache.axis.client.AdminClient&nbsp; -p 7001&nbsp; deploy.wsdd<br>Processing file deploy.wsdd<br>&lt;Admin&gt;Done processing&lt;/Admin&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当在wsdl中使用deploy.wsdd来部署时，对于服务器是要打开的，而且当服务器的端口不是8080时，采用要求java org.apache.axis.client.AdminClient -p &lt;port&gt; deploy.wsdd 来指定并进行服务部署。<br>4。打开server-config.wsdd会发现增加了语句描述：&lt;service name="HelloWorldG" provider="java:RPC"&gt;<br>&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp; &lt;parameter name="allowedRoles" value="user"/&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp; &lt;parameter name="className" value="test.gaolong.HelloWorldG"/&gt;<br>&nbsp;&lt;/service&gt;<br>其实直接到该文件中增加该内容，不必用org.apache.axis.client.AdminClient来部署描述。<br>打开IE，可以在<a href="http://127.0.0.1:7001/axis/servlet/AxisServlet">http://127.0.0.1:7001/axis/servlet/AxisServlet</a>看到该服务部署到服务列表上。<br>5。编写测试application客户端,其代码如下：<br>import javax.xml.rpc.ParameterMode;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>import org.apache.axis.encoding.XMLType;<br>import javax.xml.namespace.QName;</p>
<p>public class ServiceClient{<br>&nbsp;public static void main(String[] args) throws Exception{<br>&nbsp;&nbsp;String endpoint="<a href="http://127.0.0.1:7003/axis/services/HelloWorldG">http://127.0.0.1:7003/axis/services/HelloWorldG</a>";<br>&nbsp;&nbsp;String name="gaong1";<br>&nbsp;&nbsp;Service service=new Service();<br>&nbsp;&nbsp;Call call=(Call) service.createCall();//回调服务<br>&nbsp;&nbsp;call.setUsername("gaolong1");<br>&nbsp;&nbsp;call.setPassword("8001");//用户认证<br>&nbsp;&nbsp;call.setTargetEndpointAddress(new java.net.URL(endpoint));<br>&nbsp;//&nbsp;call.setOperationName("sayHelloG");<br>&nbsp;&nbsp;call.setOperationName(new QName("<a href="http://gaolong.test/">http://gaolong.test/</a>", "sayHelloG"));//设置指定的命名空间，根据wsdl文件来决定<br>&nbsp;&nbsp;call.addParameter("name",XMLType.XSD_STRING,ParameterMode.IN);<br>&nbsp;&nbsp;call.setReturnType(XMLType.XSD_STRING);//XMLType.XSD_STRING);<br>&nbsp;&nbsp;String ret=(String)call.invoke(new Object[] {name});<br>&nbsp;&nbsp;System.out.println(ret);<br>&nbsp;}<br>}<br>&nbsp;运行之后有关的显示。<br>6。通过tcpmonitor来监听的soap消息如下：<br>请求soap:<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"&gt;<br>&lt;soapenv:Body&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ns1:sayHelloG soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:ns1="<a href="http://gaolong.test/">http://gaolong.test/</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name xsi:type="xsd:string"&gt;gaolong1&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ns1:sayHelloG&gt;<br>&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;<br>回应soap:<br>&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"&gt;<br>&lt;soapenv:Body&gt;<br>&nbsp;&lt;ns1:sayHelloGResponse soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:ns1="<a href="http://gaolong.test/">http://gaolong.test/</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sayHelloGReturn xsi:type="soapenc:string" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/%22%3EHelloG">http://schemas.xmlsoap.org/soap/encoding/%22%3EHelloG</a> gaolong1&lt;/sayHelloGReturn&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ns1:sayHelloGResponse&gt;<br>&nbsp;&lt;/soapenv:Body&gt;<br>&lt;/soapenv:Envelope&gt;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:43 <a href="http://www.blogjava.net/boluobn/articles/134810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用DataHandler来实现一个带附件的soap请求的web services </title><link>http://www.blogjava.net/boluobn/articles/134809.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134809.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134809.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134809.html</trackback:ping><description><![CDATA[1.为了使其对DataHandler的支持。除了配置好axis环境之外，还要在sun的网站上下载jaf 1-0-2.jar包，并把它注册到CLASS_PATH中。<br>2.编写服务程序（.java),既支持文本文件，也支持二进制文件。<br>package test.gaolong;
<p>import java.io.*;<br>import javax.activation.*;</p>
<p>public class FileService{<br>&nbsp; public static String Repository="./files/";<br>&nbsp; public String putFile(DataHandler dh,String name){<br>&nbsp;&nbsp; if(name==null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="test.tmp";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("test");<br>&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp; File dir=new File(Repository);<br>&nbsp;&nbsp;&nbsp; if(!dir.exists()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir.mkdir(); System.out.println("makedir"+"test");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; InputStream input=dh.getInputStream();<br>&nbsp;&nbsp;&nbsp; FileOutputStream fos=new FileOutputStream(new File(dir,name));<br>&nbsp;&nbsp;&nbsp; System.out.println("test");<br>&nbsp;&nbsp;&nbsp; byte[] buffer=new byte[1024*4];<br>&nbsp;&nbsp;&nbsp; int n=0;<br>&nbsp;&nbsp;&nbsp; while((n=input.read(buffer))!=-1){<br>&nbsp;&nbsp;&nbsp;&nbsp; fos.write(buffer,0,n);<br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(buffer);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; System.out.println("test");<br>&nbsp;&nbsp;&nbsp; input.close();<br>&nbsp;&nbsp;&nbsp; fos.close();<br>&nbsp;&nbsp; }catch(IOException e){<br>&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp; }<br>&nbsp; return name+"send OK";<br>&nbsp;}<br>&nbsp;public DataHandler getFile(String name){<br>&nbsp; File dir=new File(Repository);<br>&nbsp; if(!dir.exists())<br>&nbsp; dir.mkdir();<br>&nbsp; File data=new File(dir,name);<br>&nbsp; if(data.exists())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new DataHandler(new FileDataSource(data));<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br>&nbsp;&nbsp;}<br>}<br>3。写deploy.wsdd部署描述文件如下：<br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</a>" xmlns:ns1="<a href="http://localhost:7001/axis/services/FileService">http://localhost:7001/axis/services/FileService</a>" &gt;<br>&nbsp; &lt;service name="FileService" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="test.gaolong.FileService"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedRoles" value="user"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;operation name="getFile" returnQName="returnqname" returnType="ns1:DataHandler" xmlns:SchemaNS="<a href="http://www.w3.org/2001/XMlSchema">http://www.w3.org/2001/XMlSchema</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="name" type="SchemaNS:string"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/operation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;operation name="putFile" returnQName="returnqname" returnType="ns1:DataHandler" xmlns:SchemaNS="<a href="http://www.w3.org/2001/XMlSchema">http://www.w3.org/2001/XMlSchema</a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="dh" type="ns1:DataHandler"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="name" type="SchemaNS:string"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/operation&gt;<br>&nbsp;&nbsp;&nbsp; &lt;typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" type="java:javax.activation.DataHandler" qname="ns1:DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/%22/%3E//">http://schemas.xmlsoap.org/soap/encoding/%22/%3E//</a>注意见下面的。<br>&nbsp; &lt;/service&gt;<br>&lt;/deployment&gt;</p>
<p>注：对于soap1.2而言，要使用上面的&lt;typeMaping&gt;,而对于soap1.1而言，则有一点区别如下：<br>&nbsp;&lt;typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" lanuageSpecificType="java:javax.activation.DataHandler" qname="ns1:DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/%22/">http://schemas.xmlsoap.org/soap/encoding/%22/</a>&gt;<br>4。启动服务器，用java org.apache.axis.client.AdminClient&nbsp; -p 7001&nbsp; deploy.wsdd部署webservices即可访问。<br>5。编写客户端应用访问程序如下：<br>&nbsp;import javax.xml.rpc.ParameterMode;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>import org.apache.axis.encoding.XMLType;<br>import javax.xml.namespace.QName;<br>import org.apache.axis.soap.SOAP11Constants;<br>import java.net.URL;<br>import javax.activation.DataHandler;<br>import javax.activation.FileDataSource;<br>import org.apache.axis.encoding.ser.*;<br>public class ServiceClient{<br>&nbsp;public static void main(String[] args) throws Exception{<br>&nbsp;&nbsp;String filename="HelloWorld.java";<br>&nbsp;&nbsp;DataHandler dh=new DataHandler(new FileDataSource(filename));<br>&nbsp;&nbsp;String endpoint="<a href="http://127.0.0.1:7003/axis/services/FileService">http://127.0.0.1:7003/axis/services/FileService</a>";<br>&nbsp;&nbsp;String name="gaolong1";<br>&nbsp;&nbsp;Service service=new Service();<br>&nbsp;&nbsp;Call call=(Call) service.createCall();<br>&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(endpoint));<br>&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName(new QName("<a href="http://127.0.0.1:7001/axis/services/FileService">http://127.0.0.1:7001/axis/services/FileService</a>", "putFile"));//指定方法的命名空间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QName qnameattachment=new QName("FileService","DataHandler");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.registerTypeMapping(dh.getClass(),qnameattachment,JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("s1",qnameattachment,ParameterMode.IN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);<br>&nbsp;&nbsp;call.setReturnType(XMLType.XSD_STRING);//XMLType.XSD_STRING);//用Class.forName("java.lang.String")来获取java类型<br>&nbsp;&nbsp;String ret=(String)call.invoke(new Object[] {dh,"HelloWorld.java"});<br>&nbsp;&nbsp;System.out.println(ret);<br>&nbsp;}<br>}<br>6。成功执行客户端应用程序，可以找到上传文件。<br>请求的soap消息:<br>POST /axis/services/FileService HTTP/1.0<br>Content-Type: multipart/related; type="text/xml"; start="&lt;3165C8664597DC7EF29D5BFAC8972562&gt;"; &nbsp;boundary="----=_Part_0_21866740.1141202759484"<br>Accept: application/soap+xml, application/dime, multipart/related, text/*<br>User-Agent: Axis/1.2.1<br>Host: localhost:7003<br>Cache-Control: no-cache<br>Pragma: no-cache<br>SOAPAction: ""<br>Content-Length: 1050</p>
<p><br>------=_Part_0_21866740.1141202759484<br>Content-Type: text/xml; charset=UTF-8<br>Content-Transfer-Encoding: binary<br>Content-Id: &lt;3165C8664597DC7EF29D5BFAC8972562&gt;</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance%22%3E%3Csoapenv:Body%3E%3Cns1:putFile">http://www.w3.org/2001/XMLSchema-instance%22%3E%3Csoapenv:Body%3E%3Cns1:putFile</a> soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:ns1="<a href="http://127.0.0.1:7001/axis/services/FileService%22%3E%3Cs1">http://127.0.0.1:7001/axis/services/FileService%22%3E%3Cs1</a> href="cid:03D9C1D3A9E0788D274934C3ABD52811" xsi:type="ns2:DataHandler" xmlns:ns2="FileService"/&gt;&lt;s2 xsi:type="xsd:string"&gt;HelloWorld.java&lt;/s2&gt;&lt;/ns1:putFile&gt;&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;<br>------=_Part_0_21866740.1141202759484<br>Content-Type: application/octet-stream<br>Content-Transfer-Encoding: binary<br>Content-Id: &lt;03D9C1D3A9E0788D274934C3ABD52811&gt;</p>
<p>public class HelloWorld{<br>&nbsp; public String sayHello(String name){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello"+name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>------=_Part_0_21866740.1141202759484--<br>上传后的文件的位置：/*在该目录下创建文件夹：D:\bea\user_projects\domains\mydomain\files，并把相应的文件存入该目录下*/<br>7.另一种基于java mail的带附件的传输，是基于xmlDOM+servlet可以来实现，只是比较底层而已。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:40 <a href="http://www.blogjava.net/boluobn/articles/134809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么需要Web Service </title><link>http://www.blogjava.net/boluobn/articles/134808.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134808.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134808.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134808.html</trackback:ping><description><![CDATA[<span class=javascript id=text8139>从前，分布式的应用程序逻辑需要使用分布式的对象模型，诸如：微软的分布式组件对象模型(DCOM)、对象管理集团的公用对象请求代理程序体系结构(CORBA)或Sun的远程方法调用(RMI)。通过使用这种基本结构，开发人员仍可拥有使用本地模型所提供的丰富资源和精确性，并可将服务置于远程系统中。 <br><br>当我已经有了我中意的中间件平台（RMI, Jini, CORBA, DCOM 等等)时，为什么还要为Web而烦恼呢？中间件确实提供了强大的服务实现手段，但是，这些系统有一个共同的缺陷，那就是它们无法扩展到互联网上：它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合，即要求一个同类基本结构。这样的系统往往十分脆弱：如果一端的执行机制发生变化，那么另一端便会崩溃。例如，如果服务器应用程序的接口发生更改，那么客户端便会崩溃。 <br><br>要求提供紧密耦合的基本结构，无可厚非，许多应用程序均是基于这种系统构建而成的。但是，当各个公司需要相互合作、或信息技术提供商扩大业务范围时，便很难实现单一而统一的基本结构。您根本无法保证您希望与之进行远程通信的管道的另一端，具备所有您需要的基本结构：对于它使用的操作系统、对象模型或编程语言，您可能一无所知。 <br><br>相反，Web服务彼此是松散偶合的。连接中的任何一方均可更改执行机制，却不影响应用程序的正常运行。从技术角度讲，人们已转向使用一种基于消息的异步技术来实现高可靠性的系统性能，通过使用诸如HTTP、简单邮件传输协议(SMTP)以及至为重要的XML来实现统一的连接。 <br><br>Web作为信息发布者的力量就在于简单且无处不在，这对解决现在这样一个分裂中间件世界很重要。Web通过在传统中间件平台上更有效实现的Services，来提供一个统一且广泛适用的接口，这样就改善了这个平台。 <br><br>从一个N层应用程序结构的角度来看，web service只是一个方便程序访问的包装，服务还是要靠中间件来实现。访问包括服务请求处理（监听者）和一个支持商业逻辑操作的接口，商业逻辑本身是由传统的中间件平台实现的。 <br><br>从理论上讲，开发人员可通过调用Web应用编程接口(API)（就像调用本地服务一样），将Web服务集成到应用程序中，不同的是Web API调用可通过互联网发送给位于远程系统中的某一服务。例如，Microsoft Passport服务使得开发人员能够对某应用程序进行验证。通过Passport服务编程，开发人员可以充分利用Passport的基本结构，通过运行Passport来维护用户数据库，以确保它的正常运行、定期备份等等。 <br><br>消息传递系统将通信的基本单元打包成自我描述型的数据包（又称作消息），并将其放到网络缆线中。消息传递系统与分布式对象系统之间的本质区别在于：要求发送方辨识接收方的基本结构的程度有所不同。在分布式系统中，发送方需对接收方的情况作出种种猜测：应用程序是如何激活或拆包的，调用的是什么样的界面，等等。 <br><br>另一方面，消息传递系统会在缆线格式级上创建合同。发送方既不需考虑消息被接收后的情况，也不需考虑接发双方之间的通信情况，唯一需要考虑的是接收方是否能辩识发送的消息内容。 <br><br>在缆线格式级上创建合同的优势不言而喻。例如，接收方可在任何时刻进行更改，而不会干扰发送方的消息发送，只要它仍可辩识原有消息的内容。另外，发送方无需任何特殊的软件即可与接收方通信：只要它发出正确格式的消息，接收方就可以响应。</span><br><br>
<img src ="http://www.blogjava.net/boluobn/aggbug/134808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:35 <a href="http://www.blogjava.net/boluobn/articles/134808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService之axis的复杂对象传输 </title><link>http://www.blogjava.net/boluobn/articles/134807.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134807.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134807.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134807.html</trackback:ping><description><![CDATA[先自定义发布: <br>写一个deploy.wsdd 文件:<br>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<br>&lt;service name="mShop" provider="java:RPC"&gt;<br>&lt;parameter name="className" value="tests.shop"/&gt;<br>&lt;parameter name="allowedMethods" value="*"/&gt;<br><font color=#0066ff>&lt;typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" <br>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" <br>qname="ns1:book" <br>serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" <br>type="java:tests.book"<br>xmlns:ns1="http://127.0.0.1:8080/axis/services/mShop"/&gt;</font><br>&lt;/service&gt;<br>&lt;/deployment&gt;<br><br>服务发布后，以上的发布信息都会被添加到server-config.wsdd文件里~<br>若服务发布出了什么问题(比如View里面看不到任何服务等&#8230;&#8230;==!)一个考虑的就是这个server-config.wsdd~<br>上面的高亮显示，这是关键，它在server端定义如何序列化和反序列化complexType<br>若没有这个，那么你在客户端registry.getDefaultTypeMapping()将什么都得不到~~<br><br>这里的&lt;typeMapping .../&gt;定义了一个book对象,它是服务方法 public book[] getAllBooks() 的返回类型，类定义在tests.book，namespace是服务的namespace<br>具体的wsdd文件说明在axisUserguide里面，具体位置 : %axis_home%/docs/reference.html<br>以此类推，服务中所有的非原子类型返回都必须typeMapping一下~~~(= =!汗)<br><br>注册复杂类型的客户端代码：<br><br><br>org.apache.axis.client.<font color=#0066cc>Service</font> service = new org.apache.axis.client.<font color=#0066cc>Service</font>();<br>TypeMappingRegistry registry = service.getTypeMappingRegistry();<br>TypeMapping map = registry.getDefaultTypeMapping();<br>QName qType = new QName("http://localhost/tests","book");<br>Class qClass = Class.forName("tests.book");<br>map.register(qClass,qType,new BeanSerializerFactory(qClass, qType),<br>new BeanDeserializerFactory(qClass, qType));<br><br>要注意，Service是org.apache.axis.client.Service，而不是javax.xml.rpc.Service，如果用错了axis会发出一大堆http500来抱怨的~~~
<img src ="http://www.blogjava.net/boluobn/aggbug/134807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:32 <a href="http://www.blogjava.net/boluobn/articles/134807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet与Web服务 </title><link>http://www.blogjava.net/boluobn/articles/134804.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 14:23:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134804.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134804.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134804.html</trackback:ping><description><![CDATA[1.第一口就吃到馅，配置一个Web服务的最简方法<br>===============================================================================================<br><br>为了能让web服务先跑起来，先给出一个Web服务的原型，以便于后面的讨论。<br>我们从一个最简单的例子开始，只给出必须的东西。<br><br>所需软件：<br>1.Tomcat4.1.2<br>2.一个Java编译器，jdk或JBuilder等等，这是为了编译我们的Java源程序，于web服务无关。<br><br>所需文件：<br>1.sayHello.java<br>2.web.xml<br>3.server-config.xml<br>4.Java&nbsp;Packages:&nbsp;axis.jar,jaxrpc.jar,tt-bytecode.jar,wsdl4j.jar,xercesImpl.jar,xml-apis.jar<br><br>至于Tomcat怎么安装我就不说了，网上关于Tomcat安装的文章有很多。<br>这六个package，从ibm和apache的网站上都可以下得到。<br><br>只需要这些，我们就可以部署自己的Web服务了。。<br>下面是目录结构：<br>webapps/test/WEB-INF/web.xml<br>webapps/test/WEB-INF/server-config.wsdd<br>webapps/test/WEB-INF/classes/sayHello.class<br>webapps/test/WEB-INF/lib/xxx.jar&nbsp;---所需得六个packages<br><br><br>web.xml<br>---------------------------------------------<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"?&gt;<br>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.2//EN"&nbsp;"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"&gt;<br><br>&lt;web-app&gt;<br><br>&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Axis&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--实际servlet程序，这里是AxisServlet--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.axis.transport.http.AxisServlet&lt;/servlet-class&gt;<br>&lt;/servlet&gt;<br><br>&lt;!--&nbsp;###&nbsp;定义servlet和url的对应关系--&gt;<br><br>&lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Axis&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br><br>&lt;/web-app&gt;<br><br>---------------------------------------------<br><br>server-config.wsdd<br>---------------------------------------------<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;deployment&nbsp;xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&nbsp;xmlns="http://xml.apache.org/axis/wsdd/"&gt;<br><br>&lt;handler&nbsp;type="java:org.apache.axis.handlers.http.URLMapper"&nbsp;name="URLMapper"/&gt;<br>&nbsp;&nbsp;<br>&lt;service&nbsp;name="sayHelloService"&nbsp;provider="java:RPC"&gt;<br>&nbsp;&nbsp;&lt;parameter&nbsp;name="className"&nbsp;value="sayHello"/&gt;<br>&nbsp;&nbsp;&lt;parameter&nbsp;name="allowedMethods"&nbsp;value="sayHelloTo"/&gt;<br>&lt;/service&gt;<br><br>&lt;transport&nbsp;name="http"&gt;<br>&nbsp;&nbsp;&lt;requestFlow&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;handler&nbsp;type="URLMapper"/&gt;<br>&nbsp;&nbsp;&lt;/requestFlow&gt;<br>&lt;/transport&gt;<br><br>&lt;/deployment&gt;<br>---------------------------------------------<br><br>sayHello.java<br>---------------------------------------------<br>public&nbsp;class&nbsp;sayHello<br>{<br>&nbsp;&nbsp;public&nbsp;String&nbsp;sayHelloTo(String&nbsp;aname)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"How&nbsp;are&nbsp;you,&nbsp;"&nbsp;+&nbsp;aname;<br>&nbsp;&nbsp;}<br>}<br>---------------------------------------------<br><br><br>假设ip地址192.168.0.1,端口号是80，我们输入下面的url得到服务列表（当然这里只有一个）:<br>http://192.168.0.1/test/services<br>如果你的端口号是8080，就应该输入http://192.168.0.1:8080/test/services,后面同理。<br><br>浏览器显示：<br>——————————————<br>|And&nbsp;now...&nbsp;Some&nbsp;Services&nbsp;|<br>|&nbsp;sayHelloService&nbsp;(wsdl)&nbsp;&nbsp;|<br>|&nbsp;&nbsp;.sayHelloTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<br>——————————————<br><br>sayHelloService是我们的服务名，右侧的&nbsp;(wsdl)是一个链接指向sayHelloService的WSDL文档，<br>这个文档是由Axis自动生成的。<br>sayHelloTo当然就是我们的方法了。。。<br><br>点击(wsdl)链接或输入下面的url，得到WSDL:<br>http://192.168.0.1/test/services/sayHelloService?wsdl<br><br>浏览器显示sayHelloService的WSDL文档：<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;wsdl:definitions&nbsp;targetNamespace="http://192.168.0.1/test/services/sayHelloService/test/services/sayHelloService"&nbsp;xmlns="http://schemas.xmlsoap.org/wsdl/"&nbsp;xmlns:apachesoap="http://xml.apache.org/xml-soap"&nbsp;xmlns:impl="http://192.168.0.1/test/services/sayHelloService/test/services/sayHelloService-impl"&nbsp;xmlns:intf="http://192.168.0.1/test/services/sayHelloService/test/services/sayHelloService"&nbsp;xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"&nbsp;xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"&nbsp;xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"&nbsp;xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;<br>&nbsp;&nbsp;&lt;wsdl:message&nbsp;name="sayHelloToResponse"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:part&nbsp;name="return"&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&lt;/wsdl:message&gt;<br>&nbsp;&nbsp;&lt;wsdl:message&nbsp;name="sayHelloToRequest"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:part&nbsp;name="aname"&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&lt;/wsdl:message&gt;<br>&nbsp;&nbsp;&lt;wsdl:portType&nbsp;name="sayHello"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:operation&nbsp;name="sayHelloTo"&nbsp;parameterOrder="aname"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:input&nbsp;message="intf:sayHelloToRequest"&nbsp;name="sayHelloToRequest"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:output&nbsp;message="intf:sayHelloToResponse"&nbsp;name="sayHelloToResponse"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/wsdl:operation&gt;<br>&nbsp;&nbsp;&lt;/wsdl:portType&gt;<br>&nbsp;&nbsp;&lt;wsdl:binding&nbsp;name="sayHelloServiceSoapBinding"&nbsp;type="intf:sayHello"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdlsoap:binding&nbsp;style="rpc"&nbsp;transport="http://schemas.xmlsoap.org/soap/http"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:operation&nbsp;name="sayHelloTo"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdlsoap:operation&nbsp;soapAction=""/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:input&nbsp;name="sayHelloToRequest"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdlsoap:body&nbsp;encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&nbsp;namespace="http://192.168.0.1/test/services/sayHelloService/test/services/sayHelloService"&nbsp;use="encoded"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/wsdl:input&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:output&nbsp;name="sayHelloToResponse"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdlsoap:body&nbsp;encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&nbsp;namespace="http://192.168.0.1/test/services/sayHelloService/test/services/sayHelloService"&nbsp;use="encoded"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/wsdl:output&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/wsdl:operation&gt;<br>&nbsp;&nbsp;&lt;/wsdl:binding&gt;<br>&nbsp;&nbsp;&lt;wsdl:service&nbsp;name="sayHelloService"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdl:port&nbsp;binding="intf:sayHelloServiceSoapBinding"&nbsp;name="sayHelloService"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wsdlsoap:address&nbsp;location="http://192.168.0.1/test/services/sayHelloService"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/wsdl:port&gt;<br>&nbsp;&nbsp;&lt;/wsdl:service&gt;<br>&lt;/wsdl:definitions&gt;<br><br><br><br>我们甚至不用客户端，就可以查看服务是否部署成功以及获得返回结果<br>用Get方法获得soap流，我们要用下面的url:<br>（真正调用Web服务，用的是Post方法，这个后面会讲）<br><br>http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&amp;aname=everybody<br><br>浏览器显示的是乱码，我们点右键查看源文件，结果如下：<br><br>&lt;p&gt;Got&nbsp;response&nbsp;message&lt;/p&gt;<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;soapenv:Envelope&nbsp;xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"&nbsp;xmlns:xsd="http://www.w3.org/2001/XMLSchema"&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;<br>&nbsp;&lt;soapenv:Body&gt;<br>&nbsp;&nbsp;&lt;sayHelloToResponse&nbsp;soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;sayHelloToReturn&nbsp;xsi:type="xsd:string"&gt;How&nbsp;are&nbsp;you,&nbsp;everybody&lt;/sayHelloToReturn&gt;<br>&nbsp;&nbsp;&lt;/sayHelloToResponse&gt;<br>&nbsp;&lt;/soapenv:Body&gt;<br>&lt;/soapenv:Envelope&gt;<br><br>这就是我们想要的结果吗？这只是服务器端送回来的SOAP消息，不过我们想要的结果在里面。。。<br><br><br>为了真正调用我们的Web服务，下面给出一个Client：<br><br>import&nbsp;org.apache.axis.client.Call;<br>import&nbsp;org.apache.axis.client.Service;<br>import&nbsp;javax.xml.namespace.QName;<br><br>&nbsp;&nbsp;public&nbsp;class&nbsp;test<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;[]&nbsp;args)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;=&nbsp;"http://192.168.0.1/test/services/sayHelloService";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;&nbsp;service&nbsp;=&nbsp;new&nbsp;Service();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(Call)&nbsp;service.createCall();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(&nbsp;new&nbsp;java.net.URL(endpoint)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(new&nbsp;QName("http://sayHelloService",&nbsp;"sayHelloTo"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ret&nbsp;=&nbsp;(String)&nbsp;call.invoke(&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;args[0]&nbsp;}&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;注意要配置好正确的classpath，确保编译器能找的到axis.jar和jaxrpc.jar，否则编译不会通过。<br>&nbsp;&nbsp;用下面的命令行运行这个class:<br>&nbsp;&nbsp;java&nbsp;test&nbsp;everybody<br>&nbsp;&nbsp;我们会得到：How&nbsp;are&nbsp;you,&nbsp;everybody<br><br>&nbsp;&nbsp;这才是我们真正想要的。。。<br><br><br><br>2.追根究底，我们的Web服务是怎样跑起来的<br>===============================================================================================<br><br><br>前面给出的两个配置文件web.xml和server-config.wsdd，或许不是能一下子就看懂的。<br><br>先让我们回顾一下servlet的映射模式。<br><br>我们知道，servlet是从javax.servlet.http.HttpServlet继承的，在服务器端被载入JVM执行，然后向客户端输出html流。<br>servlet的web.xml文件（位于&nbsp;webapps/foo/WEB-INF目录）：<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.2//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"&gt;<br>&lt;web-app&gt;<br>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;<br><br><br>invoker&nbsp;servlet&nbsp;其实是：org.apache.catalina.servlets.InvokerServlet<br>按类名提供小服务程序。例如，如果您调用&nbsp;foo/servlet/HelloServlet，<br>invoker&nbsp;servlet将装入该HelloServlet（如果它在其类路径中的话）并执行。<br><br>初看上面的web.xml，好像只给出了一个servlet映射，而没有定义invoker&nbsp;servlet。<br>其实，invoker&nbsp;servlet&nbsp;是在tomcat的conf目录中的web.xml中定义的：：<br>&nbsp;&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.catalina.servlets.InvokerServlet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;debug&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;0&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br><br>所以，如果抛开Tomcat_HOME/conf/web.xml，我们这样定义一个web.xml，似乎更能清楚的说明问题：<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.2//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"&gt;<br>&lt;web-app&gt;<br>&lt;servlet-name&gt;MyInvoker&lt;/servlet-name&gt;<br>&lt;servlet-class&gt;<br>org.apache.catalina.servlets.InvokerServlet<br>&lt;/servlet-class&gt;<br>&lt;init-param&gt;<br>&lt;param-name&gt;debug&lt;/param-name&gt;<br>&lt;param-value&gt;0&lt;/param-value&gt;<br>&lt;/init-param&gt;<br>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br>&lt;/servlet&gt;<br><br>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;MyInvoker&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;<br><br><br>即所有/servlet/*&nbsp;模式的url，都会交给org.apache.catalina.servlets.InvokerServlet来处理。<br>或者说，所有/servlet/*&nbsp;模式的url，其实都是调用InvokerServlet这个类，而InvokerServlet本身也是<br>一个servlet，它也是从&nbsp;HttpServlet&nbsp;继承而来的。<br><br>这样，我们自己的servlet就能够通过特定的url执行，即&nbsp;/servlet/OurServlet。<br>当然，如果你高兴，可以定义任何的&nbsp;url&nbsp;pattern，而不一定是&nbsp;/servlet/*，这一点，正如我们后面<br>看到的Axis处理Soap消息的方法。<br><br><br>再进一步，如果不想让&nbsp;InvokerServlet&nbsp;在中间&#8220;捣鬼&#8221;，我们当然可以直接定义自己的servlet:<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.2//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"&gt;<br>&lt;web-app&gt;<br>&lt;servlet-name&gt;MyInvoker2&lt;/servlet-name&gt;<br>&lt;servlet-class&gt;<br>com.foo.MyServlet<br>&lt;/servlet-class&gt;<br>&lt;/servlet&gt;<br><br>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;MyInvoker2&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;/AnyName/*&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;<br><br><br>JSP也是一样的道理，有了上面的分析，<br>看看Tomcat_HOME/conf/web.xml中的如下语句就可以JSP的处理方法了，这里就不再废话了：<br>....<br>&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;WARNING&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br>&lt;/servlet&gt;<br>&lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>....<br><br><br>下面进入正题。<br><br><br>我们先来看部署Web&nbsp;Service的web.xml：<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"?&gt;<br>&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.2//EN"&nbsp;"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"&gt;<br><br>&lt;web-app&gt;<br><br>&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Axis&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--实际servlet程序，这里是AxisServlet--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.axis.transport.http.AxisServlet&lt;/servlet-class&gt;<br>&lt;/servlet&gt;<br><br>&lt;!--&nbsp;###&nbsp;定义servlet和url的对应关系--&gt;<br><br>&lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;Axis&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br><br>&lt;/web-app&gt;<br><br><br>所有&nbsp;/services/*&nbsp;模式的&nbsp;url&nbsp;都会交给org.apache.axis.transport.http.AxisServlet处理，<br>AxisServlet当然也是从HttpServlet继承而来的。这就是为什么我们部署的Web服务在调用时都要在<br>服务名称前加上&nbsp;services/&nbsp;了。<br><br>可以说，AxisServlet是所有Web服务调用的入口。<br>那么AxisServlet在接手Web服务调用后都做了哪些工作呢？<br><br>客户端用call.invoke()调用web服务用的是POST，所以入口是AxisServlet.doPost...<br>而不是AxisServlet.doGet...<br><br><br>先来看看AxisServlet的doPost函数，这里只给出了关键语句及注释：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;/**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Process&nbsp;a&nbsp;POST&nbsp;to&nbsp;the&nbsp;servlet&nbsp;by&nbsp;handing&nbsp;it&nbsp;off&nbsp;to&nbsp;the&nbsp;Axis&nbsp;Engine.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Here&nbsp;is&nbsp;where&nbsp;SOAP&nbsp;messages&nbsp;are&nbsp;received<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;req&nbsp;posted&nbsp;request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;res&nbsp;respose<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;ServletException&nbsp;trouble<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException&nbsp;different&nbsp;trouble<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doPost(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;res)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;ServletException,&nbsp;IOException<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>msgContext&nbsp;=&nbsp;createMessageContext(engine,&nbsp;req,&nbsp;res);//获取客户请求信息<br><br>engine.invoke(msgContext);&nbsp;//调用客户端请求的服务<br><br>responseMsg&nbsp;=&nbsp;msgContext.getResponseMessage();//得到调用的返回结果<br><br>sendResponse(getProtocolVersion(req),&nbsp;contentType,&nbsp;res,&nbsp;responseMsg);//将结果送至客户端<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>这样一来，Web服务调用的来龙去脉就大致清楚了。。。<br><br>为了高清楚前面我们的三个url<br>http://192.168.0.1/test/services<br>http://192.168.0.1/test/services/sayHelloService?wsdl<br>http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&amp;aname=everybody<br>是怎样获得输出结果的，再来看看AxisServlet的doGet函数，这里只给出了流程框架及注释：<br><br>**<br>*&nbsp;Process&nbsp;GET&nbsp;requests.&nbsp;Because&nbsp;Axis&nbsp;does&nbsp;not&nbsp;support&nbsp;the&nbsp;GET-style<br>*&nbsp;pseudo&nbsp;execution&nbsp;of&nbsp;SOAP&nbsp;methods,&nbsp;this&nbsp;handler&nbsp;deals&nbsp;with&nbsp;queries<br>*&nbsp;of&nbsp;various&nbsp;kinds,&nbsp;not&nbsp;real&nbsp;SOAP&nbsp;actions.<br>*<br>*&nbsp;@todo&nbsp;for&nbsp;secure&nbsp;installations,&nbsp;dont&nbsp;stack&nbsp;trace&nbsp;on&nbsp;faults<br>*&nbsp;@param&nbsp;request&nbsp;request&nbsp;in<br>*&nbsp;@param&nbsp;response&nbsp;request&nbsp;out<br>*&nbsp;@throws&nbsp;ServletException<br>*&nbsp;@throws&nbsp;IOException<br>*/<br>public&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;res)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;ServletException,&nbsp;IOException<br>{<br><br>//如果路径为空，比如：http://localhost/wstk/services&nbsp;或&nbsp;http://localhost/wstk/services/*<br>if((pathInfo&nbsp;==&nbsp;null&nbsp;||&nbsp;pathInfo.equals(""))&nbsp;&amp;&amp;&nbsp;!realpath.endsWith(".jws"))<br><br>{<br>//从server-config.wsdd文件中读取所有部署的服务信息，向向客户端列出所有部署的服务，<br>//包括每个服务可调用的方法。<br><br>}else<br>//如果路径不为空，比如：http://localhost/wstk/services/sayHelloService<br>if(realpath&nbsp;!=&nbsp;null)<br>{<br>//如果请求wsdl，比如：http://localhost/wstk/services/sayHelloService?wsdl<br>if(wsdlRequested)<br>{<br>//创建sayHelloService的WSDL文件并传送至客户端<br>}&nbsp;else<br>//这里是利用url调用Web服务的入口，比如http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&amp;aname=everybody<br>if(req.getParameterNames().hasMoreElements())<br>{<br>//如果客户端调用的方法正确，则Axis会调用相应的JavaBean，并把JavaBean的返回结果<br>//封装为Soap消息流返回给客户端。<br>}<br>}<br>}<br><br><br>而Axis怎样找到我们所请求的JavaBean呢？答案是server-config.wsdd文件。<br><br>server-config.wsdd<br><br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;deployment&nbsp;xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&nbsp;xmlns="http://xml.apache.org/axis/wsdd/"&gt;<br><br>&lt;service&nbsp;name="sayHelloService"&nbsp;provider="java:RPC"&gt;<br>&nbsp;&nbsp;&lt;parameter&nbsp;name="className"&nbsp;value="sayHello"/&gt;<br>&nbsp;&nbsp;&lt;parameter&nbsp;name="allowedMethods"&nbsp;value="sayHelloTo"/&gt;<br>&lt;/service&gt;<br><br>&lt;handler&nbsp;type="java:org.apache.axis.handlers.http.URLMapper"&nbsp;name="URLMapper"/&gt;<br><br>&lt;transport&nbsp;name="http"&gt;<br>&nbsp;&nbsp;&lt;requestFlow&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;handler&nbsp;type="URLMapper"/&gt;<br>&nbsp;&nbsp;&lt;/requestFlow&gt;<br>&lt;/transport&gt;<br><br>&lt;/deployment&gt;<br><br>WSDD是web&nbsp;service&nbsp;deployment&nbsp;descriptor的缩写。<br><br>最外面的&lt;deployment&gt;元素指示这是WSDD，并定义了java的名字空间。<br><br>接着的&nbsp;&lt;service&gt;元素定义了service。一个service是一个目标链，包括请求request、内容提供者provider、响应response。<br>在这个例子中，我们指出service名字是sayHelloService&nbsp;，provider是"java:RPC"，它是axis&nbsp;的标记，指示这是一个java的RPC&nbsp;service，<br>而处理它的真正的class是org.apache.axis.providers.java.RPCProvider。<br><br>接着我们要在&lt;parameter&gt;中告诉RPCProvider，它如何实例化并调用正确的class（如：com.foo.MyService）。<br>&lt;parameter&gt;元素的className指示class名，allowedMethods告诉引擎那些共用的方法要通过soap来调用。<br>"*"表示所有的公共方法，我们也列出方法名字列表，可以空格或逗号分割它们。
<img src ="http://www.blogjava.net/boluobn/aggbug/134804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 22:23 <a href="http://www.blogjava.net/boluobn/articles/134804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>