﻿<?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-　　　　　　　　　　　　　礼物 ^_^ -文章分类-web service</title><link>http://www.blogjava.net/libin2722/category/25733.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Fri, 11 Sep 2009 04:43:21 GMT</lastBuildDate><pubDate>Fri, 11 Sep 2009 04:43:21 GMT</pubDate><ttl>60</ttl><item><title>(原)Axis2 OM 模式</title><link>http://www.blogjava.net/libin2722/articles/294572.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 10 Sep 2009 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/294572.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/294572.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/294572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/294572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/294572.html</trackback:ping><description><![CDATA[只是个简单的例子，能说明问题就行。<br />服务端：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> com.ws.server;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Iterator;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.xml.stream.XMLStreamException;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMElement;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMNode;<br /></span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> * @company LuckyStar 工作室<br /> *<br /> * @description Axis2 WebService 服务端 (OM模式)<br /> *<br /> * </span><span style="color: rgb(128, 128, 128);">@author</span><span style="color: rgb(0, 128, 0);"> 李彬<br /> *<br /> * @date 2009-8-12<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MyServer {<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> OMElement invoke(OMElement element) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> XMLStreamException{<br />        <br />        element.build();<br />        <br />        Iterator</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">OMNode</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> iterator </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> element.getChildElements();<br />        </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(iterator.hasNext()){<br />            OMNode node </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> iterator.next();<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (node.getType() </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> OMNode.ELEMENT_NODE) {<br />                OMElement omElement </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (OMElement)node;<br />                </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (omElement.getLocalName().equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">value</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)) {<br />                    String temp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> omElement.getText().trim();<br />                    System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Service Value1:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">temp);<br />                }</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(omElement.getLocalName().equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">value2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)){<br />                    String temp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> omElement.getText().trim();<br />                    System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Service Value2:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">temp);<br />                }<br />            }<br />        }<br />        <br />        element.detach();<br />        <br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> element;<br />    }<br />    <br />}<br /></span></div><br />服务端配置文件 META-INF/services.xml<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml version="1.0" encoding="utf-8"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">serviceGroup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">service </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="myservice"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">parameter </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="ServiceClass"</span><span style="color: rgb(255, 0, 0);"> locked</span><span style="color: rgb(0, 0, 255);">="false"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.ws.server.MyServer</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">parameter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">operation </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="invoke"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">messageReceiver </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">messageReceiver</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">actionMapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">urn:invoke</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">actionMapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">operation</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">service</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">serviceGroup</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br />打包（aar包）放入%tomcat_home%/webapps/axis2/WEB-INF/service下，然后启动服务就oK了<br /><br />下面是客户端<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> com.ws.client;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.xml.namespace.QName;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMAbstractFactory;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMElement;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMFactory;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axiom.om.OMNamespace;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axis2.AxisFault;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axis2.addressing.EndpointReference;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axis2.client.Options;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.apache.axis2.rpc.client.RPCServiceClient;<br /></span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> * @company LuckyStar 工作室<br /> *<br /> * @description Axis2 WebService 客户端 (OM模式)<br /> *<br /> * </span><span style="color: rgb(128, 128, 128);">@author</span><span style="color: rgb(0, 128, 0);"> 李彬<br /> *<br /> * @date 2009-8-12<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> WsTest {<br />    <br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> OMElement getInvokeOMElement(){<br />        OMFactory factory </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> OMAbstractFactory.getOMFactory();<br />        OMNamespace namespace </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.createOMNamespace(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.liwu.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">liwu</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        OMElement method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.createOMElement(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">invoke</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,namespace);<br />        OMElement value </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.createOMElement(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">value</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,namespace);<br />        value.addChild(factory.createOMText(value, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello terry!!!</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />        <br />        OMElement value2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.createOMElement(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">value</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,namespace);<br />        value2.addChild(factory.createOMText(value2, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello wuxin!!</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />        <br />        method.addChild(value);<br />        <br />        method.addChild(value2);<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> method;<br />    }<br />    <br />    @SuppressWarnings(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">unchecked</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />        EndpointReference endpointReference </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> EndpointReference(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://localhost/axis2/services/myservice</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        OMElement method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getInvokeOMElement();<br />        Options options </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Options();<br />        options.setTo(endpointReference);<br />        ServiceClient client;<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            client </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ServiceClient();<br />            client.setOptions(options);<br />            OMElement value </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> client.sendReceive(method);<br />            System.out.println(value);<br />            System.out.println();<br />            Iterator</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">OMNode</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> iterator </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> value.getChildElements();<br />            </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(iterator.hasNext()){<br />                OMNode node </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> iterator.next();<br />                </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (node.getType() </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> OMNode.ELEMENT_NODE) {<br />                    OMElement omElement </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (OMElement)node;<br />                    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (omElement.getLocalName().equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">value</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)) {<br />                        String temp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> omElement.getText().trim();<br />                        System.out.println(temp);<br />                    }<br />                }<br />            }<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (AxisFault e) {<br />            e.printStackTrace();<br />        }<br />    }<br />}<br /></span></div><br /><br /><br /><br /><img src ="http://www.blogjava.net/libin2722/aggbug/294572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-09-10 13:33 <a href="http://www.blogjava.net/libin2722/articles/294572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Web Service Appender for Log4j 管理日志纪录</title><link>http://www.blogjava.net/libin2722/articles/286831.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 15 Jul 2009 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/286831.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/286831.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/286831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/286831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/286831.html</trackback:ping><description><![CDATA[
		<blockquote>使用定制的 Web Service Appender for Log4j 将日志信息发送到某一集中位置。Log4j Appender 使您可以在面向服务架构 (SOA) 解决方案中调试和跟踪任意问题。</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="N1005E">
						<span class="atitle">引言</span>
				</a>
		</p>
		<p>你
可以使用 Web Service Appender 将日志集中到某一位置，同时，Web Service Appender
允许管理者监控、开发者调试面向服务架构(SOA)环境里可能存在的任何问题。Web Service Appender 是一种扩展 JAVA
类，它由 Log4j 的 Appender 类扩展而来。</p>
		<p>
从定义上看，SOA
是一种彼此可以互相通信的服务集合，但这些服务的内容是各自独立的，每一类服务均不受其它服务内容或服务状态的影响，并且这些服务都工作在分布式的系统架
构里。在 SOA 中，Web 服务通常被用来在给定事务中处理请求，这些请求可以是遗留代码、企业级 Java Beans(EJBs)
的封装，也可以是 Java
类的封装，使用一种可以将日志信息聚集在中心位置里的日志纪录方法，能帮助您隔离缺陷和问题，并能让你更好的理解逻辑流的处理。 </p>
		<p>
将特定模块或服务的日志消息纪录到一个中心位置的机制，可以把可能潜在的问题和缺陷降低到最小。</p>
		<p>本文对 Log4j 的功能进行了大体的概述，并介绍了如何编写自定义的 Log4j Appender，这类特殊的 Appender 将日志消息编到一种特定的 Web 服务。</p>
		<br />
		<table border="0" cellpadding="0" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td>
										<img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" />
										<br />
										<img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" align="right" cellpadding="0" cellspacing="0">
				<tbody>
						<tr align="right">
								<td>
										<img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" />
										<br />
										<table border="0" cellpadding="0" cellspacing="0">
												<tbody>
														<tr>
																<td valign="middle">
																		<img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" />
																		<br />
																</td>
																<td align="right" valign="top">
																		<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10071">
						<span class="atitle">Log4j 快速入门</span>
				</a>
		</p>
		<p>Log4j
是一种开放源代码的日志库，它已被发展为 Apache Software Foundation 日志服务项目的子项目。该库是以 IBM 在 90
年代末开发的日志库为基础的，第一版发布于 1999 年。现在它在开放源代码团体得到了广泛使用，它的体系是围绕以下三个主要概念构建起来的：</p>
		<ul>
				<li>Logger</li>
				<li>Appender</li>
				<li>Layout</li>
		</ul>
		<p>这些概念可以让您根据消息类型、消息优先级来纪录消息，您可以控制消息在何处结束及消息如何格式化。
Logger 是应用程序首先调用以初始化消息纪录的对象。当把某一消息传递给日志时，logger 会生成 <code>LoggingEvent</code>，对消息进行封装。之后，Logger 对象将 <code>LoggingEvent</code> 传递给与之关联的 Appender。</p>
		<p>Appender 将 <code>LoggingEvent</code> 所包含的消息发送给指定的目标输出文件。所谓指定的文件，大多数情况下，是 Log4 属性文件。一些 Appender 存在于 Log4j 中。您也可以扩展 Appender，使之支持其它的目标文件，比如 XML 文件、控制台等等。</p>
		<p>在 Log4j 里， <code>LoggingEvent</code> 被赋予某一级别，以表明它们的优先级。缺省的级别包括如下几种：
			</p>
		<ul>
				<li>OFF：可能是最高的级别，它是用来关闭日志纪录的</li>
				<li>FATAL：指出现了非常严重的错误事件，这些错误可能会导致应用程序异常中止</li>
				<li>ERROR：指虽有错误，但仍允许应用程序继续运行</li>
				<li>WARN：指运行环境潜藏着危害</li>
				<li>INFO：指报告信息，这些信息在粗粒度级别上突出显示应用程序的进程</li>
				<li>DEBUG：指细粒度信息事件，细粒度信息事件对于应用程序的调试是最有用的</li>
				<li>ALL：可能是最低的级别，其目的是打开所有日志记录</li>
		</ul>Logger 和 Appender 也被赋予上述的某一级别，并且仅执行等于或高于它们自身的级别的日志请求。比如，如果一个 Appender 属于 INFO 级别，而日志请求属于 DEBUG，那么 Appender 将不会为给定的日志事件写消息。
			
			<br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100B7"><span class="atitle">客户端组件</span></a></p><p><a name="N100BD"><span class="smalltitle">客户端 log4j.properties 文件</span></a></p><p> 客户端 log4j.properties 文件是一种标准文件，它包含服务或模块使用的所有 Appender。Web Service Appender 要求有一个<i>端点（endpoint）</i> 属性以指定所使用的日志服务。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing1">清单 1</a> 描述了使用 <code>WebServiceAppender</code> 所必需的 Web 服务客户端 Log4j 属性。 黑体显示的文本指明了将访问 <code>WebServiceAppender</code> 服务器端的 Appender。属性文件是使用 Log4j 的基本需求，它可以让您配置应用程序以使用多个 Appender 以及 logging severity。一旦应用程序进入运行状态或潜在的问题得到解决，您就可以轻松地修改属性文件。</p><br /><a name="listing1"><b>清单 1：客户端 Log4j 的属性文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, CONSOLE<br />#set own logger<br />log4j.logger.com.carmelouria.logging.test=CONSOLE<br />log4j.appender.CONSOLE=com.carmelouria.logging.WebServiceAppender<br /><span class="boldcode">log4j.appender.CONSOLE.endpoint=<br />         http://localhost:9080/log4j/services/LogAppenderService</span><br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.CONSOLE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100E6"><span class="atitle">服务器的 Log4j.properties 文件</span></a></p><p>服
务器 Log4j.properties 文件被用来关联客户端 Log4j 属性文件，它指定了日志的级别及服务器将如何输出消息。对于支持
Log4j 的应用程序，您可以定义多个 appender。当然，这些 appender 既可以用于客户端服务，也可以用于服务模块。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing2">清单 2</a> 描述了一份典型的 Log4j 属性文件，服务器端的 <code>WebServiceAppender</code> 使用缺省的 Log4j Appenders。服务器端的 Appender 可以潜在的调用另一个 <code>WebServiceAppender</code>，并将日志信息<i>链接</i>起来：</p><br /><a name="listing2"><b>清单 2：服务器端的 Log4j 属性文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, FILE<br />#set own logger<br />log4j.appender.FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.file=c:/temp/log4j/server/server.log<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><p><a name="N1010C"><span class="smalltitle">客户端程序测试示例：</span></a></p><p>这个客户端程序示例是无格式普通 Java 对象(POJO)，它记录了一条消息，并被配置为使用 Web Service Appender 来处理消息。<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing3">清单 3</a> 显示了这个示例：</p><br /><a name="listing3"><b>清单 3：客户端应用程序使用 WebServiceAppender 的示例</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />package com.carmelouria.logging.test;<br />import org.apache.log4j.Level;<br />import org.apache.log4j.Logger;<br />import org.apache.log4j.PropertyConfigurator;<br />/**<br /> * @author Carmelo Uria<br /> *<br />*/<br />public class LoggingSample<br />{<br />    private static Logger logger = Logger.getLogger(LoggingSample.class.getName());<br />    /**<br />     * <br />     */<br />    public LoggingSample()<br />    {<br />        super();<br />        PropertyConfigurator.configure("c:/temp/log4j.properties");<br />        logger.log(Level.INFO, "LoggingSample instantiation...");<br />        System.out.println("finished...");<br />    }<br />    public static void main(String[] args)<br />    {<br />        LoggingSample sample = new LoggingSample();<br />    }<br />}<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10124"><span class="atitle">WebServiceAppender</span></a></p><p><code>WebServiceAppender</code> 是必需的，它可以将消息发送到指定的 Web 服务。<code>WebServiceAppender</code> 继承了 org.log4j.Appender，它允许使用 log4.properties，并成为有效的 Log4j Appender。</p><p>WebServiceAppender
使用基于 XML 的远程过程调用 (JAX-RPC) 的 Java API，来将消息发送到服务器。JAX-RPC 是一种规范，它描述使用
RPC 和 XML 构建 Web 服务和 Web 服务客户端的应用编程接口 (API) 和约定。JAX-RPC 又被称为 JSR 101。</p><p><code>LoggingEvent</code> 通过 <code>SOAPElement</code> 被分割并表示为 XML。javax.xml.soap.SOAPElement 接口意味着服务端点接口将包含一个参数，或返回 javax.xml.soap.SOAPElement 类型的值，以对应于 schema 中每个使用<code>&lt;xsd:any/&gt;</code>的地方。从本质上看，它是 XML 参数的封装，且没有相应的序列化/反序列化 JAVA 类。例如，一旦客户请求记录一个消息，就会创建一个 <code>LoggEvent</code> 对象，然后传送给 Appender。在这种情况下，Appender 就是 <code>WebServiceAppender</code>。Appender 检索事件，并在解析事件中的信息。一些额外的信息会被加入，如主机名称，这样您就知道这些消息来自哪个系统。同时，append 方法也将消息转换为 <code>SOAPElement</code>，这样就可以通过 <code>executeWebService</code> 方法将消息传递给 Web 服务。使用 <code>SOAPElement</code> 充分考虑了 <code>WebServiceAppender</code> 未来版本的可扩展性问题。</p><br /><a name="listing4"><b>清单4：执行 WebServiceAppender 服务的 Append 方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    protected void append(LoggingEvent event)<br />    {<br />        // create Web Service client using endpoint<br />        if (endpoint == null)<br />        {<br />            System.out.println("no endpoint set.  Check configuration file");<br />            System.out.println("[" + hostname + "] " + this.layout.format(event));<br />            return;<br />        }<br />        executeWebService(event);<br />    }<br />    private void executeWebService(LoggingEvent event)<br />    {<br />        SoapClient client = new SoapClient();<br />        URL endPoint = null;<br />        try<br />        {<br />            endPoint = new URL(getendpoint());<br />        }<br />        catch (MalformedURLException e1)<br />        {<br />            e1.printStackTrace();<br />        }<br />        String nameSpace = "http://ejb.logging.carmelouria.com";<br />        QName serviceName = new QName(nameSpace, "LogAppenderServiceService");<br />        QName operation = new QName(nameSpace, "log");<br />        QName port = new QName(nameSpace, "LogAppenderService");<br />        Parameter message = <br />        new Parameter("log", Constants.XSD_ANY, SOAPElement.class, ParameterMode.IN);<br />        try<br />        {<br />            /**<br />             *create SOAPElement from LoggingEvent need hostname<br />             */<br />            Level level = event.getLevel();<br />            String sysLog = "&lt;syslog&gt;" + new Integer(level.getSyslogEquivalent()).toString()<br /><!-- code sample is too wide -->                                      + "&lt;/syslog&gt;";<br />            String startTime = new Long(LoggingEvent.getStartTime()).toString();<br />            String timeTag = "&lt;start_time&gt;" + startTime + "&lt;/start_time&gt;";<br />            String hostName = "&lt;hostname&gt;" + InetAddress.getLocalHost() +<br />                                           "&lt;/hostname&gt;";<br />            String threadName = "&lt;thread_name&gt;" + event.getThreadName()<br />                                            +"&lt;/thread_name&gt;";<br />            String logger = "&lt;logger&gt;" + event.getLoggerName() + "&lt;/logger&gt;";<br />            String eventMessage = "&lt;message&gt;" + event.getRenderedMessage() +<br />                                                  "&lt;/message&gt;";<br />            String log = hostName + threadName + logger + timeTag + sysLog +<br />                                eventMessage;<br />            String throwableInformation[] = event.getThrowableStrRep();<br />            if (throwableInformation != null)<br />            {<br />                for (int i = 0; i &lt; throwableInformation.length; i++)<br />                {<br />                    String throwable = "&lt;throwable_information&gt;" + throwableInformation[i] +<br /><!-- code sample is too wide -->                                                   "&lt;/throwable_information&gt;";<br />                    log += throwable;<br />                }<br />            }<br />            String ndcString = event.getNDC();<br />            if (throwableInformation != null)<br />            {<br />                String throwable = &lt;ndc&gt;" + ndcString + &lt;/ndc&gt;";<br />                log += throwable;<br />            }<br />            message.setValue(SOAPElementFactory.create(&lt;log&gt;" + log + &lt;/log&gt;"));<br />        }<br />        catch (UnknownHostException unknownHostException)<br />        {<br />            unknownHostException.printStackTrace();<br />        }<br />        catch (SOAPException e2)<br />        {<br />            e2.printStackTrace();<br />        }<br />        Parameter resultType = newParameter("logResponse",<br />                                        Constants.WEBSERVICES_VOID,<br />                                        Object.class,<br />                                         ParameterMode.OUT);<br />        Parameter[] parameters = { message };<br />        try<br />        {<br />            // execute client<br />            Object result = <br />            client.execute(endPoint, serviceName, operation, "wrapped", null,<br />                                                            port, resultType, parameters);<br />            if ((result != null) &amp;&amp; (result instanceof String))<br />                System.out.println((String) result);<br />        }<br />        catch (ClientException e)<br />        {<br />            e.printStackTrace();<br />        }<br />    }<br /></pre></td></tr></tbody></table><br /><p><a name="N1016A"><span class="smalltitle">Hostname</span></a></p><p>不幸的是，Log4j 的 <code>LoggingEvent</code> 没有包含 Hostname，而 Hostname 是 Web Service Appender 众多需求之一。在创建 <code>SOAPElement</code> 以前，您可以用下面的语句将 Hostname 添加到 XML 文件里：</p><p><code>String hostName = "&lt;hostname&gt;" + InetAddress.getLocalHost() + "&lt;/hostname&gt;";</code></p><p><a name="N10182"><span class="smalltitle">SoapElementFactory</span></a></p><p><code>SoapElementFactory</code> 是主要用于创建 <code>SOAPElement</code> 的类。它同时支持创建 IBM 和 Java 的 <code>SOAPElement</code> 实现，如<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing5">清单 5</a> 所示：</p><br /><a name="listing5"><b>清单 5：使用 SoapElementFactory 类的创建方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    public static javax.xml.soap.SOAPElement create(String xml) throws SOAPException<br />    {<br />        com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory factory =<br />        (com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory) <br />        com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory<br />                .newInstance();<br />        SOAPElement element =<br />                  (javax.xml.soap.SOAPElement)factory.createElementFromXMLString(xml);<br />        return(element);<br />    }<br />    public static SOAPElement create(String arg0, String arg1, String arg2, <br />                                                            boolean ibmSoapElement) throws <br /><!-- code sample is too wide -->                                                            SOAPException<br />    {<br />        if (ibmSoapElement)<br />        {<br />            SOAPFactory soapFactory =<br />              (com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory)<br />              com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory.newInstance();<br />            return (soapFactory.createSOAPElement(arg0, arg1));<br />        }<br />        javax.xml.soap.SOAPFactory soapFactory =<br />                        javax.xml.soap.SOAPFactory.newInstance();<br />        return (soapFactory.createElement(arg0, arg1, arg2));<br />    }<br /></pre></td></tr></tbody></table><br /><p><a name="N101A5"><span class="smalltitle">SoapClient</span></a></p><p><code>SoapClient</code> 类封装了 <code>Call</code> 接口的 JAX-RPC 实现，javax.xml.rpc.Call 接口提供了对服务端点动态调用的支持。javax.xml.rpc.Service 接口就好象是创建 <code>Call</code> 实例的工厂。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing6">清单 6</a> 说明了客户端如何动态调用服务。这允许对服务进行变更，而无需生成客户端代理来访问远程服务。</p><br /><a name="listing6"><b>清单 6：使用 SoapClient 类的调用方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    private Object call(SoapService service, QName operation, QName portType, <br />    String operationStyleProperty,<br />            String encodingURIProperty, Parameter returnType, <br />            Parameter[] parameters) throws ClientException<br />    {<br />        QName portName;<br />        String response = null;<br />        Object results = null;<br />        Call call = null;<br />        try<br />        {<br />            // check to see if Service object exists<br />            if (service == null)<br />                throw new ClientException("Invalid Service object.  It maybe null.");<br />            // retrieve call from Service object<br />            call = service.createCall();<br />            call.setOperationName(operation);<br />            call.setPortTypeName(portType);<br />            // check call object<br />            if (call == null)<br />                throw new ClientException("invalid operation.  Call object is null.");<br />            // set default values<br />            if (operationStyleProperty == null)<br />                call.setProperty(Call.OPERATION_STYLE_PROPERTY,<br />                                          OPERATION_STYLE_DOCUMENT_TYPE);<br />            else<br />                call.setProperty(Call.OPERATION_STYLE_PROPERTY,<br />                                          operationStyleProperty);<br />            if (encodingURIProperty == null)<br />                call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,<br />                                          ENCODING_LITERAL);<br />            else<br />                call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY,<br />                                           encodingURIProperty);<br />            call.setTargetEndpointAddress(service.getServiceEndPoint());<br />            //create Parameter class for SoapClient<br />            for (int i = 0; i &lt; parameters.length; i++)<br />            {<br />                Class classObject = parameters[i].getClassObject();<br />                if (classObject != null)<br />                    call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),<br />                            parameters[i].getClassObject(), parameters[i].getMode());<br />                else<br />                    call.addParameter(parameters[i].getName(), parameters[i].getXmlType(),<br />                             parameters[i].getMode());<br />            }<br />            // pass parameter as ReturnType<br />            if (returnType != null)<br />            {<br />                if (returnType.getClassObject() != null)<br />                 call.setReturnType(returnType.getXmlType(), returnType.getClassObject());<br />                else<br />                 call.setReturnType(returnType.getXmlType());<br />            }<br />            Object[] request = new Object[parameters.length];<br />            // add parameter values<br />            for (int i = 0; i &lt; request.length; i++)<br />            {<br />                request[i] = parameters[i].getValue();<br />            }<br />            results = call.invoke(request);<br />        }<br />        catch (SOAPFaultException e)<br />        {<br />            System.out.println(e.getFaultString());<br />            e.getStackTrace();<br />            throw new ClientException(e.getLocalizedMessage(), e);<br />        }<br />        catch (ServiceException serviceException)<br />        {<br />            serviceException.getStackTrace();<br />            throw new ClientException(serviceException.getLocalizedMessage(),<br />                                                         serviceException);<br />        }<br />        catch (RemoteException exception)<br />        {<br />            exception.printStackTrace();<br />            throw new ClientException(exception.getLocalizedMessage(), exception);<br />        }<br />        return (results); }<br /></pre></td></tr></tbody></table><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101CB"><span class="atitle">服务组件</span></a></p><p><a name="N101D1"><span class="smalltitle">Log4j.server.properties</span></a></p><p>Log4j.server.properties 文件包含了一个基本的 Log4j 配置文件，该文件可以让您指定把哪些日志发送给 Web 服务系统。</p><br /><a name="listing7"><b>清单 7：Log4j.server.properties 文件</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />#set the level of the root logger <br />log4j.rootLogger = INFO, FILE<br />#set own logger<br />log4j.appender.FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.FILE.file=c:/temp/log4j/server/server.log<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=%p [%t] %c{2} (%M:%L) :: %m%n<br /></pre></td></tr></tbody></table><br /><p><a name="N101E4"><span class="smalltitle">LogAppenderBean.java</span></a></p><p>LogAppenderBean.java 是 Web Service Appender 服务所要使用的 EJB。该服务启动 <code>LogAppenderBean</code> 以处理来自每个 Web Service Appender 客户端的每一个请求。</p><p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#listing8">清单 8</a> 显示了来自 <code>WebServiceAppender</code> EJB 的 <i>log</i> 方法，该方法解析来自客户端的消息，并将客户端信息纪录到服务的服务器端。</p><br /><a name="listing8"><b>清单 8：LogAppenderBean 的 log 方法</b></a><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode"><br />    public void log(SOAPElement message)<br />    {              <br />        try<br />        {<br />            InputSource source = ((IBMSOAPElement)<br />                                    message).toInputSource(false);<br />            Document document = Parser.parse(source);<br />            String log = null;<br />            String hostname =<br />                 document.selectSingleNode("//hostname").getText();<br />            String threadName =<br />                 document.selectSingleNode("//thread_name").getText();<br />            String syslog =<br />                 document.selectSingleNode("//syslog").getText();<br />            String startTime = new Long(<br />                             document.selectSingleNode("//start_time").<br />                             getText()).toString();<br />            log = '[' + startTime + ':' + hostname + ':' + threadName +<br />                  "] " + document.selectSingleNode(<br />                         "//message").getText();<br />            // retrieve any throwable messages<br />            List throwableList = document.selectNodes(<br />                                 "//throwable_information");<br />            if(throwableList != null)<br />            {<br />                Iterator throwables = throwableList.iterator();<br />                while(throwables.hasNext())<br />                {<br />                    log += '\n' + ((Node)throwables.next()).getText();<br />                }<br /><br />                log += '\n';<br />            }<br /><br />            logger.log(Level.toLevel(new Integer(syslog).intValue()),<br />                       log);<br />            logger.log(Level.INFO,log);<br />         }<br />        catch(ParserException parseException)<br />        {<br />            parseException.printStackTrace();<br />        }<br />        catch (SAXException e)<br />        {<br />            e.printStackTrace();<br />        }<br />    }<br /></pre></td></tr></tbody></table><br /><p>通过 IBM <code>SOAPElement</code> 的 InputSource，每一个 <code>SOAPElement</code> 的内容都会被检索。目前，只有 IBM WebSphere® Application Server (Application Server) 支持这些代码（请参阅<a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#resources">参考资料</a>）。 然而，如果您移除 IBM <code>SOAPElement</code>，那么您就可以在任何应用服务器上使用这些代码。IBM
<code>SOAPElement</code> 内置的性能优化也适用于 Application Server。</p><p>每一个 <code>SOAPElement</code>
都使用 Dom4j 来读取、解析和转换。Dom4j 是一种在内存中表示 XML 树的对象模型。Dom4j 提供了一组易于使用的
API，从而为我们提供了一整套强大的功能来处理、操作或定位 XML，使用 XPath 和 XSLT 进行工作，以及与 SAX、
JAXP、DOM 集成。</p><p>除了可以使用任意的 XML 解析器外，DOM4J 还允许使用任意的 SAX 解析器，为实现更好的性能，还允许使用所有标准的 XSLT 转换器。
转换被用来析取发送给 Web Service Appender 的客户端 <code>LoggingEvent</code> 的元素。</p><p>如果您允许使用 <code>SOAPElement</code>，那么就需要在代码中维持最大限度的灵活性。Web Service Appender 服务可以被修改，以支持所有发送给服务的 XML。
</p><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10235"><span class="atitle">输出</span></a></p><p>下面的示例展示了 Web Service Appender 的可能的输出：</p><p><code>INFO [WebContainer : 0] ejb.LogAppenderBean (log:?) :: [1111513482641:OO7-64BIT/9.48.114.183:main]LoggingSample instantiation...</code></p><p><b>OO7-64BIT/9.48.114.183</b> 是机器名和 IP 地址，而 <b>main</b> 是日志所在处的方法名。</p><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1024E"><span class="atitle">结束语</span></a></p><p>Web
Service Appender 是将日志集中到某一位置的基本工具。由于 Web Service Appender 是 Log4j 的
Appender 类的子集，因而配置和使用 Appender 都非常简单易懂。您可以修改 Log4j 的属性文件，这样，使用 Log4j
的现有应用程序和服务就可以马上使用 Web Service Appender。</p><br /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="8" height="6" /></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" border="0" width="16" height="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-log4j.html#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><span class="atitle"><a name="download">下载</a></span></p><table class="data-table-1" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><th scope="col">描述</th><th scope="col">名字</th><th scope="col">大小</th><th scope="col">下载方法</th></tr><tr><th class="tb-row" scope="row">Foundation Class Library</th><td nowrap="nowrap">foundation.zip</td><td nowrap="nowrap">47 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/foundation.zip"><b>HTTP</b></a></td></tr><tr><th class="tb-row" scope="row">Logging Web Service J2EE Application</th><td nowrap="nowrap">LoggingWebService.ear</td><td nowrap="nowrap">1976 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/LoggingWebService.ear"><b>HTTP</b></a></td></tr><tr><th class="tb-row" scope="row">Unit Test Sample Code</th><td nowrap="nowrap">SoapClientTest.java</td><td nowrap="nowrap">5 KB</td><td nowrap="nowrap"><a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/ws-log4jcode/SoapClientTest.java"><b>HTTP</b></a></td></tr></tbody></table><img alt="" src="http://www.ibm.com/i/c.gif" border="0" width="12" height="12" /><img src ="http://www.blogjava.net/libin2722/aggbug/286831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-07-15 11:49 <a href="http://www.blogjava.net/libin2722/articles/286831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创)用Axis2写的通用WebService组件</title><link>http://www.blogjava.net/libin2722/articles/250431.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 07 Jan 2009 18:25:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/250431.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/250431.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/250431.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/250431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/250431.html</trackback:ping><description><![CDATA[1、在%TOMCAT_HOME%\webapps中放入axis2.war，这个可以在www.apache.org下载<br />
2、启动Tomcat，将该war包解开<br />
3、服务端代码<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ByteArrayInputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ByteArrayOutputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ObjectInputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ObjectOutputStream;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;@company&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;*<br />
&nbsp;*&nbsp;@description&nbsp;<br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Terry.B.Li<br />
&nbsp;*<br />
&nbsp;*&nbsp;@date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2009.1.7<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;WSServer&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;invoke(String&nbsp;id,&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">id:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;id);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;params&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;byteConvertObj(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">参数：</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Object&nbsp;param&nbsp;:&nbsp;params)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(param.getClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;通过&nbsp;Axis2&nbsp;反射调用返回的对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;resultObj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">返回值</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">根据功能号&nbsp;ID&nbsp;解析调用方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;arrayOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;objectOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectOutputStream(arrayOutputStream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream.writeObject(resultObj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arrayOutputStream.toByteArray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Object[]&nbsp;byteConvertObj(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;byteArrayInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;objectInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteArrayInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayInputStream(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectInputStream(byteArrayInputStream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Object[])&nbsp;objectInputStream.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
4、将该代码编译后放入%TOMCAT_HOME%\webapps\axis2\WEB-INF\pojo下<br />
5、客户端代码如下<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.newegg.lab.ws.client;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ByteArrayInputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ByteArrayOutputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ObjectInputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.ObjectOutputStream;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.xml.namespace.QName;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis2.addressing.EndpointReference;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis2.client.Options;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis2.rpc.client.RPCServiceClient;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.logging.Log;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.logging.LogFactory;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;WSClient&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">8513162370253557533L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Log&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogFactory.getLog(WSClient.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;EndpointReference&nbsp;endpointReference&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;EndpointReference(</span><span style="color: #000000;">"</span><span style="color: #000000;">http://localhost:8080/axis2/services/WSServer</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;String&nbsp;namespace&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://ws.apache.org/axis2</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(invoke(</span><span style="color: #000000;">"</span><span style="color: #000000;">123456</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">aaa</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">得到的的</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">埃担罚埃担罚</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">34</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WSClient()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000;">"</span><span style="color: #000000;">OK</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(String&nbsp;id,Object<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;params){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RPCServiceClient&nbsp;serviceClient&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RPCServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Options&nbsp;options&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;serviceClient.getOptions();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setTo(endpointReference);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QName&nbsp;qname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;QName(namespace,</span><span style="color: #000000;">"</span><span style="color: #000000;">invoke</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;clz&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Class[]{</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[].</span><span style="color: #0000ff;">class</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;_params&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Object[]{id,objConvertByte((Object[])params)};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;serviceClient.invokeBlocking(qname,&nbsp;_params,&nbsp;clz);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[])&nbsp;results[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;byteConvertObj(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;objConvertByte(Object&nbsp;obj){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;byteArrayOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;objectOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteArrayOutputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectOutputStream(byteArrayOutputStream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream.writeObject(obj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;byteArrayOutputStream.toByteArray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectOutputStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteArrayOutputStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;byteConvertObj(</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;byteArrayInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;objectInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteArrayInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayInputStream(bytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectInputStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectInputStream(byteArrayInputStream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;objectInputStream.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
6、将客户端代码打包放入%TOMCAT_HOME%\webapps\axis2\WEB-INF\lib下<br />
7、启动Tomcat<br />
8、测试访问：<span style="color: #000000;">http://localhost:8080/axis2/services/WSServer?wsdl<br />
9、执行客户端代码<br />
</span><br />
<img src ="http://www.blogjava.net/libin2722/aggbug/250431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-01-08 02:25 <a href="http://www.blogjava.net/libin2722/articles/250431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webservice 的设计和模式 </title><link>http://www.blogjava.net/libin2722/articles/250014.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Mon, 05 Jan 2009 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/250014.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/250014.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/250014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/250014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/250014.html</trackback:ping><description><![CDATA[<div class="postbody">
<div>本文是篇译文（原文在<a href="http://www.devx.com/enterprise/Article/10397" target="_blank">devx</a>），对于想初步了解webservice的朋友可能有些帮助。<br />
<br />
Webservice 作为一项新的技术出现在我们面前，它的出世是用于解决在不同的平台下的应用的协同的。目前几乎每家厂商都要去开发Webservice 应用，然而如果缺乏对Webservice更深的了解，不能很好的在设计阶段处理好一些重要的问题，那么最终完成的系统必然是效率低下，没有可靠性的产品。 </div>
<div>&nbsp;</div>
<div>在设计Webservice 应用时，以下几点务必要考虑到：</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 管理好与外系统的协同关系</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 掌握底层的传输模型</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提供与应用相适应的安全策略</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计划好部署的相关事项</div>
<div>&nbsp;</div>
<div>以下，将就这几条相关的设计需求和一些常用模式是如何应用于Webservice模型展开详细讨论。在讨论中，你会发现Webservice这项新的技术是如何与我们在以往的软件开发相结合的。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准提供了协同的能力</div>
<div>&nbsp;</div>
<div>Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。</div>
<div>为了使得一个公司的网络应用达到最高的效率，存在它自己和它的合作伙伴，供应商以及客户之间的Webservice，应该能够实现无缝的交互。如果在众多的Webservice之间不能轻松的实现交互，那么该应用的效率将大打折扣。但是，在现实中这种情况是极有可能出现的。由于各个公司对业务的理解各不相同，就是理解相同的情况下，对于相同的概念也可能用不同的形式加以表现，具体而言就是对于同一数据可能采取不同的xml表示。由于以上的原因，对于协同性的问题应该在设计应用架构时就加以考虑，而不是留待以后去改变。</div>
<div>&nbsp;</div>
<div>Webservice 主要由以下几块技术所构成，SOAP (Simple Object Access Protocol), WSDL (Web service Description Language), 以及UDDI (Universal Description, Discovery and Integration)。</div>
<div>&nbsp;</div>
<div></div>
<div>在这里我们不会去详细研究这些技术，而是揭示他们的一些重要特性，这些特性需要在Webservice的设计时详加考虑。</div>
<div>&nbsp;</div>
<div>WSDL是实现协同能力的关键，它提供了一份契约用于与新老的应用之间交互。这项技术使得各个组织可以将标准的制定集中在Service的外部接口，而不用考虑各组织的具体实现。简而言之，它实现了Webservice的接口与实现的分离。从而使得标准的制定，更加容易。并且，基于这份接口描述，很多工具可以从中自动生成客户端代码，减少了开发者的工作量，并使得大部分开发者摆脱了编写SOAP消息传递代码过程。</div>
<div>&nbsp;</div>
<div>SOAP是实现在各个Webservice组件之间传递消息的传输层。因此，SOAP应该是一项透明的协同技术。但是，由于很多的SOAP实现方法却与标准背道而驰，要么添加了新的扩展功能要么删减了一些标准功能。由于对SOAP标准的支持程度不同，使得Webservice的协同能力大打折扣，实现协同的困难加大了。基于这种情况，当开发者需要Webservice运行在不同平台上时，就要对具体情况加以了解并相应的编码以解决这种不一致性。如果所有的SOAP实现组织都能够遵循标准的话，那么Webservice的开发者就不需要考虑使用该Webservice的底层平台了。</div>
<div>&nbsp;</div>
<div>尽管如此，不同SOAP实现的协同还是相当困难，因为协同标准的制定存在大量的分歧，目前一些组织正致力于标准的制定，比如<a href="http://www.soapbuilders.org/">SOAP Builders</a> 和 <a href="http://www.ws-i.org/">WS-I</a>。然而，现在Webservice开发者只有针对不同平台，给予不同的实现，使得开发的成本和负担加大了。 </div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解传输模型</div>
<div>&nbsp;</div>
<div>SOAP并不是完全透明的解决方案，它把一些复杂的实现细节隐藏起来。Webservice的开发者必须深入的了解SOAP，了解底层的传输机制以及模型,从而知道SOAP是如何实现的。在一些简单的应用中，某些工具可以帮助Webservice的开发者生成SOAP消息传递的代码，但是这只在最简单的应用中有效。真正的情况不可能那么简单，可能在某些方面你需要有特殊的处理（这种情况在实际开发中是很常见的），这个时候，你就需要直接操纵SOAP的消息传递代码，以及一些底层的XML内容。因此，Webservice的开发者需要深入了解SOAP和XML层的内容。</div>
<div>&nbsp;</div>
<div>在开发Webservice的接口的时候，不要以为使用XML技术，协作性的问题就迎刃而解了，XML并不是解决集成问题的灵丹妙药。这里同样需要标准的制定，需要一个在业界公认的词汇表。仅仅在你的设计框架中引入XML技术并不能保证系统具有协同性，XML仅仅是用来描述数据的语言，XML自己并不提供语义去理解数据。就如同英语和德语都使用拉丁字母，但是他们的语义却并不相同。</div>
<div>&nbsp;</div>
<div>即使你使用相同的语言，也不能保证具有良好的协作性。比如你的公司可能使用Order描述一个订单，但你的合作伙伴可能使用Purchase_Order，而另一个伙伴可能又不相同。你不可能强迫你所有的合作伙伴都采用和你相同的词汇。因此需要有一项技术可以在众多的描述之间充当翻译的角色。XSLT就是这么一种技术，它用于不同语言的转换。和XSLT的配合使用XML才能解决协同性的问题。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM vs. SAX</div>
<div>许多的Webservice开发环境，将开发者从底层的XML文档的解析和处理中解放出来，他们提供了自动化或者很方便的工具，使得这一过程变得很简单。但是对于一些有特殊要求的Webservice应用，比如需要更好的柔性或者对速度要求特别高的应用，就需要手工处理XML文档。这时候两种XML解析的模型－DOM 和SAX的选择，将成为重要的问题。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>DOM使用树状图的方式解析XML文档，而SAX则更多的采用事件驱动的模型。</div>
<div>&nbsp;</div>
<div>DOM先将XML文档映射成一颗树，然后通过采用一系列与树相关的操作去处理这份文档。这种方法有很多的好处，首先开发者很容易理解，使用一颗树这对于开发者来说是最常见不过的了。DOM最常用于XML在Service中需要频繁修改的场合。当然DOM也有它的缺点，在处理XML文档的时候，它需要载入整个文档，而不管你需要修改的是否只是其中的一小部分。因此它的运行效率以及对内存的使用显然是不能接受的，尤其是面对很大的XML文档。</div>
<div>SAX使用事件驱动的模型来处理XML文档。通过一系列事件的触发，来完成对XML的解析，你可以只关心你所要处理的事件，当这些事件发生时，会调用到相应的回调函数来通知到你。采用这种方式就可以在很大程度上提高XML文档解析的效率。但是它的缺点在于难于使用，以及对同一文档的多次处理会存在一些问题。</div>
<div>总而言之，DOM更适合处理那种文档型的XML文件，而SAX则适于那种想直接将XML结构映射成在你系统中的一个对象的操作。（比如将一个XML结构直接映射成JAVA中的一个Class）或者那种针对XML文件中特殊Tag的操作。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档交换vs. RPC模型</div>
<div>这两种交互方式应该在应用架构的设计初始就应该详加考虑，因为它将在很大程度上决定系统的耦合程度。</div>
<div>RPC（Remote Procedure Call）本质上就是远程方法的调用。尽管Webservice是基于XML的但是你仍然可以使用远程方法调用这种模式来进行Webservice的实现，尤其是在那种简单的请求相应的模型中。在这个过程中，传输中的XML文件所描述的更多是有关远程方法的信息，比如方法名，方法参数等等。</div>
<div>而文档交换方式，与RPC相比较在XML文件中不是做远程方法的映射，而是一份完整的自包含的业务文档，当Service端收到这份文档后，先进行预处理（比如词汇的翻译和映射），然后再构造出返回消息。这个构造返回消息的过程中，往往不再是简简单单的一个方法调用，而是多个对象协同完成一个事务的处理，再将结果返回。</div>
<div></div>
<div>这两种方式的区别，类似与打电话和发邮件的不同处理方法。在目前，对于第一种方法提供了很多自动化的工具使得远程方法的调用能够很容易的完成，而后一种方法缺少一系列工具的支持，需要开发者手工完成。</div>
<div>尽管如此，在此还是推荐使用文档交换的方式。由于它在以下方面具有RPC所不具备的优点。</div>
<div>使用文档方式，你可以充分利用XML文件的功能去描述和验证一份业务文档，而在RPC模型中XML仅仅被用于描述方法的信息。</div>
<div>使用文档方式，在客户的Service的提供者之间不再需要紧密的约定，而RPC模型需要客户和Service的提供者紧密相连，一旦方法发生变化，客户端就需要做相应的改动。这不符合低耦合系统的要求，而在文档交换方式中则灵活的多。</div>
<div>由于业务数据是自包含的，显然文档模型更利于采用异步处理。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用设计模式</div>
<div>设计模式在设计Webservice的时候显然可以起到相当大的作用。设计模式的主要目的就是为解决某些在类似环境下的相像问题提供已有的较为成熟的设计方案。在这里，只简单的提及一些很常用的模式，让我们了解到模式在Webservice中可以起到的作用。</div>
<div>Adapter ：为内部系统提供一个不同的接口</div>
<div>Fa&#231;ade： 封装复杂的内部实现，提供一系列简单的接口</div>
<div>Proxy： 作为其他对象的代理，代替它提供服务</div>
<div>&nbsp;</div>
<div>Adapter模式用于将一个组件的接口转化成客户所需要的样子，这里的客户就是Webservice。一个常见的情况就是将原有的老的系统包装成一个Webservice。比如现在使用的是J2EE的平台，而原来有一个C++的系统实现了某些功能，现在需要将它发布成Webservice，那么就需要利用JNI技术做一个Adapter，为原来的C++组件提供一个Java的接口，然后再转化为Webservice。</div>
<div>&nbsp;</div>
<div>Fa&#231;ade模式用于构建粗粒度的服务，它包装了细粒度的服务，从而为复杂的系统提供了一个简单的接口。在J2EE中，Session Bean就象是一个Fa&#231;ade，而Entity Bean则是细粒度的服务。在Webservice中也一样，使用Fa&#231;ade模式可以将已有的组件的功能发挥殆尽。</div>
<div></div>
<div>&nbsp;</div>
<div>Proxy 模式用于充当其他对象的代理，类似于中间人的作用，将处理工作从一个对象传递到另一个对象。在Webservice中，它主要用于隐藏Soap消息构造的过程。也可以用于模拟对象（Mock Object）的创建。</div>
<div>&nbsp;</div>
<div>以上仅仅是一些可以用于Webservice开发的模式，如果你熟练的将这些模式应用于Webservice开发，你将会发现开发Webservice应用，将好像做一种特殊的面向对象设计。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全</div>
<div>Webservice为作为方便的服务被用广大领域使用的同时，也成为了黑客们的美食。在这里，本文将就目前对Webservice安全所能做的改进做简单介绍。</div>
<div>在Webservice中的安全主要分为以下三个方面。</div>
<div>传输&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSL/HTTPS 对连接加密，而不是传输数据</div>
<div>消息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据加密(XML Encryption) &nbsp;&nbsp;数字签名(XML-DSIG)</div>
<div>底层架构&nbsp; 利用应用服务安全机制</div>
<div>&nbsp;</div>
<div>传输时的安全是最容易被加入到你的Webservice应用中的，利用现有的SSL 和HTTPS协议，就可以很容易的获得连接过程中的安全。</div>
<div>&nbsp;</div>
<div>然而这种安全实现方法有两个弱点。一是它只能保证数据传输的安全，而不是数据本身的安全，数据一旦到达某地，那么就可以被任何人所查看。而在Webservice中，一份数据可能到达多个地方，而这份数据却不该被所有的接受者所查看。二是它提供的是要么全有要么全无的保护，你不能选择哪部分数据要被保护，而这种可选择性也是在Webservice中所常要用到的。</div>
<div>&nbsp;</div>
<div>第二层的保护是对于消息本身的保护。你可以使用已有的XML安全扩展标准，实现数字签名的功能，从而保证你的消息是来自特定方并没有被修改过。XML文件的加密技术从更大程度上加强了Webservice的安全，它能够定制数据传输到后，能否被接受者所查看，进一步完善了传输后的安全，业界也在不断的制定Webservice的安全标准，比如SAML 和 WS-Security。</div>
<div>&nbsp;</div>
<div>最后一层保护就是依靠底层架构的安全，这更多的来自于操作系统和某些中间件的保护。比如在J2EE中，主持Webservice的应用服务器。目前很多的J2EE应用服务器都支持Java Authentication and Authorization Service (JAAS)，这是最近被加入到J2SE 1.4当中的。利用主持Webservice的服务器，实现一些安全机制这是很自然的做法。另一种利用底层架构的安全方法就是，做一个独立的负责安全的服务器，Webservice的使用者和创建者都需要与之取得安全信任。<br />
<br />
推荐资料<br />
<a href="http://idior.cnblogs.com/archive/2006/05/16/354066.aspx">Web Services Security</a><br />
</div>
</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/250014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-01-05 23:49 <a href="http://www.blogjava.net/libin2722/articles/250014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService大讲堂之Axis2（2）：复合类型数据的传递 </title><link>http://www.blogjava.net/libin2722/articles/249977.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Mon, 05 Jan 2009 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/249977.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/249977.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/249977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/249977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/249977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在实际的应用中，不仅需要使用WebService来传递简单类型的数据，有时也需要传递更复杂的数据，这些数据可以被称为复合类型的数据。数组与类（接口）是比较常用的复合类型。在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类（接口）。但要注意，在定义数组类型时只能使用一维数组，如果想传递多维数组，可以使用分隔符进行分隔，如下面的代码所示：String[] strA...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/249977.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/249977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-01-05 20:13 <a href="http://www.blogjava.net/libin2722/articles/249977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）WebService大讲堂之Axis2（1）：用POJO实现0配置的WebService </title><link>http://www.blogjava.net/libin2722/articles/249974.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Mon, 05 Jan 2009 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/249974.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/249974.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/249974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/249974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/249974.html</trackback:ping><description><![CDATA[<p>本文来自：http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/02/249556.html<br />
<br />
</p>
Axis2<span style="font-family: 宋体">是一套崭新的</span>WebService<span style="font-family: 宋体">引擎，该版本是对</span>Axis1.x<span style="font-family: 宋体">重新设计的产物。</span>Axis2<span style="font-family: 宋体">不仅支持</span>SOAP1.1<span style="font-family: 宋体">和</span>SOAP1.2<span style="font-family: 宋体">，还集成了非常流行的</span>REST WebService<span style="font-family: 宋体">，同时还支持</span>Spring<span style="font-family: 宋体">、</span>JSON<span style="font-family: 宋体">等技术。这些都将在后面的系列教程中讲解。在本文中主要介绍了如何使用</span>Axis2<span style="font-family: 宋体">开发一个不需要任何配置文件的</span>WebService<span style="font-family: 宋体">，并在客户端使用</span>Java<span style="font-family: 宋体">和</span>C#<span style="font-family: 宋体">调用这个</span>WebService<span style="font-family: 宋体">。</span>
<p><strong><span style="font-family: 宋体">一、</span>Axis2</strong><strong><span style="font-family: 宋体">的下载和安装</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">读者可以从如下的网址下载</span>Axis2<span style="font-family: 宋体">的最新版本：</span></p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://ws.apache.org/axis2/">http://ws.apache.org/axis2/</a><br />
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在本文使用了目前</span>Axis2<span style="font-family: 宋体">的最新版本</span>1.4.1<span style="font-family: 宋体">。读者可以下载如下两个</span>zip<span style="font-family: 宋体">包：</span></p>
<p>&nbsp;&nbsp;&nbsp; axis2-1.4.1-bin.zip</p>
<p>&nbsp;&nbsp;&nbsp; axis2-1.4.1-war.zip</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">其中</span>axis2-1.4.1-bin.zip<span style="font-family: 宋体">文件中包含了</span>Axis2<span style="font-family: 宋体">中所有的</span>jar<span style="font-family: 宋体">文件</span>, axis2-1.4.1-war.zip<span style="font-family: 宋体">文件用于将</span>WebService<span style="font-family: 宋体">发布到</span>Web<span style="font-family: 宋体">容器中。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">将</span>axis2-1.4.1-war.zip<span style="font-family: 宋体">文件解压到相应的目录，将目录中的</span>axis2.war<span style="font-family: 宋体">文件放到</span>&lt;Tomcat<span style="font-family: 宋体">安装目录</span>&gt;\webapps<span style="font-family: 宋体">目录中（本文使用的</span>Tomcat<span style="font-family: 宋体">的版本是</span>6.x<span style="font-family: 宋体">），并启动</span>Tomcat<span style="font-family: 宋体">。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在浏览器地址栏中输入如下的</span>URL<span style="font-family: 宋体">：</span></p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://localhost:8080/axis2/">http://localhost:8080/axis2/</a><br />
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">如果在浏览器中显示出如图</span>1<span style="font-family: 宋体">所示的页面，则表示</span>Axis2<span style="font-family: 宋体">安装成功。<br />
</span></p>
<div align="center"><img height="410" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/axis2_1/01.jpg" width="708" /><br />
<br />
图1<br />
</div>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
<strong><span style="font-family: 宋体">二、编写和发布WebService</span></strong></p>
<p>&nbsp;&nbsp;<span style="font-family: 宋体">对于用</span>Java<span style="font-family: 宋体">实现的服务程序给人的印象就是需要进行大量的配置，不过这一点在</span>Axis2<span style="font-family: 宋体">中将被终结。在</span>Axis2<span style="font-family: 宋体">中不需要进行任何的配置，就可以直接将一个简单的</span>POJO<span style="font-family: 宋体">发布成</span>WebService<span style="font-family: 宋体">。其中</span>POJO<span style="font-family: 宋体">中所有的</span>public<span style="font-family: 宋体">方法将被发布成</span>WebService<span style="font-family: 宋体">方法。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">下面我们来实现一个简单的</span>POJO<span style="font-family: 宋体">，代码如下：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SimpleService<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getGreeting(String&nbsp;name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">你好&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getPrice()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.util.Random().nextInt(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在</span>SimpleService<span style="font-family: 宋体">类中有两个方法，由于这两个方法都是</span>public<span style="font-family: 宋体">方法，因此，它们都将作为</span>WebService<span style="font-family: 宋体">方法被发布。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">编译</span>SimpleService<span style="font-family: 宋体">类后，将</span>SimpleService.class<span style="font-family: 宋体">文件放到</span>&lt;Tomcat<span style="font-family: 宋体">安装目录</span>&gt;\webapps\axis2\WEB-INF\pojo<span style="font-family: 宋体">目录中（如果没有</span>pojo<span style="font-family: 宋体">目录，则建立该目录）。现在我们已经成功将</span>SimpleService<span style="font-family: 宋体">类发布成了</span>WebService<span style="font-family: 宋体">。在浏览器地址栏中输入如下的</span>URL<span style="font-family: 宋体">：</span></p>
<p><a href="http://localhost:8080/axis2/services/listServices">http://localhost:8080/axis2/services/listServices</a><br />
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">这时当前页面将显示所有在</span>Axis2<span style="font-family: 宋体">中发布的</span>WebService<span style="font-family: 宋体">，如图</span>2<span style="font-family: 宋体">所示。<br />
<div align="center"><img height="400" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/axis2_1/02.jpg" width="691" /><br />
<span style="font-family: 宋体"><br />
图2</span><br />
</div>
</span>
<p>&nbsp;</p>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在浏览器地址栏中输入如下的两个</span>URL<span style="font-family: 宋体">来分别测试</span>getGreeting<span style="font-family: 宋体">和</span>getPrice<span style="font-family: 宋体">方法：</span></p>
<p><a href="http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill">http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill</a><br />
</p>
<p><a href="http://localhost:8080/axis2/services/SimpleService/getPrice">http://localhost:8080/axis2/services/SimpleService/getPrice</a><br />
<br />
&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">图</span>3<span style="font-family: 宋体">和图</span>4<span style="font-family: 宋体">分别显示了</span>getGreeting<span style="font-family: 宋体">和</span>getPrice<span style="font-family: 宋体">方法的测试结果。<br />
<div align="center"><img height="391" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/axis2_1/03.jpg" width="523" /></div>
</span>
<p>&nbsp;</p>
<p align="center"><span style="font-family: 宋体">图3&nbsp; getGreeting方法的测试结果</span></p>
<p><span style="font-family: 宋体">
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/axis2_1/04.jpg" /></div>
</span>
<p>&nbsp;</p>
<p align="center"><span style="font-family: 宋体">图4&nbsp; getPrice方法的测试结果</span></p>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C06%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在编写、发布和测试</span>0<span style="font-family: 宋体">配置的</span>WebService<span style="font-family: 宋体">时应注意如下几点：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>1.&nbsp;POJO</span><span style="font-family: 宋体">类不能使用</span>package<span style="font-family: 宋体">关键字声明包。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>2.&nbsp;Axis2</span><span style="font-family: 宋体">在默认情况下可以热发布</span>WebService<span style="font-family: 宋体">，也就是说，将</span>WebService<span style="font-family: 宋体">的</span>.class<span style="font-family: 宋体">文件复制到</span>pojo<span style="font-family: 宋体">目录中时，</span>Tomcat<span style="font-family: 宋体">不需要重新启动就可以自动发布</span>WebService<span style="font-family: 宋体">。如果想取消</span>Axis2<span style="font-family: 宋体">的热发布功能，可以打开</span>&lt;Tomcat<span style="font-family: 宋体">安装目录</span>&gt;\webapps\axis2\WEB-INF\conf\axis2.xml<span style="font-family: 宋体">，找到如下的配置代码：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hotdeployment"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">将</span>true<span style="font-family: 宋体">改为</span>false<span style="font-family: 宋体">即可。要注意的是，</span>Axis2<span style="font-family: 宋体">在默认情况下虽然是热发布，但并不是热更新，也就是说，一旦成功发布了</span>WebService<span style="font-family: 宋体">，再想更新该</span>WebService<span style="font-family: 宋体">，就必须重启</span>Tomcat<span style="font-family: 宋体">。这对于开发人员调试</span>WebService<span style="font-family: 宋体">非常不方便，因此，在开发</span>WebService<span style="font-family: 宋体">时，可以将</span>Axis2<span style="font-family: 宋体">设为热更新。在</span>axis2.xml<span style="font-family: 宋体">文件中找到</span><span>&lt;parameter name="hotupdate"&gt;false&lt;/parameter&gt;</span><span style="font-family: 宋体">，将</span>false<span style="font-family: 宋体">改为</span>true<span style="font-family: 宋体">即可。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>3.&nbsp;</span><span style="font-family: 宋体">在浏览器中测试</span>WebService<span style="font-family: 宋体">时，如果</span>WebService<span style="font-family: 宋体">方法有参数，需要使用</span>URL<span style="font-family: 宋体">的请求参数来指定该</span>WebService<span style="font-family: 宋体">方法参数的值，请求参数名与方法参数名要一致，例如，要测试</span>getGreeting<span style="font-family: 宋体">方法，请求参数名应为</span>name<span style="font-family: 宋体">，如上面的</span>URL<span style="font-family: 宋体">所示。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>4.&nbsp;</span><span style="font-family: 宋体">发布</span>WebService<span style="font-family: 宋体">的</span>pojo<span style="font-family: 宋体">目录只是默认的，如果读者想在其他的目录发布</span>WebService<span style="font-family: 宋体">，可以打开</span>axis2.xml<span style="font-family: 宋体">文件，并在</span>&lt;axisconfig&gt;<span style="font-family: 宋体">元素中添加如下的子元素：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">deployer&nbsp;</span><span style="color: #ff0000">extension</span><span style="color: #0000ff">=".class"</span><span style="color: #ff0000">&nbsp;directory</span><span style="color: #0000ff">="my"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.axis2.deployment.POJODeployer"</span><span style="color: #0000ff">/&gt;</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">上面的配置允许在</span>&lt;Tomcat<span style="font-family: 宋体">安装目录</span>&gt;"webapps"axis2"WEB-INF"my<span style="font-family: 宋体">目录中发布</span>WebService<span style="font-family: 宋体">。例如，将本例中的</span>SimpleService.class<span style="font-family: 宋体">复制到</span>my<span style="font-family: 宋体">目录中也可以成功发布（但要删除</span>pojo<span style="font-family: 宋体">目录中的</span>SimpleService.class<span style="font-family: 宋体">，否则</span>WebService<span style="font-family: 宋体">会重名）。</span></p>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C08%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</p>
<p><strong><span style="font-family: 宋体">三、</span> </strong><strong><span style="font-family: 宋体">用</span>Java</strong><strong><span style="font-family: 宋体">实现调用</span>WebService</strong><strong><span style="font-family: 宋体">的客户端程序</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; WebService<span style="font-family: 宋体">是为程序服务的，只在浏览器中访问</span>WebService<span style="font-family: 宋体">是没有意义的。因此，在本节使用</span>Java<span style="font-family: 宋体">实现了一个控制台程序来调用上一节发布的</span>WebService<span style="font-family: 宋体">。调用</span>WebService<span style="font-family: 宋体">的客户端代码如下：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;client;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.namespace.QName;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.addressing.EndpointReference;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.client.Options;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.rpc.client.RPCServiceClient;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RPCClient<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;使用RPC方式调用WebService&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RPCServiceClient&nbsp;serviceClient&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RPCServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Options&nbsp;options&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;serviceClient.getOptions();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;指定调用WebService的URL</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndpointReference&nbsp;targetEPR&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EndpointReference(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/axis2/services/SimpleService</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setTo(targetEPR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;指定getGreeting方法的参数值</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;opAddEntryArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;{</span><span style="color: #000000">"</span><span style="color: #000000">超人</span><span style="color: #000000">"</span><span style="color: #000000">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;指定getGreeting方法返回值的数据类型的Class对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;classes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Class[]&nbsp;{String.</span><span style="color: #0000ff">class</span><span style="color: #000000">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;指定要调用的getGreeting方法及WSDL文件的命名空间</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QName&nbsp;opAddEntry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QName(</span><span style="color: #000000">"</span><span style="color: #000000">http://ws.apache.org/axis2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">getGreeting</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;调用getGreeting方法并输出该方法的返回值</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(serviceClient.invokeBlocking(opAddEntry,&nbsp;opAddEntryArgs,&nbsp;classes)[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;下面是调用getPrice方法的代码，这些代码与调用getGreeting方法的代码类似</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Class[]&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">.</span><span style="color: #0000ff">class</span><span style="color: #000000">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opAddEntry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QName(</span><span style="color: #000000">"</span><span style="color: #000000">http://ws.apache.org/axis2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">getPrice</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(serviceClient.invokeBlocking(opAddEntry,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]{},&nbsp;classes)[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
--> </style>
<span style="font-family: 宋体">运行上面的程序后，将在控制台输出如下的信息：</span></p>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">你好&nbsp;超人<br />
443</span></div>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在编写客户端代码时应注意如下几点：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>1.&nbsp;</span><span style="font-family: 宋体">客户端代码需要引用很多</span>Axis2<span style="font-family: 宋体">的</span>jar<span style="font-family: 宋体">包，如果读者不太清楚要引用哪个</span>jar<span style="font-family: 宋体">包，可以在</span>Eclipse<span style="font-family: 宋体">的工程中引用</span>Axis2<span style="font-family: 宋体">发行包的</span>lib<span style="font-family: 宋体">目录中的所有</span>jar<span style="font-family: 宋体">包。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>2.&nbsp;</span><span style="font-family: 宋体">在本例中使用了</span>RPCServiceClient<span style="font-family: 宋体">类的</span>invokeBlocking<span style="font-family: 宋体">方法调用了</span>WebService<span style="font-family: 宋体">中的方法。</span>invokeBlocking<span style="font-family: 宋体">方法有三个参数，其中第一个参数的类型是</span>QName<span style="font-family: 宋体">对象，表示要调用的方法名；第二个参数表示要调用的</span>WebService<span style="font-family: 宋体">方法的参数值，参数类型为</span>Object[]<span style="font-family: 宋体">；第三个参数表示</span>WebService<span style="font-family: 宋体">方法的返回值类型的</span>Class<span style="font-family: 宋体">对象，参数类型为</span>Class[]<span style="font-family: 宋体">。当方法没有参数时，</span>invokeBlocking<span style="font-family: 宋体">方法的第二个参数值不能是</span>null<span style="font-family: 宋体">，而要使用</span>new Object[]{}<span style="font-family: 宋体">。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>3.&nbsp;</span><span style="font-family: 宋体">如果被调用的</span>WebService<span style="font-family: 宋体">方法没有返回值，应使用</span>RPCServiceClient<span style="font-family: 宋体">类的</span>invokeRobust<span style="font-family: 宋体">方法，该方法只有两个参数，它们的含义与</span>invokeBlocking<span style="font-family: 宋体">方法的前两个参数的含义相同。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>4.&nbsp;</span><span style="font-family: 宋体">在创建</span>QName<span style="font-family: 宋体">对象时，</span>QName<span style="font-family: 宋体">类的构造方法的第一个参数表示</span>WSDL<span style="font-family: 宋体">文件的命名空间名，也就是</span>&lt;wsdl:definitions&gt;<span style="font-family: 宋体">元素的</span>targetNamespace<span style="font-family: 宋体">属性值，下面是</span>SimpleService<span style="font-family: 宋体">类生成的</span>WSDL<span style="font-family: 宋体">文件的代码片段：<br />
<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">wsdl:definitions&nbsp;</span><span style="color: #ff0000">xmlns:wsdl</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/"</span><span style="color: #ff0000">&nbsp;xmlns:ns1</span><span style="color: #0000ff">="http://org.apache.axis2/xsd"</span><span style="color: #ff0000"> <br />
xmlns:ns</span><span style="color: #0000ff">="http://ws.apache.org/axis2"</span><span style="color: #ff0000">&nbsp;xmlns:wsaw</span><span style="color: #0000ff">="http://www.w3.org/2006/05/addressing/wsdl"</span><span style="color: #ff0000"> <br />
xmlns:http</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/http/"</span><span style="color: #ff0000">&nbsp;xmlns:xs</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema"</span><span style="color: #ff0000"> <br />
xmlns:mime</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/mime/"</span><span style="color: #ff0000">&nbsp;xmlns:soap</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/soap/"</span><span style="color: #ff0000"> <br />
xmlns:soap12</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/soap12/"</span><strong><span style="color: #ff0000"> <br />
targetNamespace</span><span style="color: #0000ff">="http://ws.apache.org/axis2"</span></strong><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">wsdl:types</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">wsdl:types</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">wsdl:definitions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C14%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</p>
<p><strong><span style="font-family: 宋体">四、用</span>wsdl2java</strong><strong><span style="font-family: 宋体">简化客户端的编写</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">也许有很多读者会说&#8220;有没有搞错啊，只调用两个</span>WebService<span style="font-family: 宋体">方法用要写这么多代码，太麻烦了&#8221;。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">不过幸好</span>Axis2<span style="font-family: 宋体">提供了一个</span>wsdl2java.bat<span style="font-family: 宋体">命令可以根据</span>WSDL<span style="font-family: 宋体">文件自动产生调用</span>WebService<span style="font-family: 宋体">的代码。</span>wsdl2java.bat<span style="font-family: 宋体">命令可以在</span>&lt;Axis2<span style="font-family: 宋体">安装目录</span>&gt;"bin<span style="font-family: 宋体">目录中找到。在使用</span>wsdl2java.bat<span style="font-family: 宋体">命令之前需要设置</span>AXIS2_HOME<span style="font-family: 宋体">环境变量，该变量值是</span>&lt;Axis2<span style="font-family: 宋体">安装目录</span>&gt;<span style="font-family: 宋体">。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在</span>Windows<span style="font-family: 宋体">控制台输出如下的命令行来生成调用</span>WebService<span style="font-family: 宋体">的代码：</span></p>
<p><span>%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">其中</span>-url<span style="font-family: 宋体">参数指定了</span>wsdl<span style="font-family: 宋体">文件的路径，可以是本地路径，也可以是网络路径。</span>-p<span style="font-family: 宋体">参数指定了生成的</span>Java<span style="font-family: 宋体">类的包名，</span>-o<span style="font-family: 宋体">参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后，读者就会发现在当前目录下多了个</span>stub<span style="font-family: 宋体">目录，在</span>."stub"src"client<span style="font-family: 宋体">目录可以找到一个</span>SimpleServiceStub.java<span style="font-family: 宋体">文件，该文件复杂调用</span>WebService<span style="font-family: 宋体">，读者可以在程序中直接使用这个类，代码如下：<br />
</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;client;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.namespace.QName;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.addressing.EndpointReference;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.client.Options;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.axis2.rpc.client.RPCServiceClient;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;StubClient<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleServiceStub&nbsp;stub&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleServiceStub();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleServiceStub.GetGreeting&nbsp;gg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleServiceStub.GetGreeting();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gg.setName(</span><span style="color: #000000">"</span><span style="color: #000000">比尔</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;stub.getGreeting(gg).get_return());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stub.getPrice().get_return());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C16%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">上面的代码大大简化了调用</span>WebService<span style="font-family: 宋体">的步骤，并使代码更加简洁。但要注意的是，</span>wsdl2java.bat<span style="font-family: 宋体">命令生成的</span>Stub<span style="font-family: 宋体">类将</span>WebService<span style="font-family: 宋体">方法的参数都封装在了相应的类中，类名为方法名，例如，</span>getGreeting<span style="font-family: 宋体">方法的参数都封装在了</span>GetGreeting<span style="font-family: 宋体">类中，要想调用</span>getGreeting<span style="font-family: 宋体">方法，必须先创建</span>GetGreeting<span style="font-family: 宋体">类的对象实例。</span></p>
<p><strong><span style="font-family: 宋体">五、使用</span>C#</strong><strong><span style="font-family: 宋体">调用</span>WebService</strong></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">从理论上说，</span>WebService<span style="font-family: 宋体">可以被任何支持</span>SOAP<span style="font-family: 宋体">协议的语言调用。在</span>Visual Studio<span style="font-family: 宋体">中使用</span>C#<span style="font-family: 宋体">调用</span>WebService<span style="font-family: 宋体">是在所有语言中最容易实现的（</span>VB.net<span style="font-family: 宋体">的调用方法类似，也同样很简单）。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">新建一个</span>Visual Studio<span style="font-family: 宋体">工程，并在引用</span>Web<span style="font-family: 宋体">服务的对话框中输入如下的</span>URL<span style="font-family: 宋体">，并输入</span>Web<span style="font-family: 宋体">引用名为&#8220;</span>WebService<span style="font-family: 宋体">&#8221;：</span></p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://localhost:8080/axis2/services/SimpleService?wsdl">http://localhost:8080/axis2/services/SimpleService?wsdl</a><br />
</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">然后引用</span>Web<span style="font-family: 宋体">服务的对话框就会显示该</span>WebService<span style="font-family: 宋体">中的所有的方法，如图</span>5<span style="font-family: 宋体">所示。<br />
<div align="center"><img height="463" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/axis2_1/05.jpg" width="746" /><br />
<br />
图5<br />
</div>
</span>
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 11" name="Generator" />
<meta content="Microsoft Word 11" name="Originator" />
<link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C18%5Cclip_filelist.xml" rel="File-List" />
<style>
<!-- /* Font Definitions */
&#64;font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
&#64;font-face
{font-family:""&#64;宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
&#64;page
{}
&#64;page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在完成上面的工作后，只需要如下三行</span>C#<span style="font-family: 宋体">代码就可以调用</span>getGreeting<span style="font-family: 宋体">和</span>getPrice<span style="font-family: 宋体">方法，并显示这两个方法的返回值：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">WebService.SimpleService&nbsp;simpleService&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WSC.WebService.SimpleService();<br />
MessageBox.Show(&nbsp;simpleService.getGreeting(</span><span style="color: #000000">"</span><span style="color: #000000">比尔</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
MessageBox.Show(simpleService.getPrice().@return.ToString());</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在</span>.net<span style="font-family: 宋体">解析</span>WSDL<span style="font-family: 宋体">文件时直接将</span>getGreeting<span style="font-family: 宋体">方法的参数映射为</span>String<span style="font-family: 宋体">类型，因此，可以直接进行传值。</span><br />
&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">从上面的调用过程可以看出，添加</span>Web<span style="font-family: 宋体">引用的过程就相当于在</span>Java<span style="font-family: 宋体">中调用</span>wsdl2java.bat<span style="font-family: 宋体">自动生成</span>stub<span style="font-family: 宋体">类的过程。只是在调用</span>stub<span style="font-family: 宋体">类时与</span>C#<span style="font-family: 宋体">有一定的区别，但从总体上来说，都大大简化了调用</span>WebService<span style="font-family: 宋体">的过程。</span><br />
</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/249974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-01-05 19:58 <a href="http://www.blogjava.net/libin2722/articles/249974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)使用Axis2的底层API开发Web Service</title><link>http://www.blogjava.net/libin2722/articles/214223.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 11 Jul 2008 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/214223.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/214223.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/214223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/214223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/214223.html</trackback:ping><description><![CDATA[<div><font size="2"><em>本文是在理解官方指南的基础上，用实例实现Axis2提供的4种调用机制，并给出测试结果。</em><br />
author: ZJ 07-3-13<br />
Blog: </font><font size="2"><a href="http://zhangjunhd.blog.51cto.com/" target="_blank">http://zhangjunhd.blog.51cto.com/</a></font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>1．使用Axis2的底层API开发Web Service Server端</strong><br />
1.1创建一个WebService(取名为MyService)<br />
&nbsp;&nbsp;&nbsp; 在MyService中有两个operations,如下所示。</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">public void ping(OMElement element){}//IN-ONLY模式。仅仅接收OMElement，并对其处理。<br />
public OMElement echo(OMElement element){}//IN_OUT模式。接收OMElemen，并返回OMElement。</font></div>
</div>
<div>&nbsp;</div>
<div><font size="2">1.2如何写Web Service<br />
1）创建实现服务的类。</font></div>
<div><font size="2">2）创建services.xml来解析这个Web Service。</font></div>
<div><font size="2">3）将其打包成一个*.aar文档（Axis Archive）。</font></div>
<div><font size="2">4）部署Web Service。</font></div>
<div>&nbsp;</div>
<div><font size="2">1.2.1 创建实现服务的类<br />
&nbsp;&nbsp;&nbsp; 此类中提供的方法必须与Web Service（在services.xml中声明）中的operations对应。除非你提供了数据绑定，否则所有的方法只能接收一个参数，其类型为OMElement。</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">public class MyService{<br />
&nbsp; public void ping(OMElement element){...}<br />
&nbsp; public OMElement echo(OMElement element){...}<br />
}</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2"><u>MyService.java</u></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.example1;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import javax.xml.stream.XMLStreamException;</font></div>
<div><font size="2">public class MyService {<br />
&nbsp;&nbsp;&nbsp; public OMElement echo(OMElement element) throws XMLStreamException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Praparing the OMElement so that it can be attached to another OM Tree.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //First the OMElement should be completely build in case it is not fully built and still<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //some of the xml is in the stream.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.build();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Secondly the OMElement should be detached from the current OMTree so that it can<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; // be attached some other OM Tree. Once detached the OmTree will remove its<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // connections to this OMElement.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.detach();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return element;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void ping(OMElement element) throws XMLStreamException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Do some processing<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void pingF(OMElement element) throws AxisFault{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new AxisFault("Fault being thrown");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<div>&nbsp;</div>
<div><font size="2">1.2.2 创建services.xml<br />
&nbsp;&nbsp;&nbsp; Axis2使用services.xml来充当一个Web Servicea的配置文件。每一个使用Axis2部署的Web Service都必须拥有一个services.xml。</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;services&gt;<br />
&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp; This is a sample Web Service with two operations,echo and ping.<br />
&nbsp; &lt;/description&gt;<br />
&nbsp; &lt;parameter name=&#8221;ServiceClass&#8221; locked=&#8221;false&#8221;&gt;<br />
&nbsp; userguide.example1.MyService<br />
&nbsp; &lt;/parameter&gt;<br />
&nbsp; &lt;operation name=&#8221;echo&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;messageReceiver class=&#8221;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;actionMapping&gt;urn:echo&lt;/actionMapping&gt;<br />
&nbsp; &lt;/operation&gt;<br />
&nbsp; &lt;operation name=&#8221;ping&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;messageReceiver class=&#8221;org.apache.receivers.RawXMLINOnlyMessageReceiver&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;actionMapping&gt;urn:ping&lt;/actionMapping&gt;<br />
&nbsp; &lt;/operation&gt;<br />
&lt;/service&gt;</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">注：The actionMapping is required only if you want to enable WS-Addressing.<br />
&nbsp;&nbsp;&nbsp; 可以创建一个services.xml，其中包含一组服务。这样在运行期，你可以在这些服务间共享信息。</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;serviceGroup&gt;<br />
&nbsp; &lt;service name=&#8221;Service1&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--details for Services1--&gt;<br />
&nbsp; &lt;/service&gt;<br />
&lt;service name=&#8221;Service2&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--details for Services2--&gt;<br />
&nbsp; &lt;/service&gt;<br />
&nbsp; &lt;module ref=&#8221;ModuleName&#8221;/&gt;<br />
&nbsp; &lt;parameter name=&#8221;serviceGroupParam1&#8221; locked=&#8221;false&#8221;&gt;value1&lt;/parameter&gt;<br />
&lt;/serviceGroup&gt;</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">注：name of the service is a compulsory attribute.</font></div>
<div>&nbsp;</div>
<div><font size="2">1.2.3打包与部署<br />
&nbsp;&nbsp;&nbsp; 这里不再详述，参见《</font><a class="subject" href="http://zhangjunhd.blog.51cto.com/blog/113473/23690" target="_blank"><font color="#000000" size="2">基于Tomcat5.0和Axis2开发Web Service应用实例</font></a><font size="2"> 》。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong>2．使用Axis2底层APIs实现Web Service客户端</strong><br />
2.1ClientUtil<br />
&nbsp;&nbsp;&nbsp; 创建一个客户端通用的SOAP包装Util文件。封装"getEchoOMElement"和"getPingOMElement"分别对应"echo"和"ping"这两个operation。</font></div>
<div><u><font size="2">ClientUtil.java</font></u></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMAbstractFactory;<br />
import org.apache.axiom.om.OMElement;<br />
import org.apache.axiom.om.OMFactory;<br />
import org.apache.axiom.om.OMNamespace;</font></div>
<div><font size="2">public class ClientUtil {<br />
&nbsp;&nbsp;&nbsp; public static OMElement getEchoOMElement() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace omNs = fac.createOMNamespace(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><font size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font size="2">", "example1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement method = fac.createOMElement("echo", omNs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement value = fac.createOMElement("Text", omNs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.addChild(fac.createOMText(value, "Axis2 Echo String "));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.addChild(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static OMElement getPingOMElement() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace omNs = fac.createOMNamespace(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><font size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font size="2">", "example1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement method = fac.createOMElement("ping", omNs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement value = fac.createOMElement("Text", omNs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.addChild(fac.createOMText(value, "Axis2 Ping String "));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.addChild(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<div>&nbsp;</div>
<div><font size="2">2.2EchoBlockingClient<br />
&nbsp;&nbsp;&nbsp; Axis2向用户提供了从blocking
single channel调用到non-blocking dual channel调用的多种调用Web
Service的模式。下面用最简单的blocking调用机制来实现&#8221;MyService&#8221;中的"echo" operation。</font></div>
<div><u><font size="2">EchoBlockingClient.java</font></u></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import org.apache.axis2.addressing.EndpointReference;<br />
import org.apache.axis2.client.Options;<br />
import org.apache.axis2.client.ServiceClient;</font></div>
<div><font size="2">/**<br />
&nbsp;* Sample for synchronous single channel blocking service invocation.<br />
&nbsp;* Message Exchage Pattern IN-OUT<br />
&nbsp;*/<br />
public class EchoBlockingClient {<br />
private static EndpointReference targetEPR =<br />
&nbsp;new EndpointReference("</font><font size="2"><a href="http://localhost:8080/axis2/services/MyService" target="_blank">http://localhost:8080/axis2/services/MyService</a></font><font size="2">");<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement payload = ClientUtil.getEchoOMElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="2"><font color="#5f9ea0">&nbsp;&nbsp;&nbsp; Options options = new Options();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR); // this sets the location of MyService service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient serviceClient = new ServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceClient.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement result = sender.sendReceive(payload);<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result);<br />
} catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axisFault.printStackTrace();<br />
} <br />
}</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">&nbsp;&nbsp;&nbsp; 绿色部分显示了为了调用一个Web Service而需要对operation作的设置。剩下的部分是用来创建OMElement，用来发送和显示相应的OMElement。</font></div>
<div>&nbsp;</div>
<div><font size="2">结果：</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;example1:echo xmlns:example1="</font><font size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font size="2">" <br />
xmlns:tns="</font><font size="2"><a href="http://ws.apache.org/axis2" target="_blank">http://ws.apache.org/axis2</a></font><font size="2">"&gt;<br />
&lt;example1:Text&gt;<br />
Axis2 Echo String <br />
&lt;/example1:Text&gt;<br />
&lt;/example1:echo&gt;</font></div>
</div>
<div>&nbsp;</div>
<div><font size="2">2.3 PingClient<br />
&nbsp;&nbsp;&nbsp; 在&#8221;MyService&#8221;中，我们有一种IN-ONLY模式的名为"ping"的operation。应用它的客户端代码如下：<br />
<u>PingClient.java</u></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import org.apache.axis2.addressing.EndpointReference;<br />
import org.apache.axis2.client.Options;<br />
import org.apache.axis2.client.ServiceClient;</font></div>
<div><font size="2">/**<br />
&nbsp;* Sample for fire-and-forget service invocation<br />
&nbsp;* Message Exchage Pattern IN-Only<br />
&nbsp;*/<br />
public class PingClient {<br />
private static EndpointReference targetEPR =<br />
&nbsp;new EndpointReference("</font><font size="2"><a href="http://localhost:8080/axis2/services/MyService" target="_blank">http://localhost:8080/axis2/services/MyService</a></font><font size="2">");<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement payload = ClientUtil.getPingOMElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient serviceClient = new ServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceClient.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font size="2"><font style="background-color: #ffffff;"><font style="background-color: #d3d3d3;" color="#5f9ea0">serviceClient.fireAndForget(payload);</font><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * We have to block this thread untill we send the request , the problem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * is if we go out of the main thread , then request wont send ,so<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * you have to wait some time :)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(500);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } <br />
catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axisFault.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">&nbsp;&nbsp;&nbsp; 由于我们在访问一个IN-ONLY模式的operation，所以我们可以直接使用ServiceClient中的"fireAndForget()"方法来调用这个operation。而且那样做的话，不会阻塞发起端，因此，它会立刻将控制权返回给客户端。</font></div>
<div>&nbsp;</div>
<div><font size="2">2.4 EchoNonBlockingClient<br />
&nbsp;&nbsp;&nbsp;
在客户端EchoBlockingClient，一旦调用"serviceClient.sendReceive(payload);"，客户端将会被阻
塞直到operation完成。这种方式在有很多Web
Service需要在一个单一的客户端应用程序中启动时很不可取。一种解决方法是使用Non-Blocking API来调用这些Web
Services。Axis2提供给用户一种基于回叫机制的non-blocking API。<br />
<u>EchoNonBlockingClient.java</u></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import org.apache.axis2.addressing.EndpointReference;<br />
import org.apache.axis2.client.Options;<br />
import org.apache.axis2.client.ServiceClient;<br />
import org.apache.axis2.client.async.AsyncResult;<br />
import org.apache.axis2.client.async.Callback;</font></div>
<div><font size="2">/**<br />
&nbsp;* Sample for asynchronous single channel non-blocking service invocation.<br />
&nbsp;* Message Exchage Pattern IN-OUT<br />
&nbsp;*/<br />
public class EchoNonBlockingClient {<br />
private static EndpointReference targetEPR =<br />
&nbsp;new EndpointReference("</font><font size="2"><a href="http://127.0.0.1:8080/axis2/services/MyService" target="_blank">http://127.0.0.1:8080/axis2/services/MyService</a></font><font size="2">");<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement payload = ClientUtil.getEchoOMElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Callback to handle the response<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font size="2"><font color="#5f9ea0">Callback callback = new Callback() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onComplete(AsyncResult result) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result.getResponseEnvelope());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onError(Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Non-Blocking Invocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender = new ServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="2"><font color="#5f9ea0"> sender.sendReceiveNonBlocking(payload, callback);<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Wait till the callback receives the response.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!callback.isComplete()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axisFault.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.finalizeInvoke();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) { }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<div>&nbsp;</div>
<div><font size="2">结果：</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />
&lt;soapenv:Envelope xmlns:soapenv="</font><font size="2"><a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank">http://schemas.xmlsoap.org/soap/envelope/</a></font><font size="2">"&gt;<br />
&lt;soapenv:Header /&gt;<br />
&lt;soapenv:Body&gt;<br />
&lt;example1:echo xmlns:example1="</font><font size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font size="2">" <br />
xmlns:tns="</font><font size="2"><a href="http://ws.apache.org/axis2" target="_blank">http://ws.apache.org/axis2</a></font><font size="2">"&gt;<br />
&lt;example1:Text&gt;<br />
Axis2 Echo String<br />
&lt;/example1:Text&gt;<br />
&lt;/example1:echo&gt;<br />
&lt;/soapenv:Body&gt;<br />
&lt;/soapenv:Envelope&gt;</font></div>
</div>
<div><font style="background-color: #ffffff;" color="#000000" size="2">&nbsp;&nbsp;&nbsp; sender.sendReceiveNonBlocking(payload, callback);这个调用接受一个callback对象作为参数。Axis2客户端API提供了一个抽象类CallBack，其中提供了方法：</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">public abstract void onComplete(AsyncResult result);<br />
public abstract void onError(Exception e);<br />
public boolean isComplete() {}</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">&nbsp;&nbsp;&nbsp; 用户需要重写"onComplete " 和 "onError "方法。一旦客户端收到Web Service的response，onComplete方法将会被调用，这样将中止阻塞状态。</font></div>
<div>&nbsp;</div>
<div><font size="2">2.5EchoNonBlockingDualClient<br />
&nbsp;&nbsp;&nbsp; 当调用的Web
Service需要很长一段时间来完成时，这种由Non-Blocking
API提供的解决方式将有一定的局限性。这种局限性是由使用单一的传输连接来调用Web
Service并接收response造成的。换句话说，客户端提供一种没有阻塞的调用机制，但request和response的传输使用单一的传输
（双工方式）连接（如HTTP）。长时间运行的Web Service调用或Web
Service调用使用单工传输方式（如SMTP）不能简单地利用一个没有阻塞的调用。<br />
&nbsp;&nbsp;&nbsp;
一种尝试地解决方法是request和response各自使用单独的传输连接（单工或双工均可）。这种方式产生的问题是如何解决相关性（关联
request和response）。WS-Addressing提供了一种很好的解决方法，在头中使用&lt;wsa:MessageID&gt;
和 &lt;wsa:RelatesTo&gt; 标签。Axis2对这种基于关联机制的寻址方式提供了支持。<br />
&nbsp;&nbsp;&nbsp;
用户可以选择Blocking 或Non-Blocking APIs的Web
Service，并使用两个传输连接。通过使用一个布尔标记，同一个API可以调用多个在两个传输连接上的Web Services(IN-OUT
operations)。下例使用Non-Blocking API 以及两个传输连接来实现上文中提到的"echo" operation。<br />
<u>EchoNonBlockingDualClient.java</u></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import org.apache.axis2.Constants;<br />
import org.apache.axis2.addressing.EndpointReference;<br />
import org.apache.axis2.client.Options;<br />
import org.apache.axis2.client.ServiceClient;<br />
import org.apache.axis2.client.async.AsyncResult;<br />
import org.apache.axis2.client.async.Callback;<br />
import javax.xml.namespace.QName;</font></div>
<div><font size="2">/**<br />
&nbsp;* Sample for asynchronous dual channel non-blocking service invocation.<br />
&nbsp;* Message Exchage Pattern IN-OUT<br />
&nbsp;* Ulitmate asynchronous service invocation sample.<br />
&nbsp;*/<br />
public class EchoNonBlockingDualClient {<br />
private static EndpointReference targetEPR =<br />
&nbsp;new EndpointReference("</font><font size="2"><a href="http://127.0.0.1:8080/axis2/services/MyService" target="_blank">http://127.0.0.1:8080/axis2/services/MyService</a></font><font size="2">");<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement payload = ClientUtil.getEchoOMElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTransportInProtocol(Constants.TRANSPORT_HTTP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="2"><font color="#5f9ea0">&nbsp;&nbsp; options.setUseSeparateListener(true);<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setAction("urn:echo");&nbsp; // this is the action mapping we put within the service.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Callback to handle the response<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Callback callback = new Callback() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onComplete(AsyncResult result) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result.getResponseEnvelope());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onError(Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Non-Blocking Invocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigurationContext sysContext = ConfigurationContextFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .createConfigurationContextFromFileSystem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:\\Dvp\\Axis2\\axis2\\WEB-INF", null);//见注解①<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender = new ServiceClient(sysContext, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.engageModule(new QName(Constants.MODULE_ADDRESSING));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.sendReceiveNonBlocking(payload, callback);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Wait till the callback receives the response.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!callback.isComplete()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Need to close the Client Side Listener.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axisFault.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="2"><font color="#5f9ea0">&nbsp; sender.finalizeInvoke();<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //have to ignore this<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<div><font style="background-color: #ffffff;"><font size="2">注解①<br />
</font><em><font size="2">RE: [Axis2] 0.95 WS-Addressing web SERVICE-SIDE: module not found<br />
&nbsp;&nbsp;&nbsp;
I now have managed to get EchoNonBlockingDualClient working. I still
can't get the original code to work, where ever I put
addressing-0.95.mar, but the ConfigurationContext works.<br />
&nbsp;&nbsp;&nbsp; The code I ended up with was:</font></em></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&nbsp;ConfigurationContext sysContext = ConfigurationContextFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .createConfigurationContextFromFileSystem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "C:\\axis2", null);<br />
&nbsp; sender = new ServiceClient(sysContext, null);</font></div>
</div>
<div><font style="background-color: #ffffff;"><font size="2"><em>&nbsp;&nbsp;&nbsp; with no need, obviously, for the .engageModule method.<br />
&nbsp;&nbsp;&nbsp;
I did discover though that the directory which the ConfigurationContext
points to has to have two directories within it: "conf", which must
contain the axis.xml configuration file, and the "modules" directory
which contains addressing-0.95.mar.</em> </font></font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;
在方法"options.setUseSeparateListener(...)"中的布尔标记通知通知Axis2引擎使用两个不同的传输连接来分别处
理request和response。Finally中的
"serviceClient.finalizeInvoke()"方法通知Axis2引擎停用客户端的用于接收response的listener。<br />
&nbsp;&nbsp;&nbsp; 在我们运行客户端的例程之前，我们还有一件事情要做。如前面提到的，Axis2使用基于地址的关联机制，因此我们必须在服务器端和客户端&#8220;搭建&#8221;寻址模块。</font></div>
<div><br />
<font size="2">结果：</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />
&lt;soapenv:Envelope xmlns:soapenv="</font><font size="2"><a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank">http://schemas.xmlsoap.org/soap/envelope/</a></font><font size="2">" xmlns:wsa="</font><font size="2"><a href="http://www.w3.org/2005/08/addressing" target="_blank">http://www.w3.org/2005/08/addressing</a></font><font size="2">"&gt;<br />
&lt;soapenv:Header&gt;<br />
&lt;wsa:To&gt;<a href="http://59.14.131.187:6060/axis2/services/__ANONYMOUS_SERVICE__/__OPERATION_OUT_IN__" target="_blank">http://59.14.131.187:6060/axis2/services/__ANONYMOUS_SERVICE__/__OPERATION_OUT_IN__</a><br />
&lt;/wsa:To&gt;<br />
&lt;wsa:ReplyTo&gt;<br />
&lt;wsa:Address&gt;<br />
</font><font size="2"><a href="http://www.w3.org/2005/08/addressing/anonymous" target="_blank">http://www.w3.org/2005/08/addressing/anonymous</a></font><br />
<font size="2">&lt;/wsa:Address&gt;<br />
&lt;/wsa:ReplyTo&gt;<br />
&lt;wsa:From&gt;<br />
&lt;wsa:Address&gt;<br />
</font><font size="2"><a href="http://127.0.0.1:8080/axis2/services/MyService" target="_blank">http://127.0.0.1:8080/axis2/services/MyService</a></font><br />
<font size="2">&lt;/wsa:Address&gt;<br />
&lt;/wsa:From&gt;<br />
&lt;wsa:FaultTo&gt;<br />
&lt;wsa:Address&gt;<br />
</font><font size="2"><a href="http://127.0.0.1:8080/axis2/services/MyService" target="_blank">http://127.0.0.1:8080/axis2/services/MyService</a></font><br />
<font size="2">&lt;/wsa:Address&gt;<br />
&lt;/wsa:FaultTo&gt;<br />
&lt;wsa:MessageID&gt;<br />
urn:uuid:B087CBB98F1B51A24711742241136206<br />
&lt;/wsa:MessageID&gt;<br />
&lt;wsa:Action&gt;urn:echo&lt;/wsa:Action&gt;<br />
&lt;wsa:RelatesTo wsa:RelationshipType="wsa:Reply"&gt;<br />
urn:uuid:CA4B9513377E6E9E1511742241130391<br />
&lt;/wsa:RelatesTo&gt;<br />
&lt;/soapenv:Header&gt;<br />
&lt;soapenv:Body&gt;<br />
&lt;example1:echo xmlns:example1="</font><font size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font size="2">" xmlns:tns="</font><font size="2"><a href="http://ws.apache.org/axis2" target="_blank">http://ws.apache.org/axis2</a></font><font size="2">"&gt;<br />
&lt;example1:Text&gt;<br />
Axis2 Echo String<br />
&lt;/example1:Text&gt;<br />
&lt;/example1:echo&gt;<br />
&lt;/soapenv:Body&gt;<br />
&lt;/soapenv:Envelope&gt;</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">[SimpleHTTPServer] Stop called</font></div>
<div>&nbsp;</div>
<div><font size="2">2.6 实现服务器端的寻址<br />
&nbsp;&nbsp;&nbsp;
根据Axis2的结构，寻址模块在"pre-dispatch"阶段已经给出它的句柄。因此，所谓的&#8220;搭建&#8221;仅仅是在&#8221;axis2.xml&#8221;（注意不是
services.xml）增加一个模块的引用。现在将下面这行字加入到axis2.xml，该文件在"/webapps/axis2/WEB-
INF/conf"目录下。</font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">&lt;module ref="addressing"/&gt;</font></div>
</div>
<div><font size="2">注： 一旦你改变了axis2.xml，你必须重启这个servlet容器，改变才能生效。</font></div>
<div>&nbsp;</div>
<div><font size="2">2.7 实现客户端的寻址<br />
&nbsp;&nbsp;&nbsp; 有两种方式。<br />
&nbsp;&nbsp;&nbsp;
一种方法是在%Axis2_HOME%\axis2-std-1.0-bin\modules目录下得到addressing-&lt;
version&gt;.mar。并且在你的classpath中对其可见。（此种方法目前，我还没有调试成功，具体见注解①。下面的第二种方法可用）<br />
&nbsp;&nbsp;&nbsp; 另一种方法是创建一个ConfigurationContext，指定一个repository位置。Axis2支持repository的方式来保存服务和模块。<br />
&nbsp;&nbsp;&nbsp;
你可以使用二进制distribution作为repository，只要它含有一个Axis2
repository认可的repository结构（其中应包含services和modules目录）。ConfigurationContext
中含有Axis2体系的运行时的上下文信息。 <br />
&nbsp;&nbsp;&nbsp;
如果你解压一个标准的二进制distribution到目录（譬如）$user_home/axis2/dist, 那么在 sender = new
ServiceClient();之前加入（具体见EchoNonBlockingDualClient.java）： </font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">new ServiceClient();之前加入（具体见EchoNonBlockingDualClient.java）： <br />
ConfigurationContext configContext = <br />
ConfigurationContextFactory.createConfigurationContextFromFileSystem(&lt; Axis2RepositoryLocation &gt;, null);</font></div>
</div>
<div><font style="background-color: #ffffff;" size="2">&nbsp;&nbsp;&nbsp; 用"sender = new ServiceClient(configContext, null);" 替换 "sender = new ServiceClient();"<br />
这样可以在客户端和服务器端都实现寻址。</font></div>
<div>&nbsp;</div>
<div><font size="2">2.8 EchoBlockingDualClient<br />
&nbsp;&nbsp;&nbsp;
这又是一个两路的传输的request/response客户端，但这次，我们使用一个Blocking
API。实现机制和EchoNonBlockingDualClient差不多，唯一的不同是，这里不需要使用一个callback对象来处理
response。<br />
<u>EchoBlockingDualClient.java</u></font></div>
<div style="border: 1px solid #aaaaaa; padding: 5px; background-color: #d3d3d3;">
<div><font size="2">package userguide.clients;</font></div>
<div><font size="2">import org.apache.axiom.om.OMElement;<br />
import org.apache.axis2.AxisFault;<br />
import org.apache.axis2.Constants;<br />
import org.apache.axis2.addressing.EndpointReference;<br />
import org.apache.axis2.client.Options;<br />
import org.apache.axis2.client.ServiceClient;</font></div>
<div><font size="2">import javax.xml.namespace.QName;<br />
import javax.xml.stream.XMLOutputFactory;<br />
import java.io.StringWriter;</font></div>
<div><font size="2">/**<br />
&nbsp;* Sample for synchronous dual channel blocking service invocation.<br />
&nbsp;* Message Exchage Pattern IN-OUT<br />
&nbsp;*/<br />
public class EchoBlockingDualClient {<br />
private static EndpointReference targetEPR =<br />
&nbsp;new EndpointReference("</font><font size="2"><a href="http://127.0.0.1:8080/axis2/services/MyService" target="_blank">http://127.0.0.1:8080/axis2/services/MyService</a></font><font size="2">");<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement payload = ClientUtil.getEchoOMElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setAction("urn:echo");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //The boolean flag informs the axis2 engine to use two separate transport connection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //to retrieve the response.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTransportInProtocol(Constants.TRANSPORT_HTTP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setUseSeparateListener(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Blocking Invocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigurationContext sysContext = ConfigurationContextFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .createConfigurationContextFromFileSystem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "D:\\Dvp\\Axis2\\axis2\\WEB-INF", null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender = new ServiceClient(sysContext, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.engageModule(new QName(Constants.MODULE_ADDRESSING));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement result = sender.sendReceive(payload);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringWriter writer = new StringWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.serialize(XMLOutputFactory.newInstance().createXMLStreamWriter(writer));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(writer.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Need to close the Client Side Listener.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axisFault.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.finalizeInvoke();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (AxisFault axisFault) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></div>
</div>
<font style="background-color: #ffffff;" size="2">结果：<br />
&lt;example1:echo xmlns:example1="</font><font style="background-color: #ffffff;" size="2"><a href="http://example1.org/example1" target="_blank">http://example1.org/example1</a></font><font style="background-color: #ffffff;" size="2">" xmlns:tns="</font><font style="background-color: #ffffff;" size="2"><a href="http://ws.apache.org/axis2" target="_blank">http://ws.apache.org/axis2</a></font><font size="2"><font style="background-color: #ffffff;">"&gt;<br />
&lt;example1:Text&gt;Axis2 Echo String &lt;/example1:Text&gt;<br />
&lt;/example1:echo&gt;<br />
[SimpleHTTPServer] Stop called</font> </font>
<img src ="http://www.blogjava.net/libin2722/aggbug/214223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-07-11 12:26 <a href="http://www.blogjava.net/libin2722/articles/214223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Axis2传递简单Java对象（POJO）</title><link>http://www.blogjava.net/libin2722/articles/214035.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 10 Jul 2008 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/214035.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/214035.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/214035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/214035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/214035.html</trackback:ping><description><![CDATA[<table id="content" style="table-layout: fixed; width: 650px" cellspacing="10" cellpadding="0" width="650" border="0">
    <tbody>
        <tr>
            <td>
            <div><strong>版权声明：</strong>原创作品，允许转载，转载时请务必以超链接形式标明文章 <a style="text-decoration: underline" href="http://zhangjunhd.blog.51cto.com/113473/26053" target="_blank">原始出处</a> 、作者信息和本声明。否则将追究法律责任。<a href="http://zhangjunhd.blog.51cto.com/113473/26053">http://zhangjunhd.51cto.com/113473/26053</a></div>
            </td>
        </tr>
        <tr>
            <td>
            <div>
            <div style="margin: 0cm 0cm 0pt; text-align: center" align="left"><font size="2"><em><span style="font-family: 宋体" new="" times="">本文介绍如何使用</span>Axis2</em><em><span style="font-family: 宋体" new="" times="">在</span>Web Service</em><em><span style="font-family: 宋体" new="" times="">中传递</span>Java</em><em><span style="font-family: 宋体" new="" times="">对象。</span></em></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">author: ZJ 07-5-7</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">Blog: </font><a href="http://zhangjunhd.blog.51cto.com/" target="_blank">http://zhangjunhd.blog.51cto.com/</a></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">在</span>Axis2_1.2<span style="font-family: 宋体" new="" times="">版本中提供了传递</span>Java<span style="font-family: 宋体" new="" times="">对象的功能（注：只有</span>1.1/1.2<span style="font-family: 宋体" new="" times="">版本提供，更早的</span>Axis2<span style="font-family: 宋体" new="" times="">版本没有此功能）。此项功能称为传输</span>POJO(a Plain Old Java Object)</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>1.</strong><strong><span style="font-family: 宋体" new="" times="">引入一个简单的</span>POJO- The Weather POJO</strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><u><font size="2">Weather.java</font></u></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">package sample.pojo.data;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">public class Weather {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float temperature;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String forecast;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean rain;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float howMuchRain;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setTemperature(float temp) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temperature = temp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public float getTemperature() {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return temperature;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setForecast(String fore) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; forecast = fore;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getForecast() {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return forecast;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setRain(boolean r) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rain = r;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean getRain() {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rain;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setHowMuchRain(float howMuch) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; howMuchRain = howMuch;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public float getHowMuchRain() {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return howMuchRain;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><em><font size="2">Note that it's all just straight POJOs with field items and getter and setter methods for each field.</font></em></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>2.</strong><strong><span style="font-family: 宋体" new="" times="">基于此</span>POJO</strong><strong><span style="font-family: 宋体" new="" times="">的</span>service</strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><u><font size="2">WeatherService.java</font></u></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">package sample.pojo.service;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import sample.pojo.data.Weather;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">public class WeatherService{</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; Weather weather;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; public void setWeather(Weather weather){</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.weather = weather;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; public Weather getWeather(){</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.weather;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>3.</strong><strong><span style="font-family: 宋体" new="" times="">相应的</span>services.xml</strong></font></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&lt;service name="WeatherService" scope="application"&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &lt;description&gt;Weather POJO Service&lt;/description&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &lt;messageReceivers&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;messageReceiver </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mep="http://www.w3.org/2004/08/wsdl/in-only"</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;messageReceiver</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mep="http://www.w3.org/2004/08/wsdl/in-out"</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &lt;/messageReceivers&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &lt;parameter name="ServiceClass"&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sample.pojo.service.WeatherService</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&lt;/service&gt;</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>4.</strong><strong><span style="font-family: 宋体" new="" times="">打包与部署</span></strong></font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体" new="" times=""><font size="2">将文件组织成：</font></span></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">- WeatherService</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp; - META-INF</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; - services.xml</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp; - sample</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; - pojo</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - data</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Weather.class</font></span></div>
                        <div style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - service</font></span></div>
                        <div style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - WeatherService.class</font></span></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">将其打包为</span>WeatherService.aar<span style="font-family: 宋体" new="" times="">，并部署在</span>Tomcat<span style="font-family: 宋体" new="" times="">上（详见 <strong><a href="http://zhangjunhd.blog.51cto.com/blog/113473/23690" target="_blank"><font color="#000000">基于Tomcat5.0和Axis2开发Web Service应用实例</font></a></strong> ）。</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>5</strong><strong><span style="font-family: 宋体" new="" times="">．测试</span></strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><u><font size="2">WeatherRPCClient.java</font></u></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">package sample.pojo.rpcclient;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.xml.namespace.QName;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.AxisFault;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.addressing.EndpointReference;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.client.Options;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.rpc.client.RPCServiceClient;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import sample.pojo.data.Weather;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">public class WeatherRPCClient {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args1) throws AxisFault {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RPCServiceClient serviceClient = new RPCServiceClient();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = serviceClient.getOptions();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EndpointReference targetEPR = new EndpointReference(</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; "http://localhost:8080/axis2/services/WeatherService");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Setting the weather</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QName opSetWeather = new QName("http://service.pojo.sample/xsd",</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; "setWeather");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Weather w = new Weather();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.setTemperature((float) 39.3);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.setForecast("Cloudy with showers");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.setRain(true);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.setHowMuchRain((float) 4.5);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] opSetWeatherArgs = new Object[] { w };</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceClient.invokeRobust(opSetWeather, opSetWeatherArgs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serviceClient.invokeRobust(opSetWeather, opSetWeatherArgs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Getting the weather</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QName opGetWeather = new QName("http://service.pojo.sample/xsd",</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; "getWeather");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] opGetWeatherArgs = new Object[] {};</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] returnTypes = new Class[] { Weather.class };</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] response = serviceClient.invokeBlocking(opGetWeather,</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; opGetWeatherArgs, returnTypes);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Weather result = (Weather) response[0];</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result == null) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Weather didn't initialize!");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Displaying the result</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Temperature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; + result.getTemperature());</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Forecast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; + result.getForecast());</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Rain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : " + result.getRain());</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("How much rain (in inches) : "</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; + result.getHowMuchRain());</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>6</strong><strong><span style="font-family: 宋体" new="" times="">．结果</span></strong></font></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">Temperature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 39.3</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">Forecast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Cloudy with showers</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">Rain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;: true</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">How much rain (in inches) &nbsp;&nbsp;&nbsp;: 4.5</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/libin2722/aggbug/214035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-07-10 17:23 <a href="http://www.blogjava.net/libin2722/articles/214035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2快速上手指南</title><link>http://www.blogjava.net/libin2722/articles/214034.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 10 Jul 2008 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/214034.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/214034.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/214034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/214034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/214034.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文链接:http://ws.apache.org/axis2/1_1_1/quickstartguide.html 本指南的目的是让你尽可能快的创建使用Axis2的服务和客户端，我们将使用一个简单的StockQuote服务并显示给你一些创建和部署它 的不同的方式，以及快速的看看Axis2自带的一些工具，然后我们将看看创建访问这些服务的客户端。 内容 Java代码 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/214034.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/214034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-07-10 17:22 <a href="http://www.blogjava.net/libin2722/articles/214034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Axis2传输附件(AXIS2 MTOM)--2</title><link>http://www.blogjava.net/libin2722/articles/214019.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 10 Jul 2008 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/214019.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/214019.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/214019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/214019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/214019.html</trackback:ping><description><![CDATA[<div>
<div style="margin: 0cm 0cm 0pt"><font size="2"><strong>5</strong><strong><span style="font-family: 宋体" new="" times="">．测试</span></strong></font></div>
<div style="margin: 0cm 0cm 0pt"><u><font size="2">FileTransferClient.java</font></u></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">package sample;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.File;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.FileOutputStream;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.InputStream;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.DataHandler;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.FileDataSource;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.attachments.utils.IOUtils;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMAbstractFactory;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMElement;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMFactory;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMNamespace;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMText;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.soap.SOAP11Constants;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.AxisFault;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.Constants;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.addressing.EndpointReference;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.client.Options;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.client.ServiceClient;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">public class FileTransferClient {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static EndpointReference targetEPR =</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;new EndpointReference("http://127.0.0.1:8080/axis2/services/FileOperation");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; public static boolean upload(String fileName, File file, String fileType) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; try {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = buildUploadEnvelope(fileName, file, fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = buildOptions();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = new ServiceClient();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The data in method upload: "+data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ome = sender.sendReceive(data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Convert the data to element in method upload: "+ome);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String b = ome.getText();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Boolean.parseBoolean(b);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return false;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; public static boolean download(String userName, String fileName, String fileType) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; try {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = buildDownloadEnvelope(userName, fileName, fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = buildOptions();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = new ServiceClient();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The data in method download: "+data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ome = sender.sendReceive(data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Convert the data to element in method download: "+ome);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMText binaryNode = (OMText) ome.getFirstOMChild();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binaryNode.setOptimize(true); //<span style="font-family: 宋体" new="" times="">必须加此句，否则会出现</span>ContentID is null<span style="font-family: 宋体" new="" times="">的异常</span>!</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataHandler actualDH = (DataHandler) binaryNode.getDataHandler();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream imageOutStream = new FileOutputStream("D:/userTemp/xx.gif");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = actualDH.getInputStream();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageOutStream.write(IOUtils.getStreamAsByteArray(is));</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return false;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static OMElement buildUploadEnvelope(String fileName, File file, String fileType) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; DataHandler expectedDH;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = fac.createOMElement("upload", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement fileContent = fac.createOMElement("fileContent", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; FileDataSource dataSource = new FileDataSource(file);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; expectedDH = new DataHandler(dataSource);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMText textData = fac.createOMText(expectedDH, true);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; fileContent.addChild(textData);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;OMElement _fileName = fac.createOMElement("fileName", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileName.setText(fileName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileType = fac.createOMElement("fileType", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileType.setText(fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(fileContent);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return data;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static OMElement buildDownloadEnvelope(String userName, String fileName, String fileType) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = fac.createOMElement("download", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement _userName = fac.createOMElement("userName", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _userName.setText(userName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileName = fac.createOMElement("fileName", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileName.setText(fileName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileType=fac.createOMElement("fileType", omNs);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileType.setText(fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_userName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileName);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileType);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return data;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static Options buildOptions() throws AxisFault {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; options.setTo(targetEPR);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; // enabling MTOM in the client side</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; options.setTransportInProtocol(Constants.TRANSPORT_HTTP);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return options;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; public static void main(String agrs[]) {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; String file = "D:/userTemp/ya.gif";</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; String fn = "testUser";</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; String ft="gif";</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; boolean rtv = upload(fn,new File(file),ft);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("is upload success: "+rtv);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; String un="zj";</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; String downfn="1";</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; if(download(un,downfn,ft)){</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("download success.");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; else System.out.println("download fail.");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Client main end.");</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
<div style="margin: 0cm 0cm 0pt"><font size="2"><strong>6.</strong><strong><span style="font-family: 宋体" new="" times="">结果</span></strong></font></div>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">察看</span>soap<span style="font-family: 宋体" new="" times="">消息，我们可以发现</span></font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;fd:upload xmlns:fd="http://example.org/filedata"&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileName&gt;testUser&lt;/fd:fileName&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileType&gt;gif&lt;/fd:fileType&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileContent&gt;RHQMLJJ4/AMZkEBAEAOw<span style="font-family: 宋体" new="" times="">（省略部分</span>2<span style="font-family: 宋体" new="" times="">进制代码）</span>&lt;/fd:fileContent&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;/fd:upload&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">Convert the data to element in method upload: </font></div>
            <div style="margin: 0cm 0cm 0pt 63pt; text-indent: -63pt; text-align: left" align="left"><font size="2">&lt;fd:response xmlns:fd=http://example.org/filedata xmlns:tns="http://ws.apache.org/axis2"&gt;true&lt;/fd:response&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt 63pt; text-indent: -63pt; text-align: left" align="left"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">The data in method download: </font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;fd:download xmlns:fd="http://example.org/filedata"&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:userName&gt;zj&lt;/fd:userName&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileName&gt;1&lt;/fd:fileName&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileType&gt;gif&lt;/fd:fileType&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;/fd:download&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">Convert the data to element in method download: </font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;fd:response xmlns:fd="http://example.org/filedata" xmlns:tns="http://ws.apache.org/axis2"&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">eIqGRwjkQAAAOw==<span style="font-family: 宋体" new="" times="">（省略部分</span>2<span style="font-family: 宋体" new="" times="">进制代码）</span></font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;/fd:response&gt;</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
<div style="margin: 0cm 0cm 0pt"><font size="2"><strong>7</strong><strong><span style="font-family: 宋体" new="" times="">．代码分析</span></strong></font></div>
<div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;<span style="font-family: 宋体" new="" times="">利用</span>Axis2<span style="font-family: 宋体" new="" times="">的</span>Mtom<span style="font-family: 宋体" new="" times="">发送附件应用了</span>builder<span style="font-family: 宋体" new="" times="">模式。要向一个</span>webserive <span style="font-family: 宋体" new="" times="">发送请求，首先就要构建一个请求的</span>Envelope,Axis2<span style="font-family: 宋体" new="" times="">构建</span>Envelope<span style="font-family: 宋体" new="" times="">的时候是利用的</span>Axis2<span style="font-family: 宋体" new="" times="">的</span>AXIOM api(<span style="font-family: 宋体" new="" times="">就是</span>axis2<span style="font-family: 宋体" new="" times="">的</span>java object<span style="font-family: 宋体" new="" times="">和</span>xml<span style="font-family: 宋体" new="" times="">的映射处理机制</span>),<span style="font-family: 宋体" new="" times="">其编程模式和</span>DOM<span style="font-family: 宋体" new="" times="">差不多的</span>.<span style="font-family: 宋体" new="" times="">看这一段</span>:</font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">private static OMElement buildUploadEnvelope(String mailboxnum, short greetingType, File file, String FileType) {</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 31.5pt"><font size="2">DataHandler expectedDH;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 31.5pt"><font size="2">...</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 31.5pt"><font size="2">return data;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">这一段其实是构建的</span>data<span style="font-family: 宋体" new="" times="">对像是这样一段</span>xml<span style="font-family: 宋体" new="" times="">的</span>java object<span style="font-family: 宋体" new="" times="">代表：</span></font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;fd:upload xmlns:fd="http://example.org/filedata"&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileName&gt;testUser&lt;/fd:fileName&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileType&gt;gif&lt;/fd:fileType&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="2">&lt;fd:fileContent&gt;RHQMLJJ4/AMZkEBAEAOw<span style="font-family: 宋体" new="" times="">（省略部分</span>2<span style="font-family: 宋体" new="" times="">进制代码）</span>&lt;/fd:fileContent&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="2">&lt;/fd:upload&gt;</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">其中的</span>Dwvc2VydmljZT4NCjwvZGVwbG95bWVudD4NCg0K<span style="font-family: 宋体" new="" times="">是要传送的文件的内容代表，至于什么编码，我没有深究。注意这一句</span>:</font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">OMElement data = fac.createOMElement("upload", omNs);</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">这里的&#8220;</span>upload<span style="font-family: 宋体" new="" times="">&#8221;参数对应的是</span>webservice<span style="font-family: 宋体" new="" times="">的一个操作的名称，这个操作的名称是跟</span>webservice<span style="font-family: 宋体" new="" times="">的</span>server<span style="font-family: 宋体" new="" times="">端实现类的方法名和</span>services.xml<span style="font-family: 宋体" new="" times="">的所定义的</span></font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">&lt;operationname="upload"&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; &lt;actionMapping&gt;urn:upload&lt;/actionMapping&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; &lt;messageReceiverclass="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/&gt;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&lt;/operation&gt;</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体" new="" times=""><font size="2">要一致的。</font></span></div>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体" new="" times=""><font size="2">再看看这一段，</font></span></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;private static Options buildOptions() {</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; Options options = new Options();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; ...</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return options;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">这里构建的</span>Options<span style="font-family: 宋体" new="" times="">对象，顾名思义就是调用</span>webservice<span style="font-family: 宋体" new="" times="">的相应的选项：比如这里就指定了</span>Soap<span style="font-family: 宋体" new="" times="">协议为</span>1.1 <span style="font-family: 宋体" new="" times="">版</span>,<span style="font-family: 宋体" new="" times="">指定了所请求的</span>service <span style="font-family: 宋体" new="" times="">的</span>EPR(<span style="font-family: 宋体" new="" times="">就是地址</span>)<span style="font-family: 宋体" new="" times="">，声明在</span>client<span style="font-family: 宋体" new="" times="">应用</span>MTOM<span style="font-family: 宋体" new="" times="">指定传输协议为</span>HTTP<span style="font-family: 宋体" new="" times="">。</span></font></div>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">构建好要传送的</span>data<span style="font-family: 宋体" new="" times="">和</span>options<span style="font-family: 宋体" new="" times="">后</span>,<span style="font-family: 宋体" new="" times="">所执行的代码为：</span></font></div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <div style="margin: 0cm 0cm 0pt"><font size="2">ServiceClient sender = new ServiceClient();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">设定选项</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">sender.setOptions(options);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">打印要传送的数据，为一段</span>xml</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">System.out.println(data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">传送数据，得到返回值</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">OMElement ome = sender.sendReceive(data);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">打印返回值，为一段</span>xml</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">System.out.println(ome);</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">析取返回值中的数据</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">String b = ome.getText();</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">//<span style="font-family: 宋体" new="" times="">返回</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">return Boolean.parseBoolean(b);</font></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">可以发现，</span>server<span style="font-family: 宋体" new="" times="">端和</span>client<span style="font-family: 宋体" new="" times="">的中间传递数据都是通过</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.axiom.om.OMElement<span style="font-family: 宋体" new="" times="">对象的，这个对象是一段</span>xml<span style="font-family: 宋体" new="" times="">的</span>java <span style="font-family: 宋体" new="" times="">对象映射。</span></font></div>
</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/214019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-07-10 16:54 <a href="http://www.blogjava.net/libin2722/articles/214019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)使用Axis2传输附件(AXIS2 MTOM)--1</title><link>http://www.blogjava.net/libin2722/articles/214018.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 10 Jul 2008 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/214018.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/214018.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/214018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/214018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/214018.html</trackback:ping><description><![CDATA[<table id="content" style="table-layout: fixed; width: 650px" cellspacing="10" cellpadding="0" width="650" border="0">
    <tbody>
        <tr>
            <td>
            <div><strong>版权声明：</strong>原创作品，允许转载，转载时请务必以超链接形式标明文章 <a style="text-decoration: underline" href="http://zhangjunhd.blog.51cto.com/113473/26960" target="_blank">原始出处</a> 、作者信息和本声明。否则将追究法律责任。<a href="http://zhangjunhd.blog.51cto.com/113473/26960">http://zhangjunhd.51cto.com/113473/26960</a></div>
            </td>
        </tr>
        <tr>
            <td>
            <div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><em><span style="font-family: 宋体" new="" times="">本文介绍如何使用</span>Axis2</em><em><span style="font-family: 宋体" new="" times="">传递附件。</span></em></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">author: ZJ 07-5-7</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">Blog: </font><a href="http://zhangjunhd.blog.51cto.com/" target="_blank">http://zhangjunhd.blog.51cto.com/</a></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>1</strong><strong><span style="font-family: 宋体" new="" times="">．工作环境</span></strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">IDE: Eclipse 3.1.2</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">jdk: jdk1.5.0_04</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">Tomcat: apache-tomcat-5.0.28</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">AXIS2:1.0(war<span style="font-family: 宋体" new="" times="">版本和</span>bin<span style="font-family: 宋体" new="" times="">版本</span>)</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>2</strong><strong><span style="font-family: 宋体" new="" times="">．实现</span></strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; <span style="font-family: 宋体" new="" times="">在</span>Eclipse<span style="font-family: 宋体" new="" times="">新建一个动态</span>web<span style="font-family: 宋体" new="" times="">工程，在</span>WEB-INF"lib<span style="font-family: 宋体" new="" times="">下加入</span>axis2<span style="font-family: 宋体" new="" times="">所需的</span>jar<span style="font-family: 宋体" new="" times="">包。</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体" new="" times="">本例的是一个系统的用户上传下载图片格式文件的例子，每次上传出携带附件外，还包括文件名</span>, <span style="font-family: 宋体" new="" times="">文件类型。此</span>webservice<span style="font-family: 宋体" new="" times="">实现的</span>2<span style="font-family: 宋体" new="" times="">个功能就是</span>upload, download.</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;AXIS2<span style="font-family: 宋体" new="" times="">的</span>webservice<span style="font-family: 宋体" new="" times="">发布的时候是打包成</span>xxx.aar<span style="font-family: 宋体" new="" times="">发布的，</span>xxx.aar<span style="font-family: 宋体" new="" times="">展开后的目录结构为</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;--</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; --META-INF</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; services.xml</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; --<span style="font-family: 宋体" new="" times="">包含</span>server<span style="font-family: 宋体" new="" times="">端实现的</span>class( <span style="font-family: 宋体" new="" times="">目录跟</span>package<span style="font-family: 宋体" new="" times="">是一样的结构</span>)</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>3</strong><strong><span style="font-family: 宋体" new="" times="">．服务器端</span>FileTransferServer.java</strong></font></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">package sample;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.attachments.utils.IOUtils;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMAbstractFactory;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMElement;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMFactory;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMNamespace;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMText;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.AxisFault;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.File;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.FileOutputStream;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.InputStream;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.util.Iterator;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.DataHandler;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.FileDataSource;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">public class FileTransferServer {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final String TMP_PATH = "D:/temp";</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public OMElement upload(OMElement element) throws Exception {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileContent = null;//<span style="font-family: 宋体" new="" times="">文件内容</span></font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileName = null;//<span style="font-family: 宋体" new="" times="">文件名</span></font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileType = null;//<span style="font-family: 宋体" new="" times="">文件类型</span></font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The element for upload: " + element);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator _iterator = element.getChildElements(); _iterator</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; .hasNext();) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _ele = (OMElement) _iterator.next();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("fileContent")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; _fileContent = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("fileName")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; _fileName = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("fileType")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp; _fileType = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_fileContent == null || _fileType == null) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new AxisFault("Either Image or FileName is null");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMText binaryNode = (OMText) _fileContent.getFirstOMChild();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = _fileName.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileType = _fileType.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String storeDir = TMP_PATH + "/" + "tempTest";</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File dir = new File(storeDir);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!dir.exists()) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir.mkdir();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = storeDir + "/" + fileName + "." + fileType;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File uploadFile = new File(filePath);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uploadFile.exists()) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = storeDir + "/" + fileName + "(1)" + "." + fileType;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uploadFile = new File(filePath);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Extracting the data and saving</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataHandler actualDH;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actualDH = (DataHandler) binaryNode.getDataHandler();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream imageOutStream = new FileOutputStream(uploadFile);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = actualDH.getInputStream();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageOutStream.write(IOUtils.getStreamAsByteArray(is));</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // setting response</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; "fd");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ele = fac.createOMElement("response", ns);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.setText("true");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public OMElement download(OMElement element) throws Exception {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The element for download: " + element);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _userName = null;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileName = null;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileType = null;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator _iterator = element.getChildElements(); _iterator</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; .hasNext();) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement _ele = (OMElement) _iterator.next();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("userName")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; _userName = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("fileName")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; _fileName = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_ele.getLocalName().equalsIgnoreCase("fileType")) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; _fileType = _ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String userName = _userName.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = _fileName.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileType = _fileType.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = TMP_PATH + "/" + userName + "/" + fileName + "."</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; + fileType;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The filePath for download: " + filePath);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileDataSource dataSource = new FileDataSource(filePath);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataHandler expectedDH = new DataHandler(dataSource);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&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;&nbsp;&nbsp; "fd");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMText textData = fac.createOMText(expectedDH, true);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ele = fac.createOMElement("response", ns);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.addChild(textData);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ele;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">}</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><strong><font size="2">4.services.xml</font></strong></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This is a sample Web Service with two operations,echo and ping.</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; sample.FileTransferServer</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; urn:upload</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; urn:download</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; </font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体" new="" times="">将这两个文件打包并部署到</span>Tomcat<span style="font-family: 宋体" new="" times="">上（略）。</span></font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
            <div style="margin: 0cm 0cm 0pt"><font size="2"><strong>5</strong><strong><span style="font-family: 宋体" new="" times="">．测试</span></strong></font></div>
            <div style="margin: 0cm 0cm 0pt"><u><font size="2">FileTransferClient.java</font></u></div>
            <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
                        <div style="margin: 0cm 0cm 0pt"><font size="2">package sample;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.File;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.FileOutputStream;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import java.io.InputStream;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.DataHandler;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import javax.activation.FileDataSource;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.attachments.utils.IOUtils;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMAbstractFactory;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMElement;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMFactory;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMNamespace;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.om.OMText;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axiom.soap.SOAP11Constants;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.AxisFault;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.Constants;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.addressing.EndpointReference;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.client.Options;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">import org.apache.axis2.client.ServiceClient;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">public class FileTransferClient {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static EndpointReference targetEPR =</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;new EndpointReference("http://127.0.0.1:8080/axis2/services/FileOperation");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; public static boolean upload(String fileName, File file, String fileType) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; try {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = buildUploadEnvelope(fileName, file, fileType);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = buildOptions();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = new ServiceClient();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The data in method upload: "+data);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ome = sender.sendReceive(data);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Convert the data to element in method upload: "+ome);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String b = ome.getText();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Boolean.parseBoolean(b);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return false;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; public static boolean download(String userName, String fileName, String fileType) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; try {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = buildDownloadEnvelope(userName, fileName, fileType);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Options options = buildOptions();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServiceClient sender = new ServiceClient();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.setOptions(options);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("The data in method download: "+data);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMElement ome = sender.sendReceive(data);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Convert the data to element in method download: "+ome);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OMText binaryNode = (OMText) ome.getFirstOMChild();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binaryNode.setOptimize(true); //<span style="font-family: 宋体" new="" times="">必须加此句，否则会出现</span>ContentID is null<span style="font-family: 宋体" new="" times="">的异常</span>!</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataHandler actualDH = (DataHandler) binaryNode.getDataHandler();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream imageOutStream = new FileOutputStream("D:/userTemp/xx.gif");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = actualDH.getInputStream();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageOutStream.write(IOUtils.getStreamAsByteArray(is));</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return false;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; private static OMElement buildUploadEnvelope(String fileName, File file, String fileType) {</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; DataHandler expectedDH;</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMFactory fac = OMAbstractFactory.getOMFactory();</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement data = fac.createOMElement("upload", omNs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement fileContent = fac.createOMElement("fileContent", omNs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; FileDataSource dataSource = new FileDataSource(file);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; expectedDH = new DataHandler(dataSource);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMText textData = fac.createOMText(expectedDH, true);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; fileContent.addChild(textData);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;OMElement _fileName = fac.createOMElement("fileName", omNs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileName.setText(fileName);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; OMElement _fileType = fac.createOMElement("fileType", omNs);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; _fileType.setText(fileType);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileName);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(_fileType);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; data.addChild(fileContent);</font></div>
                        <div style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; return data;</font></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/libin2722/aggbug/214018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-07-10 16:54 <a href="http://www.blogjava.net/libin2722/articles/214018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3步把您的java程序转换为webservice</title><link>http://www.blogjava.net/libin2722/articles/162168.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162168.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162168.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162168.html</trackback:ping><description><![CDATA[1、选择要转换的java文件，生成class<br />
<br />
　　2、写wsdd<br />
<br />
　　3、发布<br />
<br />
　　剩下的就只有调用了wsdl2java<br />
<br />
　　我原来的系统是CICS的，对后台封装了一层，现在用webservice再封装一层，前台页面，控制，数据传输，数据处理统统都可以分开了，爽<br />
<br />
　　//以下是从网上找的关于AXIS的入门教程<br />
<br />
　　<strong>一、Axis安装 1、环境 J2SE SDK 1.3 or 1.4: 我使用 1.4.2 Servlet Container: 我使用的Tomcat 5.0<br />
<br />
　　</strong><br />
<br />
　　2、到 http://ws.apache.org/Axis/网站下载Axis安装包<br />
<br />
　　3、解压缩安装包，将Axis_UNZIP_PATH\Axis-version\webapps下的Axis包拷贝到TOMCAT_HOME\webapps\下，以下约定Axis_HOME为该TOMCAT_HOME\webapps\Axis目录<br />
<br />
　　4、启动tomcat,访问http://localhost:8080/Axis 检查安装是否成功<br />
<br />
　　5、以上步骤执行成功，可以开发webservice例子了<br />
<br />
　　Axis支持三种web service的部署和开发，分别为：<br />
<br />
　　1、Dynamic Invocation Interface ( DII)<br />
<br />
　　2、Stubs方式<br />
<br />
　　3、Dynamic Proxy方式<br />
<br />
　　<strong>二、编写DII(Dynamic Invocation Interface )方式web服务</strong><br />
<br />
　　1.编写服务端程序HelloClient<br />
<br />
　　public class HelloClient<br />
<br />
　　{<br />
<br />
　　public String getName(String name)<br />
<br />
　　{<br />
<br />
　　return "hello "+name;<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　2、将源码拷贝到Axis_HOME下，重命名为 HelloClient.jws<br />
<br />
　　3、访问连接http://localhost:8080/Axis/HelloClient.jws?wsdl，页面显示Axis自动生成的wsdl<br />
<br />
　　4、编写访问服务的客户端 TestHelloClient.java<br />
<br />
　　import org.apache.Axis.client.Call;<br />
<br />
　　import org.apache.Axis.client.Service;<br />
<br />
　　import javax.xml.namespace.QName;<br />
<br />
　　import javax.xml.rpc.ServiceException;<br />
<br />
　　import java.net.MalformedURLException;<br />
<br />
　　import java.rmi.RemoteException;<br />
<br />
　　public class SayHelloClient2<br />
<br />
　　{<br />
<br />
　　public static void main(String[] args)<br />
<br />
　　{<br />
<br />
　　try<br />
<br />
　　{<br />
<br />
　　String endpoint =<br />
<br />
　　"http://localhost:8080/Axis/HelloClient.jws";<br />
<br />
　　Service service = new Service();<br />
<br />
　　Call call = null;<br />
<br />
　　call = (Call) service.createCall();<br />
<br />
　　call.setOperationName(new QName(<br />
<br />
　　"http://localhost:8080/Axis/HelloClient.jws",<br />
<br />
　　"getName"));<br />
<br />
　　call.setTargetEndpointAddress<br />
<br />
　　(new java.net.URL(endpoint));<br />
<br />
　　String ret = (String) call.invoke(new Object[]<br />
<br />
　　{"zhangsan"});<br />
<br />
　　System.out.println("return value is " + ret);<br />
<br />
　　}<br />
<br />
　　catch (Exception ex)<br />
<br />
　　{<br />
<br />
　　ex.printStackTrace();<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　<strong>三、编写Dynamic Proxy方式访问服务</strong><br />
<br />
　　1、编写部署服务端程序，同上边DII方式，本次仍使用上边部署的HelloClient<br />
<br />
　　2、编写代理接口<br />
<br />
　　public interface HelloClientInterface<br />
<br />
　　extends java.rmi.Remote<br />
<br />
　　{<br />
<br />
　　public String getName(String name)<br />
<br />
　　throws java.rmi.RemoteException;<br />
<br />
　　}<br />
<br />
　　3、编写并执行客户端程序TestHelloClient.java<br />
<br />
　　import javax.xml.rpc.Service;<br />
<br />
　　import javax.xml.rpc.ServiceFactory;<br />
<br />
　　import java.net.URL;<br />
<br />
　　import javax.xml.namespace.QName;<br />
<br />
　　public class TestHelloClient<br />
<br />
　　{<br />
<br />
　　public static void main(String[] args)<br />
<br />
　　{<br />
<br />
　　try<br />
<br />
　　{<br />
<br />
　　String wsdlUrl =<br />
<br />
　　"http://localhost:8080/Axis/HelloClient.jws?wsdl";<br />
<br />
　　String nameSpaceUri =<br />
<br />
　　"http://localhost:8080/Axis/HelloClient.jws";<br />
<br />
　　String serviceName = "HelloClientService";<br />
<br />
　　String portName = "HelloClient";<br />
<br />
　　ServiceFactory serviceFactory =<br />
<br />
　　ServiceFactory.newInstance();<br />
<br />
　　Service afService =<br />
<br />
　　serviceFactory.createService(new URL(wsdlUrl),<br />
<br />
　　new QName(nameSpaceUri, serviceName));<br />
<br />
　　HelloClientInterface proxy = (HelloClientInterface)<br />
<br />
　　afService.getPort(new QName(<br />
<br />
　　nameSpaceUri, portName),<br />
<br />
　　HelloClientInterface.class);<br />
<br />
　　System.out.println<br />
<br />
　　("return value is "+proxy.getName("john") ) ;<br />
<br />
　　}catch(Exception ex)<br />
<br />
　　{<br />
<br />
　　ex.printStackTrace() ;<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　<strong>四、编写wsdd发布web服务，编写stub client访问web服务</strong><br />
<br />
　　1、编写服务端程序server,SayHello.java，编译server.SayHello.java<br />
<br />
　　package server;<br />
<br />
　　public class SayHello<br />
<br />
　　{<br />
<br />
　　public String getName(String name)<br />
<br />
　　{<br />
<br />
　　return "hello "+name;<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　2.编写LogHandler.java<br />
<br />
　　import org.apache.Axis.AxisFault;<br />
<br />
　　import org.apache.Axis.Handler;<br />
<br />
　　import org.apache.Axis.MessageContext;<br />
<br />
　　import org.apache.Axis.handlers.BasicHandler;<br />
<br />
　　import java.util.Date;<br />
<br />
　　public class LogHandler<br />
<br />
　　extends BasicHandler<br />
<br />
　　{<br />
<br />
　　public void invoke<br />
<br />
　　(MessageContext msgContext)<br />
<br />
　　throws AxisFault<br />
<br />
　　{<br />
<br />
　　/** Log an access each time<br />
<br />
　　we get invoked.<br />
<br />
　　*/<br />
<br />
　　try {<br />
<br />
　　Handler serviceHandler<br />
<br />
　　= msgContext.getService();<br />
<br />
　　Integer numAccesses =<br />
<br />
　　(Integer)serviceHandler.getOption("accesses");<br />
<br />
　　if (numAccesses == null)<br />
<br />
　　numAccesses = new Integer(0);<br />
<br />
　　numAccesses = new Integer<br />
<br />
　　(numAccesses.intValue() + 1);<br />
<br />
　　Date date = new Date();<br />
<br />
　　String result =<br />
<br />
　　date + ": service " +<br />
<br />
　　msgContext.getTargetService() +<br />
<br />
　　" accessed " + numAccesses + " time(s).";<br />
<br />
　　serviceHandler.setOption<br />
<br />
　　("accesses", numAccesses);<br />
<br />
　　System.out.println(result);<br />
<br />
　　} catch (Exception e)<br />
<br />
　　{<br />
<br />
　　throw AxisFault.makeFault(e);<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　3、编写wsdd文件<br />
<br />
　　deploy.wsdd<br />
<br />
　　&lt;deployment xmlns=<br />
<br />
　　"http://xml.apache.org/Axis/wsdd/"<br />
<br />
　　xmlns:java=<br />
<br />
　　"http://xml.apache.org/Axis/wsdd/providers/java"&gt;<br />
<br />
　　&lt;handler name="print" type="java:LogHandler"/&gt;<br />
<br />
　　&lt;service name="sayhello"<br />
<br />
　　provider="java:RPC"&gt;<br />
<br />
　　&lt;requestFlow&gt;<br />
<br />
　　&lt;handler type="print"/&gt;<br />
<br />
　　&lt;/requestFlow&gt;<br />
<br />
　　&lt;parameter name="className"<br />
<br />
　　value="server.SayHello"/&gt;<br />
<br />
　　&lt;parameter name="allowedMethods"<br />
<br />
　　value="*"/&gt;<br />
<br />
　　&lt;/service&gt;<br />
<br />
　　&lt;/deployment&gt;<br />
<br />
　　3、将编译后的文件拷贝到Axis_HOME/WEB-INF/classes下，如：D:\tomcat\webapps\Axis\WEB-INF\classes<br />
<br />
　　4、发布服务：<br />
<br />
　　java org.apache.Axis.client.AdminClient deploy.wsdd<br />
<br />
　　5、生成client stub文件<br />
<br />
　　a:方式1<br />
<br />
　　将SayHello.java拷贝到Axis_HOME/下，重命名为SayHello.jws，<br />
<br />
　　执行下面的命令生存client stub<br />
<br />
　　java org.apache.Axis.wsdl.WSDL2Java<br />
<br />
　　-p client<br />
<br />
　　http://localhost:8080<br />
<br />
　　/Axis/services/SayHello.jws?wsdl<br />
<br />
　　b:方式2<br />
<br />
　　执行如下命令生成SayHello.wsdl<br />
<br />
　　java org.apache.Axis.wsdl.Java2WSDL<br />
<br />
　　-oSayHello.wsdl -lhttp://localhost:8080<br />
<br />
　　/Axis/services/SayHello -nsayhello server.SayHello<br />
<br />
　　执行如下命令生成client stub<br />
<br />
　　java org.apache.Axis.wsdl.WSDL2Java<br />
<br />
　　SayHello.wsdl<br />
<br />
　　-p client<br />
<br />
　　生成的stub client文件列表为：<br />
<br />
　　1.SayHello.java<br />
<br />
　　2.SayHelloService.java。<br />
<br />
　　3.SayHelloServiceLocator.java<br />
<br />
　　4.SayHelloSoapBindingStub.java<br />
<br />
　　6、编写客户端程序，编译并执行<br />
<br />
　　public class SayHelloClient<br />
<br />
　　{<br />
<br />
　　public static void main(String[] args)<br />
<br />
　　{<br />
<br />
　　try<br />
<br />
　　{<br />
<br />
　　SayHelloService service = new client.<br />
<br />
　　SayHelloServiceLocator();<br />
<br />
　　client.SayHello_PortType<br />
<br />
　　client = service.getSayHello();<br />
<br />
　　String retValue=client.getName("zhangsan");<br />
<br />
　　System.out.println(retValue);<br />
<br />
　　}<br />
<br />
　　catch (Exception e)<br />
<br />
　　{<br />
<br />
　　System.err.println<br />
<br />
　　("Execution failed. Exception: " + e);<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　您也可以写server-config.wsdd<br />
<br />
　　&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
<br />
　　&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"<br />
<br />
　　xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<br />
<br />
　　&lt;globalConfiguration&gt;<br />
<br />
　　&lt;parameter name="adminPassword" value="admin"/&gt;<br />
<br />
　　&lt;parameter name="attachments.implementation"<br />
<br />
　　value="org.apache.axis.attachments.AttachmentsImpl"/&gt;<br />
<br />
　　&lt;parameter name="sendXsiTypes" value="true"/&gt;<br />
<br />
　　&lt;parameter name="sendMultiRefs" value="true"/&gt;<br />
<br />
　　&lt;parameter name="sendXMLDeclaration" value="true"/&gt;<br />
<br />
　　&lt;parameter name="axis.sendMinimizedElements" value="true"/&gt;<br />
<br />
　　&lt;requestFlow&gt;<br />
<br />
　　&lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br />
<br />
　　&lt;parameter name="scope" value="session"/&gt;<br />
<br />
　　&lt;/handler&gt;<br />
<br />
　　&lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br />
<br />
　　&lt;parameter name="scope" value="request"/&gt;<br />
<br />
　　&lt;parameter name="extension" value=".jwr"/&gt;<br />
<br />
　　&lt;/handler&gt;<br />
<br />
　　&lt;/requestFlow&gt;<br />
<br />
　　&lt;/globalConfiguration&gt;<br />
<br />
　　&lt;handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/&gt;<br />
<br />
　　&lt;handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/&gt;<br />
<br />
　　&lt;handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br />
<br />
　　&lt;handler name="print" type="java:stub.LogHandler"/&gt;<br />
<br />
　　&lt;service name="sayhello" provider="java:RPC"&gt;<br />
<br />
　　&lt;requestFlow&gt;<br />
<br />
　　&lt;handler type="print"/&gt;<br />
<br />
　　&lt;/requestFlow&gt;<br />
<br />
　　&lt;parameter name="className"<br />
<br />
　　value="stub.server.SayHello"/&gt;<br />
<br />
　　&lt;parameter name="allowedMethods"<br />
<br />
　　value="*"/&gt;<br />
<br />
　　&lt;/service&gt;<br />
<br />
　　&lt;transport name="http"&gt;<br />
<br />
　　&lt;requestFlow&gt;<br />
<br />
　　&lt;handler type="URLMapper"/&gt;<br />
<br />
　　&lt;handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/&gt;<br />
<br />
　　&lt;/requestFlow&gt;<br />
<br />
　　&lt;/transport&gt;<br />
<br />
　　&lt;transport name="local"&gt;<br />
<br />
　　&lt;responseFlow&gt;<br />
<br />
　　&lt;handler type="LocalResponder"/&gt;<br />
<br />
　　&lt;/responseFlow&gt;<br />
<br />
　　&lt;/transport&gt;<br />
<br />
　　&lt;/deployment&gt;
<div></div>
<br />
<a href="http://www.linuxpk.com/46235.html">本文来自：http://www.linuxpk.com/46235.html</a><br />
<img src ="http://www.blogjava.net/libin2722/aggbug/162168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:09 <a href="http://www.blogjava.net/libin2722/articles/162168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService实现包--AXIS2学习笔记一</title><link>http://www.blogjava.net/libin2722/articles/162167.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162167.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162167.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162167.html</trackback:ping><description><![CDATA[我比较懒惰，不想把user guide全部翻译，就记录一些点吧。<br />
<br />
　　Axis2是全新设计的，在2004年的&#8220;Axis峰会&#8221;上，大家决定采用新的架构来让Axis更加的富有弹性，更有效率，并且更加的可配置。Axis2现在具有的一些feature:<br />
<br />
　　Speed<br />
<br />
　　Low memory foot print<br />
<br />
　　AXIOM - AXis Object Model<br />
<br />
　　Hot Deployment<br />
<br />
　　Asynchronous Web Services<br />
<br />
　　MEP Support - Message Exchange Patterns<br />
<br />
　　Flexibility<br />
<br />
　　Stability<br />
<br />
　　Component-oriented deployment<br />
<br />
　　Transport framework<br />
<br />
　　WSDL support<br />
<br />
　　有些feature现在看不懂，还是先动手做一下，感性认识一下吧<br />
<br />
　　第一步：下载AXIS2。http://ws.apache.org/axis2/download.cgi。很有趣，在apache的Web Service 的Project目录下面还看不到AXIS2。要下那个binary的版本，因为里面有例程。<br />
<br />
　　第二步：Copy axis2.war到$TOMCAT_HOME/webapps目录下面。Tomcat好像只能用JDK1.4，我在JDK1.5 用不出来。<br />
<br />
　　第三步：打开 http://localhost:8080/axis2，就可以看到axis2的Welcome页面了。点一下Validate 和Services，看是不是都没有错误。都没有错误的话，就表示deploy成功了。那个adminstration页面可以通过上传文件来hot deploy Web service，可以用来remote deploy。<br />
<br />
　　第四步：研究例程。先从"samples/userguide/src"目录下的例程看起。看到写一个web service很简单嘛:<br />
<br />
　　public class MyService {<br />
<br />
　　public OMElement echo(OMElement element) throws XMLStreamException {<br />
<br />
　　//Praparing the OMElement so that it can be attached to another OM Tree.<br />
<br />
　　//First the OMElement should be completely build in case it is not fully built and still<br />
<br />
　　//some of the xml is in the stream.<br />
<br />
　　element.build();<br />
<br />
　　//Secondly the OMElement should be detached from the current OMTree so that it can be attached<br />
<br />
　　//some other OM Tree. Once detached the OmTree will remove its connections to this OMElement.<br />
<br />
　　element.detach();<br />
<br />
　　return element;<br />
<br />
　　}<br />
<br />
　　public void ping(OMElement element) throws XMLStreamException {<br />
<br />
　　//Do some processing<br />
<br />
　　}<br />
<br />
　　public void pingF(OMElement element) throws AxisFault{<br />
<br />
　　throw new AxisFault("Fault being thrown");<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　看得出来，函数统一使用OMElement作为参数。在META-INF目录下面有个services.xml文件：<br />
<br />
　　&lt;service name="MyService"&gt;<br />
<br />
　　&lt;description&gt;<br />
<br />
　　This is a sample Web Service with two operations,echo and ping.<br />
<br />
　　&lt;/description&gt;<br />
<br />
　　&lt;parameter name="ServiceClass" locked="false"&gt;userguide.example1.MyService&lt;/parameter&gt;<br />
<br />
　　&lt;operation name="echo"&gt;<br />
<br />
　　&lt;messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/&gt;<br />
<br />
　　&lt;/operation&gt;<br />
<br />
　　&lt;operation name="ping"&gt;<br />
<br />
　　&lt;messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/&gt;<br />
<br />
　　&lt;/operation&gt;<br />
<br />
　　&lt;/service&gt;<br />
<br />
　　呵呵，也很简单嘛。有返回值的就用RawXMLINOutMessageReceiver，没返回值的就用RawXMLINOnlyMessageReceiver。把它们编译(要把axis2的jar写到classpath里去)打包压到 MyService.aar，包里文件目录如下：<br />
<br />
　　./\META-INF/services.xml<br />
<br />
　　./userguide/example1/MyService.class<br />
<br />
　　把MyService.aar拷贝到$TOMCAT_HOME/webapps/axis2/WEB-INF/services，然后去点一下http://localhost:8080/axis2页面上的Services，也就是http://localhost:8080/axis2/listServices.jsp，就可以看到MyService已经被列出来了。<br />
<br />
　　关于调用web service的东西蛮多，下次写吧。 
<img src ="http://www.blogjava.net/libin2722/aggbug/162167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:09 <a href="http://www.blogjava.net/libin2722/articles/162167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Axis2笔记之三--安装运行Axis2</title><link>http://www.blogjava.net/libin2722/articles/162166.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162166.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162166.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162166.html</trackback:ping><description><![CDATA[我学习新东西的时候，喜欢马上就看到一个应用，这样有个感性的认识，学起来也生动。这里只记录如何运行Axis2。<br />
<br />
准备环境：<br />
WinXp, <br />
<a href="http://java.sun.com/">JDK5</a>：安装后并在系统环境变量中配置JAVA_HOME, PATH=%JAVA_HOME%\bin;,Classpath=.;%JAVA_HOME%\lib<br />
<a href="http://ant.apache.org/bindownload.cgi">ANT</a>: 按照文档安装好后可以在命令行运行：ant<br />
<br />
安装Axis2:<br />
下载已经编译的<a href="http://ws.apache.org/axis2/download.cgi">Axis2</a>，并解压缩到磁盘，在环境变量中配置Axis2_HOME;<br />
运行 $AXIS2_HOME\bin\axis2server.bat (Windows) ，访问地址 http://localhost:8080/axis2/services/ ，如果成功看到页面就表示Axis2已经安装成功，并且独立的web 容器也正常运行了！<br />
<br />
在Servlet容器中安装Axis2:<br />
1. 打一个axis2.war的包：打开命令行将路径转到：$AXIS_HOME/webapp，运行："ant create.war".<br />
2. 将axis2.war放到容器的webapps目录下： 执行ant命令后会在$AXIS2_HOME/dist中产生axis2.war，把这个war包copy到容器的webapps目录，一般启动容器就会自动部署了。<br />
3.验证：你可以访问 http://localhost:8080/axis2 如果页面出来：<br />
<img alt="clip_image006." src="http://ws.apache.org/axis2/1_1/images/clip_image006.jpg" /><br />
那么恭喜你，安装成功了！<br />
<br />
&nbsp;&nbsp;&nbsp; 访问Validate可以确定服务正常；<br />
&nbsp;&nbsp;&nbsp; 访问Administration,默认用户名admin,密码axis2，可以对axis2进行参数的修改以及上传服务。<br />
<br />
<br />
安装和运行axis2很简单吧，赶快行动，SOA来了！<br />
<img src ="http://www.blogjava.net/libin2722/aggbug/162166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:08 <a href="http://www.blogjava.net/libin2722/articles/162166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService实现包--AXIS2学习笔记二</title><link>http://www.blogjava.net/libin2722/articles/162165.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162165.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162165.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162165.html</trackback:ping><description><![CDATA[客户端的调用<br />
<br />
　　Web services提供的服务多种多样，有的可以马上获得结果，有的要消耗很长的时间。所以，如果我们需要多种调用方式来对付不同的情况。<br />
<br />
　　大多数的Web services都提供阻塞(Blocking)和非阻塞(Non-Blocking)两种APIs.<br />
<br />
　　这两个概念以前应该学过，简单说一下。<br />
<br />
　　Blocking API - 调用端要等被调用的函数运行完毕才继续往下走。<br />
<br />
　　Non-Bloking API - 调用端运行完调用函数以后就直接往下走了，调用端和被调用端是异步执行的。返回值是用回调函数来实现的。<br />
<br />
　　这种异步叫做API层异步（API Level Asynchrony）。他们只用到一个连接来发送和接收消息，而且，如果是那种需要运行很长时间的函数，还会碰到Time Out 错误，如果用两个连接分别处理发送和接收消息，调用的时间就可以缩短，也可以解决Time Out 问题。用两个连接来分别处理发送和接收消息，叫做传输层异步（Transport Level Asynchrony）。<br />
<br />
　　
<center><br />
<br />
　　<img src="http://www.linuxpk.com/imgfiles/2005.11.8.10.57.33.5.1.JPG"  alt="" /></center><br />
<br />
　　理论真无聊，还是来看实例吧。<br />
<br />
　　打开 Eclipse, 创建一个新Project, 新建一个叫userguide.clients的包, 把"samples\userguide\src\userguide\clients" 下面的文件都copy到那个包下面, 把AXIS2的lib下面的jar都加到ilbrary里面去(应该不用全加,懒一点就全加了吧.) 发现了关于echo的调用的方式, 居然有五个:<br />
<br />
　　EchoBlockingClient<br />
<br />
　　EchoBlockingDualClient<br />
<br />
　　EchoBlockingWsaBasedClient<br />
<br />
　　EchoNonBlockingClient<br />
<br />
　　EchoNonBlockingDualClient<br />
<br />
　　一个一个看吧.<br />
<br />
　　EchoBlockingClient.java<br />
<br />
　　public class EchoBlockingClient {<br />
<br />
　　private static EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/MyService");<br />
<br />
　　public static void main(String[] args) {<br />
<br />
　　try {<br />
<br />
　　OMElement payload = ClientUtil.getEchoOMElement();<br />
<br />
　　Call call = new Call();<br />
<br />
　　call.setTo(targetEPR);<br />
<br />
　　call.setTransportInfo(Constants.TRANSPORT_HTTP,<br />
<br />
　　Constants.TRANSPORT_HTTP,<br />
<br />
　　false);<br />
<br />
　　//Blocking invocation<br />
<br />
　　OMElement result = call.invokeBlocking("echo",<br />
<br />
　　payload);<br />
<br />
　　StringWriter writer = new StringWriter();<br />
<br />
　　result.serializeWithCache(XMLOutputFactory.newInstance()<br />
<br />
　　.createXMLStreamWriter(writer));<br />
<br />
　　writer.flush();<br />
<br />
　　System.out.println(writer.toString());<br />
<br />
　　} catch (AxisFault axisFault) {<br />
<br />
　　axisFault.printStackTrace();<br />
<br />
　　} catch (XMLStreamException e) {<br />
<br />
　　e.printStackTrace();<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　和一代几乎一样, 弄一个EndpointReference, 再弄一个call, 其他不一样,但是也很简单， 弄一个OMElement作为参数, 返回也是一个OMElement. 可惜运行居然有错.<br />
<br />
　　再来看双通道的版本<br />
<br />
　　EchoBlockingDualClient.java<br />
<br />
　　public class EchoBlockingDualClient {<br />
<br />
　　private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");<br />
<br />
　　public static void main(String[] args) {<br />
<br />
　　try {<br />
<br />
　　OMElement payload = ClientUtil.getEchoOMElement();<br />
<br />
　　Call call = new Call();<br />
<br />
　　call.setTo(targetEPR);<br />
<br />
　　call.engageModule(new QName(Constants.MODULE_ADDRESSING));<br />
<br />
　　call.setTransportInfo(Constants.TRANSPORT_HTTP,<br />
<br />
　　Constants.TRANSPORT_HTTP,<br />
<br />
　　true);<br />
<br />
　　//Blocking Invocation<br />
<br />
　　OMElement result = call.invokeBlocking("echo",<br />
<br />
　　payload);<br />
<br />
　　StringWriter writer = new StringWriter();<br />
<br />
　　result.serializeWithCache(XMLOutputFactory.newInstance()<br />
<br />
　　.createXMLStreamWriter(writer));<br />
<br />
　　writer.flush();<br />
<br />
　　System.out.println(writer.toString());<br />
<br />
　　//Need to close the Client Side Listener.<br />
<br />
　　call.close();<br />
<br />
　　} catch (AxisFault axisFault) {<br />
<br />
　　axisFault.printStackTrace();<br />
<br />
　　} catch (Exception ex) {<br />
<br />
　　ex.printStackTrace();<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　加了一句engageModule, 这句话好像没什么用，我删掉这句话也能运行的, 然后setTransportInfo最后一个参数改成了true. 关于setTransportInfo的三个参数, 第一个是发送的Transport, 第二个是接收的Transport, 第三个是"是否双通道", 支持的搭配形式如下:<br />
<br />
　　http, http, true<br />
<br />
　　http, http, false<br />
<br />
　　http,smtp,true<br />
<br />
　　smtp,http,true<br />
<br />
　　smtp,smtp,true<br />
<br />
　　看下一个吧，EchoNonBlockingClient，这个是单通道的非阻塞模式：<br />
<br />
　　public class EchoNonBlockingClient {<br />
<br />
　　private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");<br />
<br />
　　public static void main(String[] args) {<br />
<br />
　　try {<br />
<br />
　　OMElement payload = ClientUtil.getEchoOMElement();<br />
<br />
　　Call call = new Call();<br />
<br />
　　call.setTo(targetEPR);<br />
<br />
　　call.setTransportInfo(Constants.TRANSPORT_HTTP,<br />
<br />
　　Constants.TRANSPORT_HTTP,<br />
<br />
　　false);<br />
<br />
　　//Callback to handle the response<br />
<br />
　　Callback callback = new Callback() {<br />
<br />
　　public void onComplete(AsyncResult result) {<br />
<br />
　　try {<br />
<br />
　　StringWriter writer = new StringWriter();<br />
<br />
　　result.getResponseEnvelope().serializeWithCache(XMLOutputFactory.newInstance()<br />
<br />
　　.createXMLStreamWriter(writer));<br />
<br />
　　writer.flush();<br />
<br />
　　System.out.println(writer.toString());<br />
<br />
　　} catch (XMLStreamException e) {<br />
<br />
　　reportError(e);<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　public void reportError(Exception e) {<br />
<br />
　　e.printStackTrace();<br />
<br />
　　}<br />
<br />
　　};<br />
<br />
　　//Non-Blocking Invocation<br />
<br />
　　call.invokeNonBlocking("echo", payload, callback);<br />
<br />
　　//Wait till the callback receives the response.<br />
<br />
　　while (!callback.isComplete()) {<br />
<br />
　　Thread.sleep(1000);<br />
<br />
　　}<br />
<br />
　　} catch (AxisFault axisFault) {<br />
<br />
　　axisFault.printStackTrace();<br />
<br />
　　} catch (Exception ex) {<br />
<br />
　　ex.printStackTrace();<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　不同的地方，只是调用的方法从invokeBlocking变成了invokeNonBlocking，然后写了一个简单的匿名Callback类作为回调函数。关于这个Callback类，它是一个抽象类，其中有两个方法：onComplete和reportError，都是client端必须实现的，他还有一个Field，就是complete，可以用来设置和查询调用是否完成。可惜也不能运行，和上面的错误一样，是在createSOAPMessage的时候报null错误。<br />
<br />
　　看下一个EchoNonBlockingDualClient，非阻塞的双通道：<br />
<br />
　　public class EchoNonBlockingDualClient {<br />
<br />
　　private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/MyService");<br />
<br />
　　public static void main(String[] args) {<br />
<br />
　　try {<br />
<br />
　　OMElement payload = ClientUtil.getEchoOMElement();<br />
<br />
　　Call call = new Call();<br />
<br />
　　call.setTo(targetEPR);<br />
<br />
　　//The boolean flag informs the axis2 engine to use two separate transport connection<br />
<br />
　　//to retrieve the response.<br />
<br />
　　call.engageModule(new QName(Constants.MODULE_ADDRESSING));<br />
<br />
　　call.setTransportInfo(Constants.TRANSPORT_HTTP,<br />
<br />
　　Constants.TRANSPORT_HTTP,<br />
<br />
　　true);<br />
<br />
　　//Callback to handle the response<br />
<br />
　　Callback callback = new Callback() {<br />
<br />
　　public void onComplete(AsyncResult result) {<br />
<br />
　　try {<br />
<br />
　　StringWriter writer = new StringWriter();<br />
<br />
　　result.getResponseEnvelope().serializeWithCache(XMLOutputFactory.newInstance()<br />
<br />
　　.createXMLStreamWriter(writer));<br />
<br />
　　writer.flush();<br />
<br />
　　System.out.println(writer.toString());<br />
<br />
　　} catch (XMLStreamException e) {<br />
<br />
　　reportError(e);<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　public void reportError(Exception e) {<br />
<br />
　　e.printStackTrace();<br />
<br />
　　}<br />
<br />
　　};<br />
<br />
　　//Non-Blocking Invocation<br />
<br />
　　call.invokeNonBlocking("echo", payload, callback);<br />
<br />
　　//Wait till the callback receives the response.<br />
<br />
　　while (!callback.isComplete()) {<br />
<br />
　　Thread.sleep(1000);<br />
<br />
　　}<br />
<br />
　　//Need to close the Client Side Listener.<br />
<br />
　　call.close();<br />
<br />
　　} catch (AxisFault axisFault) {<br />
<br />
　　axisFault.printStackTrace();<br />
<br />
　　} catch (Exception ex) {<br />
<br />
　　ex.printStackTrace();<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　}<br />
<br />
　　双通道和单通道基本没什么不同，只是双通道的时候，它总是要 
<img src ="http://www.blogjava.net/libin2722/aggbug/162165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:08 <a href="http://www.blogjava.net/libin2722/articles/162165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Service实现包--AXIS2学习笔记一</title><link>http://www.blogjava.net/libin2722/articles/162164.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162164.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162164.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162164.html</trackback:ping><description><![CDATA[我比较懒惰，不想把user guide全部翻译，就记录一些点吧。<br />
　　<br />
　　Axis2是全新设计的，在2004年的&#8220;Axis峰会&#8221;上，大家决定采用新的架构来让Axis更加的富有弹性，更有效率，并且更加的可配置。Axis2现在具有的一些feature:<br />
　　Speed<br />
　　Low memory foot print<br />
　　AXIOM - AXis Object Model<br />
　　Hot Deployment<br />
　　Asynchronous Web Services<br />
　　MEP Support - Message Exchange Patterns<br />
　　Flexibility<br />
　　Stability<br />
　　Component-oriented deployment<br />
　　Transport framework<br />
　　WSDL support<br />
　　<br />
　　有些feature现在看不懂，还是先动手做一下，感性认识一下吧<br />
　　<br />
　　第一步：下载AXIS2。http://ws.apache.org/axis2/download.cgi。很有趣，在apache的Web Service 的Project目录下面还看不到AXIS2。要下那个binary的版本，因为里面有例程。<br />
　　<br />
　　第二步：Copy axis2.war到$TOMCAT_HOME/webapps目录下面。Tomcat好像只能用JDK1.4，我在JDK1.5 用不出来。<br />
　　<br />
　　第三步：打开 http://localhost:8080/axis2，就可以看到axis2的Welcome页面了。点一下Validate 和Services，看是不是都没有错误。都没有错误的话，就表示deploy成功了。那个adminstration页面可以通过上传文件来hot deploy Web service，可以用来remote deploy。<br />
　　<br />
　　第四步：研究例程。先从"samples/userguide/src"目录下的例程看起。看到写一个web service很简单嘛:<br />
　　<br />
　　public class MyService {<br />
　　public OMElement echo(OMElement element) throws XMLStreamException {<br />
　　//Praparing the OMElement so that it can be attached to another OM Tree.<br />
　　//First the OMElement should be completely build in case it is not fully built and still<br />
　　//some of the xml is in the stream.<br />
　　element.build();<br />
　　//Secondly the OMElement should be detached from the current OMTree so that it can be attached<br />
　　//some other OM Tree. Once detached the OmTree will remove its connections to this OMElement.<br />
　　element.detach();<br />
　　return element;<br />
　　}<br />
　　<br />
　　public void ping(OMElement element) throws XMLStreamException {<br />
　　//Do some processing<br />
　　}<br />
　　public void pingF(OMElement element) throws AxisFault{<br />
　　throw new AxisFault("Fault being thrown");<br />
　　}<br />
　　}<br />
　　<br />
　　看得出来，函数统一使用OMElement作为参数。在META-INF目录下面有个services.xml文件：<br />
　　&lt;service name="MyService"&gt;<br />
　　&lt;description&gt;<br />
　　This is a sample Web Service with two operations,echo and ping.<br />
　　&lt;/description&gt;<br />
　　&lt;parameter name="ServiceClass" locked="false"&gt;userguide.example1.MyService&lt;/parameter&gt;<br />
　　&lt;operation name="echo"&gt;<br />
　　&lt;messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/&gt;<br />
　　&lt;/operation&gt;<br />
　　&lt;operation name="ping"&gt;<br />
　　&lt;messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/&gt;<br />
　　&lt;/operation&gt;<br />
　　&lt;/service&gt;<br />
　　呵呵，也很简单嘛。有返回值的就用RawXMLINOutMessageReceiver，没返回值的就用RawXMLINOnlyMessageReceiver。把它们编译(要把axis2的jar写到classpath里去)打包压到 MyService.aar，包里文件目录如下：<br />
　　./\META-INF/services.xml<br />
　　./userguide/example1/MyService.class<br />
　　把MyService.aar拷贝到$TOMCAT_HOME/webapps/axis2/WEB-INF/services，然后去点一下http://localhost:8080/axis2页面上的Services，也就是http://localhost:8080/axis2/listServices.jsp，就可以看到MyService已经被列出来了。<br />
　　<br />
　　关于调用web service的东西蛮多，下次写吧。 
<img src ="http://www.blogjava.net/libin2722/aggbug/162164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:07 <a href="http://www.blogjava.net/libin2722/articles/162164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2:快速了解AXIOM </title><link>http://www.blogjava.net/libin2722/articles/162163.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162163.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162163.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162163.html</trackback:ping><description><![CDATA[<p>看一个简单的Web Service</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.jivaro.sq; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.HashMap; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;StockQuoteService&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;HashMap&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;getPrice(String&nbsp;symbol)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Parameter&nbsp;Symbole&nbsp;:&nbsp;"</span><span>&nbsp;+&nbsp;symbol); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;price&nbsp;=&nbsp;(Double)&nbsp;map.get(symbol); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(price&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;price.doubleValue(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="number">42.00</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;update(String&nbsp;symbol,&nbsp;</span><span class="keyword">double</span><span>&nbsp;price)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(symbol,&nbsp;price); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>这是一个简单的web service，和写一个类没有任何不同。持有一个map对象，getPrice方法，通过传入字符串，得到对应的金额，update方法则是添加了一个字符串-金额的组合，它对应的services.xml如下：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"StockQuoteService"</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">"application"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stock&nbsp;Quote&nbsp;Sample&nbsp;Service &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">messageReceivers</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">messageReceiver</span><span>&nbsp;</span><span class="attribute">mep</span><span>=</span><span class="attribute-value">"http://www.w3.org/2004/08/wsdl/in-only"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">messageReceiver</span><span>&nbsp;</span><span class="attribute">mep</span><span>=</span><span class="attribute-value">"http://www.w3.org/2004/08/wsdl/in-out"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.axis2.rpc.receivers.RPCMessageReceiver"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">messageReceivers</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">parameter</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"ServiceClass"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jivaro.sq.StockQuoteService &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">parameter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class=""><span class="tag"><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>这个服务很好理解。注意RPCInOnlyMessageReceiver和RPCMessageRecevier，前者是&#8220;只进&#8221;的方法，后者是&#8220;可进可出&#8221;的方法，分别对应了getPrice（有参数，有返回）和update（有参数，无返回）方法。</p>
<p><strong>从现在开始就要了解AXIOM了</strong></p>
<p>1、将上面的服务类转成用AXIOM来实现，看看发生了什么</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.jivaro.sq; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.xml.stream.XMLStreamException; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.apache.axiom.om.OMAbstractFactory; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.apache.axiom.om.OMElement; &nbsp;&nbsp;</span>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.apache.axiom.om.OMFactory; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.apache.axiom.om.OMNamespace; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.HashMap; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;StockQuoteAxiomService&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;HashMap&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;OMElement&nbsp;getPrice(OMElement&nbsp;element)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;XMLStreamException&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.build(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.detach(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMElement&nbsp;symboleElement&nbsp;=&nbsp;element.getFirstElement(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;symbol&nbsp;=&nbsp;symboleElement.getText(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;returnText&nbsp;=&nbsp;</span><span class="string">"42"</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;price&nbsp;=&nbsp;(Double)&nbsp;map.get(symbol); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(price&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnText&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;+&nbsp;price.doubleValue(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMFactory&nbsp;fac&nbsp;=&nbsp;OMAbstractFactory.getOMFactory(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMNamespace&nbsp;omNs&nbsp;=&nbsp;fac.createOMNamespace(</span><span class="string">"http://sq.jivaro.org"</span><span>,&nbsp;</span><span class="string">"tns"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMElement&nbsp;method&nbsp;=&nbsp;fac.createOMElement(</span><span class="string">"getPriceResponse"</span><span>,&nbsp;omNs); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMElement&nbsp;value&nbsp;=&nbsp;fac.createOMElement(</span><span class="string">"price"</span><span>,&nbsp;omNs); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.addChild(fac.createOMText(value,&nbsp;returnText)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addChild(value); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;method; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;update(OMElement&nbsp;element)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;XMLStreamException&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.build(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.detach(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMElement&nbsp;symbolElement&nbsp;=&nbsp;element.getFirstElement(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;symbol&nbsp;=&nbsp;symbolElement.getText(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OMElement&nbsp;priceElement&nbsp;=&nbsp;(OMElement)symbolElement.getNextOMSibling(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;price&nbsp;=&nbsp;priceElement.getText(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(symbol,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Double(price)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>天！代码瞬间被膨胀了，参数都被OMElement代替了，这究竟发生了什么（请参看2：services.xml发生了什么）,<font face="Arial">Axis2使用的是AXIOM(AXIs Object Model，一种基于StAX API的类DOM结构)。使用了AXIOM，就规定了服务所定义的方法中的参数必须是OMElement类型，所以我们看到参数的类型都是OMElement了。而方法内代码膨胀也就不足为奇了。</font></p>
<p>2、看看services.xml又发生了什么变化</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"StockQuoteService"</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">"application"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stock&nbsp;Quote&nbsp;Service &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"getPrice"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">messageReceiver</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"update"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">messageReceiver</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">parameter</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"ServiceClass"</span><span class="tag">&gt;</span><span>org.jivaro.sq.StockQuoteAxiomService</span><span class="tag"><span class="tag-name">parameter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class=""><span class="tag"><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>services.xml发生了变化，操作被明确地定义了出来<font face="Arial">，并定义了操作所对应地MessageReceiver，如getPrice对应的<messagereceiver></messagereceiver>是RawXMLINOutMessageReceiver，而update方法对应的<messagereceiver></messagereceiver>成了RawXMLINOnlyMessageReceiver。</font></p>
<p>这就是使用AXIOM发布的方式。对于AXIOM的理解将继续更新。接下来应该是真正理解AXIOM，包括它的性能，以及客户端如何调用了。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/162163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:05 <a href="http://www.blogjava.net/libin2722/articles/162163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Axis2笔记之四--创建pojo服务和客户端 </title><link>http://www.blogjava.net/libin2722/articles/162160.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 21 Nov 2007 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/162160.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/162160.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/162160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/162160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/162160.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先确定已经安装好axis2 并把相应的war包放到servlet容器下，我用的是 tomcat.&nbsp;&nbsp;&nbsp; 容器自动部署war包，可以看到下面的目录结构：&nbsp;&nbsp;&nbsp;&nbsp; 我们做的服务放在services目录下就可以了。第一步：创建服务 StockQuoteService.java package&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/162160.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/162160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-21 18:02 <a href="http://www.blogjava.net/libin2722/articles/162160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件实现Axis WebService客户端</title><link>http://www.blogjava.net/libin2722/articles/144162.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Tue, 11 Sep 2007 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/144162.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/144162.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/144162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/144162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/144162.html</trackback:ping><description><![CDATA[<strong>1 建立Eclipse插件</strong><br />
　　<br />
　　File-&gt;New-&gt;Project-&gt;Plug-in development的Plug-in project-&gt;Next，填写Project名,Next, 填写内容，Next，选择Create plug-in using one of the templates，选择Hello，World，Finish。<br />
　　<br />
　　在视图可看到plugin.xml,在<runtime>里加上运行调用Web Service所需jar包。内容如下：<br />
　　<br />
　　<?xml version="1.0" encoding="UTF-8"  ?><br />
　　<br />
　　<?eclipse version="3.0"  ?><br />
　　<br />
　　
<plugin<br />
　　<br />
　　id="colimas_plugin"<br />
　　<br />
　　name="Colimas_plugin Plug-in"<br />
　　<br />
　　version="1.0.0"<br />
　　<br />
　　provider-name="nova"<br />
　　<br />
　　class="colimas_plugin.Colimas_pluginPlugin"&gt;<br />
　　<br />
　　<runtime><br />
　　<br />
　　
<library name="colimas_plugin.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/activation.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/axis.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/commons-beanutils.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/commons-discovery-0.2.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/commons-logging-1.0.4.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/jaxrpc.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/xalan.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/xerces.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/saaj.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　
<library name="lib/mail.jar"><br />
　　<br />
　　<export name="*"  /><br />
　　<br />
　　</library>
<br />
　　<br />
　　</runtime><br />
　　<br />
　　<requires><br />
　　<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　</requires><br />
　　<br />
　　<extension<br />
　　<br />
　　point="org.eclipse.ui.actionSets"&gt;<br />
　　<br />
　　　　<br />
　　label="Sample Action Set"<br />
　　<br />
　　visible="true"<br />
　　<br />
　　id="colimas_plugin.actionSet"&gt;<br />
　　<br />
　　<menu<br />
　　<br />
　　label="Sample &amp;Menu"<br />
　　<br />
　　id="sampleMenu"&gt;<br />
　　<br />
　　<separator<br />
　　<br />
　　name="sampleGroup"&gt;<br />
　　<br />
　　</separator><br />
　　<br />
　　
<menu></menu><br />
　　<br />
　　　　<br />
　　label="&amp;Sample Action"<br />
　　<br />
　　icon="icons/sample.gif"<br />
　　<br />
　　class="colimas_plugin.actions.SampleAction"<br />
　　<br />
　　tooltip="Hello, Eclipse world"<br />
　　<br />
　　menubarPath="sampleMenu/sampleGroup"<br />
　　<br />
　　toolbarPath="sampleGroup"<br />
　　<br />
　　id="colimas_plugin.actions.SampleAction"&gt;<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　</extension></plugin>
<br />
　　<br />
　　<strong>2 建立调用Web Service类，该类实现调用Axis的WebService</strong><br />
　　<br />
　　/*<br />
　　<br />
　　*<br />
　　<br />
　　Created on 2005/07/30<br />
　　<br />
　　*<br />
　　<br />
　　* TODO To change the template for this generated file go to<br />
　　<br />
　　* Window - Preferences - Java - Code Style - Code Templates<br />
　　<br />
　　*/package com.nova.colimas.plugin.eclipse;<br />
　　<br />
　　import org.apache.axis.client.Call;<br />
　　<br />
　　import org.apache.axis.client.Service;<br />
　　<br />
　　import javax.xml.namespace.QName;import java.io.*;<br />
　　<br />
　　/**<br />
　　<br />
　　*@author tyrone<br />
　　<br />
　　*<br />
　　<br />
　　* TODO To change the template for this generated type comment go to<br />
　　<br />
　　* Window - Preferences - Java - Code Style - Code Templates<br />
　　<br />
　　*/<br />
　　<br />
　　public class SendFileClient {　private Call call;<br />
　　<br />
　　/**<br />
　　<br />
　　* The constructor.<br />
　　<br />
　　*/<br />
　　<br />
　　public SendFileClient() {<br />
　　<br />
　　try{<br />
　　<br />
　　Service　service=<br />
　　<br />
　　new Service();<br />
　　<br />
　　call　　= (Call) service.createCall();<br />
　　<br />
　　}catch(Exception ex){　 System.out.println(ex.getMessage());<br />
　　<br />
　　} } public void saveFile(){　try {　 String endpoint =　　"http://localhost:8080/axis/services/DocumentFileManagement";<br />
　　<br />
　　System.out.println("start web service");<br />
　　<br />
　　call.setTargetEndpointAddress( new java.net.URL(endpoint) );<br />
　　<br />
　　call.setOperationName(new QName("http://soapinterop.org/", "saveFile"));<br />
　　<br />
　　File fp=new File("D:\\MyProject\\colimas\\colimas_plugin\\lib\\mail.jar");<br />
　　<br />
　　BufferedInputStream in=new BufferedInputStream(new FileInputStream(fp));<br />
　　<br />
　　int len=in.available();<br />
　　<br />
　　byte[] contents=new byte[len];<br />
　　<br />
　　in.read(contents,0,len);<br />
　　<br />
　　System.out.println("begin run");<br />
　　<br />
　　//开始调用Web Service：DocumentFileManagement的saveFile方法<br />
　　<br />
　　String ret = (String) call.invoke( new Object[] {fp.getName(),contents} );<br />
　　<br />
　　in.close();<br />
　　<br />
　　} catch (Exception e) {　 System.err.println("error"+e.toString());<br />
　　<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　<strong>3 修改Action类的run方法</strong><br />
　　<br />
　　Action类的run方法里的内容是Eclipse插件真正要做到事<br />
　　<br />
　　package colimas_plugin.actions;import org.eclipse.jface.action.IAction;<br />
　　<br />
　　import org.eclipse.jface.viewers.ISelection;<br />
　　<br />
　　import org.eclipse.ui.IWorkbenchWindow;import org.eclipse.ui.IWorkbenchWindowActionDelegate;<br />
　　<br />
　　import org.eclipse.jface.dialogs.MessageDialog;<br />
　　<br />
　　import com.nova.colimas.plugin.eclipse.*;<br />
　　<br />
　　/**<br />
　　<br />
　　* Our sample action implements workbench action delegate.<br />
　　<br />
　　* The action proxy will be created by the workbench and<br />
　　<br />
　　* shown in the UI. When the user tries to use the action,<br />
　　<br />
　　* this delegate will be created and execution will be<br />
　　<br />
　　* delegated to it. * @see IWorkbenchWindowActionDelegate<br />
　　<br />
　　*/public class SampleAction implements IWorkbenchWindowActionDelegate { private IWorkbenchWindow window;<br />
　　<br />
　　/**<br />
　　<br />
　　* The constructor.<br />
　　<br />
　　*/ public SampleAction() { }<br />
　　<br />
　　/**<br />
　　<br />
　　* The action has been activated. The argument of the<br />
　　<br />
　　* method represents the 'real' action sitting<br />
　　<br />
　　* in the workbench UI.<br />
　　<br />
　　* @see IWorkbenchWindowActionDelegate#run<br />
　　<br />
　　*/ public void run(IAction action) {　SendFileClient client=new SendFileClient();<br />
　　<br />
　　client.saveFile();<br />
　　<br />
　　MessageDialog.openInformation(　　window.getShell(),<br />
　　<br />
　　"Colimas_plugin Plug-in",　　"Colimas Connected");<br />
　　<br />
　　} /**　* Selection in the workbench has been changed. We<br />
　　<br />
　　* can change the state of the 'real' action here<br />
　　<br />
　　* if we want, but this can only happen after<br />
　　<br />
　　* the delegate has been created.<br />
　　<br />
　　* @see IWorkbenchWindowActionDelegate#selectionChanged<br />
　　<br />
　　*/ public void selectionChanged(IAction action, ISelection selection) { }<br />
　　<br />
　　/**<br />
　　<br />
　　* We can use this method to dispose of any system<br />
　　<br />
　　* resources we previously allocated.<br />
　　<br />
　　* @see IWorkbenchWindowActionDelegate#dispose<br />
　　<br />
　　*/ public void dispose() { }<br />
　　<br />
　　/**<br />
　　<br />
　　* We will cache window object in order to<br />
　　<br />
　　* be able to provide parent shell for the message dialog.<br />
　　<br />
　　* @see IWorkbenchWindowActionDelegate#init<br />
　　<br />
　　*/ public void init(IWorkbenchWindow window) {　this.window = window;<br />
　　<br />
　　}<br />
　　<br />
　　<strong>4 调试</strong><br />
　　<br />
　　首先启动Axis服务器，然后选择Eclipse的Run菜单的Run As -〉Run time workbench。<br />
　　<br />
　　这样会启动另一个Eclipse workbench，在这个workbench里你会看到toolbar里新增了一个按钮，<br />
　　<br />
　　点击按钮就会调用Webservice并返回控制台结果。
<img src ="http://www.blogjava.net/libin2722/aggbug/144162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-09-11 10:12 <a href="http://www.blogjava.net/libin2722/articles/144162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>教你学会XML Web Service 的基础 </title><link>http://www.blogjava.net/libin2722/articles/144161.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Tue, 11 Sep 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/144161.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/144161.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/144161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/144161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/144161.html</trackback:ping><description><![CDATA[<strong>什么是 XML Web Service?</strong><br />
　　<br />
　　XML Web Service 是在 Internet 上进行分布式计算的基本构造块。开放的标准以及对用户和应用程序之间的通信和协作的关注产生了这样一种环境，在这种环境下，XML Web Service 成为应用程序集成的平台。应用程序是通过使用多个不同来源的 XML Web Service 构造而成的，这些服务相互协同工作，而不管它们位于何处或者如何实现。<br />
　　<br />
　　有多少个构建 XML Web Service 的公司，就可能有多少种 XML Web Service 定义。不过几乎所有定义都具有以下共同点:<br />
　　<br />
　　1.　XML Web Service 通过标准的 Web 协议向 Web 用户提供有用的功能。多数情况下使用 SOAP 协议。<br />
　　<br />
　　2.　XML Web Service 可以非常详细地说明其接口，这使用户能够创建客户端应用程序与它们进行通信。这种说明通常包含在称为 Web 服务说明语言 (WSDL) 文档的 XML 文档中。<br />
　　<br />
　　3.　XML Web Service 已经过注册，以便潜在用户能够轻易地找到这些服务，这是通过通用发现、说明和集成 (UDDI) 来完成的。<br />
　　<br />
　　XML Web Service 体系结构的主要优点之一是:允许在不同平台上、以不同语言编写的各种程序以基于标准的方式相互通信。对这一行业有所了解的用户可能马上会说:&#8220;等一等，CORBA 和之前的 DCE 不是都做过相同的承诺吗?这和它们有什么区别?&#8221;最重要的区别在于:SOAP 比以前的方法要简单得多，因此要实现与标准兼容的 SOAP，障碍也要少得多。上次统计时，该列表已经包含了 79 项。正如您所预料，多数大的软件公司都提供 SOAP 实现方案，但也有许多实现方案是由个别开发人员创建和维护的。相对以前的方案而言，XML Web Service 的另一大优点是使用标准的 Web 协议 - XML、HTTP 和 TCP/IP。许多公司都已经建立了 Web 基础结构，同时它们的员工在维护方面也都具备相应的知识和经验。因此，引入 XML Web Service 与引入以前的技术相比，其成本要低得多。<br />
　　<br />
　　我们将 XML Web Service 定义为:通过 SOAP 在 Web 上提供的软件服务，使用 WSDL 文件进行说明，并通过 UDDI 进行注册。那么，您也许要问:&#8220;使用 XML Web Service 能够做什么?&#8221;最初的 XML Web Service 通常是可以方便地并入应用程序的信息来源，如股票价格、天气预报、体育成绩等等。我们很容易想到，可以构建一整类应用程序以分析和汇总所关心的信息，并以各种方式提供这些信息;例如，您可以使用 Microsoft? Excel 电子表格来汇总所有的财务信息 - 股票、401K、银行存款、贷款等等。如果能够通过 XML Web Service 获得这些信息，Excel 就可以不断对其进行更新。这些信息中有些是免费的，有些则可能需要订阅才能获得相应服务。大部分这种信息现在已经可以在 Web 上找到了，但是 XML Web Service 可以使编程访问更简单，也更可靠。<br />
　　<br />
　　以 XML Web Service 方式提供现有应用程序，可以构建新的、更强大的应用程序，并利用 XML Web Service 作为构造块。例如，用户可以开发一个采购应用程序，以自动获取来自不同供应商的价格信息，从而使用户可以选择供应商，提交订单，然后跟踪货物的运输，直至收到货物。而供应商的应用程序除了在 Web 上提供服务外，还可以使用 XML Web Service 检查客户的信用、收取货款，并与货运公司办理货运手续。<br />
　　<br />
　　将来，某些最有趣的 XML Web Service 所支持的应用程序还可以利用 Web 完成目前无法完成的任务。例如，日历服务就是 Microsoft .NET My Services项目即将支持的服务之一。如果您的牙医和机械师通过这一 XML Web Service 提供其日程安排，您就可以通过网络与他们安排约会;如果您愿意，他们也可以直接在您的日历上约定清洁和日常保养的日期。不难想象，只要能够对 Web 进行编程，您就可以创建数以百计的应用程序。<br />
　　<br />
　　<strong>SOAP</strong><br />
　　<br />
　　Soap 是 XML Web Service 的通信协议。当把 SOAP 描述为一种通信协议时，多数人都会想到 DCOM 或 CORBA，并且会问&#8220;SOAP 如何激活对象?&#8221;或&#8220;SOAP 使用什么样的命名服务?&#8221;等问题。虽然 SOAP 实现方案可能会包含上述内容，但 SOAP 标准并未对其进行规定。SOAP 一种规范，用来定义消息的 XML 格式 - 这是规范中所必需的部分。包含在一对 SOAP 元素中的、结构正确的 XML 段就是 SOAP 消息。这是不是很简单?<br />
　　<br />
　　SOAP 规范的其他部分介绍如何将程序数据表示为 XML，以及如何使用 SOAP 进行远程过程调用 (RPC)。这些可选的规范部分用于实现 RPC 形式的应用程序，其中客户端将发出一条 SOAP 消息(包含可调用函数，以及要传送到该函数的参数)，然后服务器将返回包含函数执行结果的消息。目前，多数 SOAP 实现方案都支持 RPC 应用程序，这是因为习惯于开发 COM 或 CORBA 应用程序的编程人员熟悉 RPC 形式。SOAP 还支持文档形式的应用程序，在这类应用程序中，SOAP 消息只是 XML 文档的一个包装。文档形式的 SOAP 应用程序非常灵活，许多新的 XML Web Service 都利用这一特点来构建使用 RPC 难以实现的服务。<br />
　　<br />
　　SOAP 规范的最后一个可选部分定义了包含 SOAP 消息的 HTTP 消息的样式。此 HTTP 绑定非常重要，因为几乎所有当前的 OS(以及许多以前的 OS)都支持 HTTP。HTTP 绑定虽然是可选的，但几乎所有 SOAP 实现方案都支持 HTTP 绑定，因为它是 SOAP 的唯一标准协议。由于这一原因，人们通常误认为 SOAP 必须使用 HTTP。其实，有些实现方案也支持 MSMQ、MQ 系列、SMTP 或 TCP/IP 传输，但由于 HTTP 非常普遍，几乎所有当前的 XML Web Service 都使用它。由于 HTTP 是 Web 的核心协议，因此大多数组织的网络基础结构都支持 HTTP，并且员工已经了解了如何对其进行管理。如今，已经建立了用于 HTTP 的安全保护、监视和负载平衡的基础结构。<br />
　　<br />
　　开始使用 SOAP 时，最容易混淆的是 SOAP 规范及其许多实现方案之间的差异。多数使用 SOAP 的用户并不直接编写 SOAP 消息，而是使用 SOAP 工具包来创建和分析 SOAP 消息。这些工具包通常将函数调用从某种语言转换为 SOAP 消息。例如，Microsoft SOAP Toolkit 2.0 将 COM 函数调用转换为 SOAP，而 Apache Toolkit 将 JAVA 函数调用转换为 SOAP。函数调用的类型和支持的参数的数据类型随每个 SOAP 实现方案的不同而不同，因此适用于一个工具包的函数可能并不适用于另一个工具包。这并不是 SOAP 的限制，而是所使用的特定实现方案的限制。<br />
　　<br />
　　到目前为止，SOAP 最引人注目的特征是它可以在许多不同的软件和硬件平台上实现。这意味着 SOAP 可用于链接企业内部和外部的不同系统。过去曾试过多种方法以提出一个可用于系统集成的通用通信协议，但它们都没有象 SOAP 一样获得广泛的认可。为什么呢?因为与许多早期的协议相比，SOAP 更小巧，而且更易于实现。例如，DCE 和 CORBA 的实现需要数年时间，所以只发布了很少几个实现方案。而 SOAP 可以利用现有的 XML 分析器和 HTTP 库完成大部分艰苦的工作，因此 SOAP 实现方案在数月内便可完成。这就是为什么现在已经有 70 多个 SOAP 实现方案的原因。当然，SOAP 并不具备 DCE 或 CORBA 的全部功能，虽然功能减少了，但由于其复杂程度大大降低了，因此 SOAP 更易于应用。<br />
　　<br />
　　HTTP 的普及和 SOAP 的简单性使您几乎可以从任何环境调用它们，因此成为 XML Web Service 的理想基础。<br />
　　<br />
　　<strong>安全性如何?</strong><br />
　　<br />
　　通常，刚接触 SOAP 的用户提出的第一个问题就是 SOAP 如何解决安全性问题。在其早期开发阶段，SOAP 被看作是基于 HTTP 的协议，所以认为 HTTP 的安全性对于 SOAP 已经足够了。毕竟目前有数以千计的 Web 应用程序都在使用 HTTP 安全性，所以这对于 SOAP 确实已经足够。因此，当前的 SOAP 标准假定安全性属于传输问题，而并不作为安全性问题处理。<br />
　　<br />
　　当 SOAP 扩展至更为通用的协议，并运行于众多传输之上时，安全性问题就变得突出了。例如，HTTP 提供若干种方法对进行 SOAP 调用的用户进行身份验证，但是当消息从 HTTP 路由到 SMTP 传输时，怎样传播该身份标识呢?SOAP 是作为构造块协议进行设计的，所以幸运的是，已经有了相应的规范以基于 SOAP 为 Web 服务提供额外的安全保护功能。WS-Security 规范(英文)定义了一套完整的加密系统，而 WS-License 规范(英文)定义了相应的技术，以保证调用者的身份标识，并确保只有授权用户才可以使用 Web 服务。<br />
　　<br />
　　<strong>WSDL</strong><br />
　　<br />
　　WSDL (Web Services Description Language) 表示 Web 服务说明语言。在本文中，我们可以认为 WSDL 文件是一个 XML 文档，用于说明一组 SOAP 消息以及如何交换这些消息。换句话说，WSDL 对于 SOAP 的作用就象 IDL 对于 CORBA 或 COM 的作用。由于 WSDL 是 XML 文档，因此很容易进行阅读和编辑;但大多数情况下，它由软件生成和使用。<br />
　　<br />
　　要查看 WSDL 的值，可以假设您要调用由您的一位业务伙伴提供的 SOAP 方法。您可以要求对方提供一些 SOAP 消息示例，然后编写您的应用程序以生成并使用与示例类似的消息，但这样很容易出错。例如，您可能看到一个 2837 的客户 ID，并假设它为整数，而实际上它是一个字符串。WSDL 通过明确的表示法指定请求消息必须包含的内容以及响应消息的样式。<br />
　　<br />
　　WSDL 文件用于说明消息格式的表示法以 XML 架构标准为基础，这意味着它与编程语言无关，而且以标准为基础，因此适用于说明可从不同平台、以不同编程语言访问的 XML Web Service 接口。除说明消息内容外，WSDL 还定义了服务的位置，以及使用什么通信协议与服务进行通信。也就是说，WSDL 文件定义了编写使用 XML Web Service 的程序所需的全部内容。有几种工具可以读取 WSDL 文件，并生成与 XML Web Service 通信所需的代码。其中一些最强大的工具可在 Microsoft Visual Studio? .NET 中找到。<br />
　　<br />
　　当前，许多 SOAP 工具包都包括从现有程序接口生成 WSDL 文件的工具
<img src ="http://www.blogjava.net/libin2722/aggbug/144161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-09-11 10:11 <a href="http://www.blogjava.net/libin2722/articles/144161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>