﻿<?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-忆风-随笔分类-WebService&amp;SOA</title><link>http://www.blogjava.net/yifeng/category/35043.html</link><description>光是知道是不够的，必须要加以应用；光是希望是不够的，非去做不可。</description><language>zh-cn</language><lastBuildDate>Thu, 09 Oct 2008 21:21:23 GMT</lastBuildDate><pubDate>Thu, 09 Oct 2008 21:21:23 GMT</pubDate><ttl>60</ttl><item><title>Apache CXF 之 HelloWorld</title><link>http://www.blogjava.net/yifeng/archive/2008/10/10/233474.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Thu, 09 Oct 2008 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/10/10/233474.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/233474.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/10/10/233474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/233474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/233474.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;介绍: <span class="highlight">Apache CXF = Celtix + XFire，Apache CXF 的前身是叫Apache CeltiXfire，现在已经正式更名为Apache CXF 了，以下简称CXF。CXF继承了 Celtix 和 XFire 两大开源项目的精华，提供了对 JAX-WS全面的支持，并且提供了多种 Binding 、Data Binding、Transport 以及 Format的支持，并且可以根据实际项目的需要，采用 Code First 或者 WSDL First 来轻松地实现 Web Services 的发布和使用。 <br />
<br />
一、从<a href="http://cxf.apache.org/">http://cxf.apache.org/</a>得到CXF的jar包支持<br />
<br />
二、创建接口&#8220;HelloWorldService.java&#8221;：<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.yifeng.service;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_64_94_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_94_Open_Text.style.display='none'; Codehighlighter1_64_94_Closed_Image.style.display='inline'; Codehighlighter1_64_94_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_64_94_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_64_94_Closed_Text.style.display='none'; Codehighlighter1_64_94_Open_Image.style.display='inline'; Codehighlighter1_64_94_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;HelloWorldService&nbsp;</span><span id="Codehighlighter1_64_94_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_64_94_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sayHi(String&nbsp;text);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
</span><br />
<br />
三、实现接口&#8221;HelloWorldServiceImpl.java&#8220;：<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.yifeng.service.impl;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.yifeng.service.HelloWorldService;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_144_226_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_226_Open_Text.style.display='none'; Codehighlighter1_144_226_Closed_Image.style.display='inline'; Codehighlighter1_144_226_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_144_226_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_144_226_Closed_Text.style.display='none'; Codehighlighter1_144_226_Open_Image.style.display='inline'; Codehighlighter1_144_226_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorldServiceImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;HelloWorldService&nbsp;</span><span id="Codehighlighter1_144_226_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_144_226_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_180_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_224_Open_Text.style.display='none'; Codehighlighter1_180_224_Closed_Image.style.display='inline'; Codehighlighter1_180_224_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_180_224_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_180_224_Closed_Text.style.display='none'; Codehighlighter1_180_224_Open_Image.style.display='inline'; Codehighlighter1_180_224_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHi(String&nbsp;text)&nbsp;</span><span id="Codehighlighter1_180_224_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_180_224_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;text&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">，学习Apache&nbsp;CXF.</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
<br />
四、发布服务接口&#8221;Server.java&#8220;：<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.yifeng.server;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.cxf.frontend.ServerFactoryBean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.yifeng.service.HelloWorldService;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.yifeng.service.impl.HelloWorldServiceImpl;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_199_620_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_620_Open_Text.style.display='none'; Codehighlighter1_199_620_Closed_Image.style.display='inline'; Codehighlighter1_199_620_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_199_620_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_199_620_Closed_Text.style.display='none'; Codehighlighter1_199_620_Open_Image.style.display='inline'; Codehighlighter1_199_620_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Server&nbsp;</span><span id="Codehighlighter1_199_620_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_199_620_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_241_617_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_617_Open_Text.style.display='none'; Codehighlighter1_241_617_Closed_Image.style.display='inline'; Codehighlighter1_241_617_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_241_617_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_241_617_Closed_Text.style.display='none'; Codehighlighter1_241_617_Open_Image.style.display='inline'; Codehighlighter1_241_617_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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 id="Codehighlighter1_241_617_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_241_617_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;our&nbsp;service&nbsp;implementation</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldServiceImpl&nbsp;helloWorldImpl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HelloWorldServiceImpl();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;our&nbsp;Server</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerFactoryBean&nbsp;svrFactory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServerFactoryBean();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svrFactory.setServiceClass(HelloWorldService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svrFactory.setAddress(</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:9000/Hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svrFactory.setServiceBean(helloWorldImpl);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svrFactory.create();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>&nbsp;</p>
<p>五、创建Client,访问服务接口&#8220;Client.java&#8221;：<br />
</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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.yifeng.client;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.cxf.frontend.ClientProxyFactoryBean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.yifeng.service.HelloWorldService;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_150_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_481_Open_Text.style.display='none'; Codehighlighter1_150_481_Closed_Image.style.display='inline'; Codehighlighter1_150_481_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_150_481_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_150_481_Closed_Text.style.display='none'; Codehighlighter1_150_481_Open_Image.style.display='inline'; Codehighlighter1_150_481_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Client&nbsp;</span><span id="Codehighlighter1_150_481_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_150_481_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_192_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_478_Open_Text.style.display='none'; Codehighlighter1_192_478_Closed_Image.style.display='inline'; Codehighlighter1_192_478_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_192_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_192_478_Closed_Text.style.display='none'; Codehighlighter1_192_478_Open_Image.style.display='inline'; Codehighlighter1_192_478_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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 id="Codehighlighter1_192_478_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_192_478_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientProxyFactoryBean&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClientProxyFactoryBean();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setServiceClass(HelloWorldService.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setAddress(</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:9000/Hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldService&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HelloWorldService)&nbsp;factory.create();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(client.sayHi(</span><span style="color: #000000">"</span><span style="color: #000000">周大庆</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
六、结果：<br />
欢迎，周大庆 学习Apache CXF.<br />
<br />
呵呵，简单吧，这就是WebService ，希望能给入门的朋友提供帮助。
<img src ="http://www.blogjava.net/yifeng/aggbug/233474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-10-10 00:51 <a href="http://www.blogjava.net/yifeng/archive/2008/10/10/233474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService的基本概念</title><link>http://www.blogjava.net/yifeng/archive/2008/10/08/233040.html</link><dc:creator>忆风</dc:creator><author>忆风</author><pubDate>Tue, 07 Oct 2008 20:12:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng/archive/2008/10/08/233040.html</guid><wfw:comment>http://www.blogjava.net/yifeng/comments/233040.html</wfw:comment><comments>http://www.blogjava.net/yifeng/archive/2008/10/08/233040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng/comments/commentRss/233040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng/services/trackbacks/233040.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; font-size: 12px; line-height: 20px; ">
<p style="text-indent: 12pt; "><strong>WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求，轻量级的独立的通讯技术。</strong></p>
<p style="text-indent: 12pt; ">这种技术允许网络上的所有系统进行交互。随着技术的发展，一个Web服务可以包含额外的指定功能并且可以在多个B2B应用中协作通讯。 Web服务可以理解请求中上下文的关系，并且在每一个特定的情况下产生动态的结果。这些服务会根据用户的身份，地点以及产生请求的原因来改变不同的处理，用以产生一个唯一的，定制的方案。这种协作机制对那些只对最终结果有兴趣的用户来说，是完全透明的。</p>
<p style="text-indent: 12pt; "><strong>UDDI</strong></p>
<p style="text-indent: 12pt; ">在用户能够调用Web服务之前，必须确定这个服务内包含哪些商务方法，找到被调用的接口定义，还要在服务端来编制软件。所以，我们需要一种方法来发布我们的Web服务。 UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。UDDI 项目中的成员可以通过UDDI Business Registry (UBR) 来操作Web服务的调用，UBR是一个全球性的服务。 Web服务供应商可以在UBR中描述并且注册他们的服务。 用户可以在UBR中查找并定位那些他们需要的服务。 UDDI是一种根据描述文档来引导系统查找相应服务的机制。 UDDI包含标准的&#8220;白皮书&#8221;类型的商业查询方式， &#8220;黄皮书&#8221;类型的局部查找，以及 &#8220;绿皮书&#8221;类型的服务类型查找。 UDDI利用SOAP消息机制（标准的XML/HTTP）来发布，编辑，浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据，并且发送到注册中心或者由注册中心来返回需要的数据。</p>
<p style="text-indent: 12pt; "><strong>WSDL</strong></p>
<p style="text-indent: 12pt; ">对于商业用户来说，要找到一个自己需要使用的服务，他必须知道如何来调用。 WSDL (Web Services Description Language) 规范是一个描述接口，语义以及Web服务为了响应请求需要经常处理的工作的XML文档。这将使简单地服务方便，快速地被描述和记录。以下是一个WSDL的样例：</p>
<table width="80%" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#f9f9f9" class="content" style="color: #000000; font-family: 宋体; font-size: 12px; line-height: 20px; text-decoration: none; ">
    <tbody>
        <tr>
            <td><span class="code">
            <div align="left">&lt;?xml version="1.0"?><br />
            &lt;definitions name="StockQuote"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; targetNamespace="http://example.com/stockquote.wsdl"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:tns="http://example.com/stockquote.wsdl"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xsd1="http://example.com/stockquote.xsd"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns="http://schemas.xmlsoap.org/wsdl/"><br />
            &lt;types><br />
            &#160;&#160; &lt;schema targetNamespace=http://example.com/stockquote.xsd<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns="http://www.w3.org/2000/10/XMLSchema"><br />
            &#160;&#160;&#160;&#160;&#160; &lt;element name="TradePriceRequest"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;complexType><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;all><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name="tickerSymbol" type="string"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/all><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/complexType><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/element><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name="TradePrice"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;complexType><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;all><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name="price" type="float"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/all><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/complexType><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/element><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/schema><br />
            &#160;&#160;&#160;&#160; &lt;/types><br />
            &#160;&#160;&#160;&#160; &lt;message name="GetLastTradePriceInput"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;part name="body" element="xsd1:TradePriceRequest"/><br />
            &#160;&#160;&#160;&#160; &lt;/message><br />
            &#160;&#160;&#160;&#160; &lt;message name="GetLastTradePriceOutput"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;part name="body" element="xsd1:TradePrice"/><br />
            &#160;&#160;&#160; &lt;/message><br />
            &#160;&#160;&#160; &lt;portType name="StockQuotePortType"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;operation name="GetLastTradePrice"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input message="tns:GetLastTradePriceInput"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;output message="tns:GetLastTradePriceOutput"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/operation><br />
            &#160;&#160;&#160;&#160;&#160; &lt;/portType><br />
            &#160;&#160;&#160;&#160;&#160; &lt;binding name="StockQuoteSoapBinding"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type="tns:StockQuotePortType"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;soap:binding style="document"<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; transport="http://schemas.xmlsoap.org/soap/http"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;operation name="GetLastTradePrice"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;soap:operation<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; soapAction="http://example.com/GetLastTradePrice"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;soap:body use="literal"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/input><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;output><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;soap:body use="literal"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/output><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/operation><br />
            &#160;&#160;&#160;&#160;&#160; &lt;/binding><br />
            &#160;&#160;&#160;&#160; &lt;service name="StockQuoteService"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;documentation>My first service&lt;/documentation><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;port name="StockQuotePort" binding="tns:StockQuoteBinding"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;soap:address location="http://example.com/stockquote"/><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/port><br />
            &#160;&#160;&#160;&#160; &lt;/service><br />
            &#160; &lt;/definitions></div>
            </span></td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 12pt; ">它包含了以下的关键信息： 消息的描述和格式定义可以通过XML文档中的&lt;types>和&lt;message> 标记来传送。 &lt;portType> 标记中表示了消息传送机制。 (e.g. request-only, request-response, response-only) 。 &lt;binding> 标记指定了编码的规范 。 &lt;service> 标记中表示服务所处的位置 (URL)。 WSDL在UDDI中总是作为一个接口描述文档。因为UDDI是一个通用的用来注册WSDL规范的地方，UDDI的规范并不限制任何类型或者格式描述文档。这些文档可能是一个WSDL文档，或者是一个正规的包含导向文档的Web页面，也可能只是一个包含联系信息的电子邮件地址。现在Java提供了一个 Java API for WSDL (JWSDL)规范。它提供了一套能快速处理WSDL文档的方法，并且不用直接对XML文档进行操作，它会比JAXP更方便，更快速。</p>
<p style="text-indent: 12pt; "><strong>SOAP</strong></p>
<p style="text-indent: 12pt; ">当商业用户通过UDDI找到你的WSDL描述文档后，他通过可以Simple Object Access Protocol (SOAP) 调用你建立的Web服务中的一个或多个操作。 SOAP是XML文档形式的调用商业方法的规范，它可以支持不同的底层接口，象HTTP(S)或者SMTP。 之所以使用XML是因为它的独立于编程语言，良好的可扩展性以及强大的工业支持。之所以使用HTTP是因为几乎所有的网络系统都可以用这种协议来通信，由于它是一种简单协议，所以可以与任何系统结合，还有一个原因就是它可以利用80端口来穿越过防火墙。 SOAP的强大是因为它简单。SOAP是一种轻量级的，非常容易理解的技术，并且很容易实现。它有工业支持，可以从各主要的电子商务平台供应商那里获得。从技术角度来看，SOAP详细指明了如何响应不同的请求以及如何对参数编码。一个SOAP封装了可选的头信息和正文，并且通常使用HTTP POST方法来传送到一个HTTP 服务器，当然其他方法也是可以的，例如SMTP。SOAP同时支持消息传送和远程过程调用。以下是一个SOAP请求。</p>
<table width="80%" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#f9f9f9" class="content" style="color: #000000; font-family: 宋体; font-size: 12px; line-height: 20px; text-decoration: none; ">
    <tbody>
        <tr>
            <td><span class="code">POST /StockQuote HTTP/1.1<br />
            Host: www.stockquoteserver.com<br />
            Content-Type: text/xml; charset="utf-8"<br />
            Content-Length: nnnn&#160;<br />
            SOAPAction: "Some-URI" &lt;SOAP-ENV:Envelope<br />
            &#160;&#160;&#160; xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"<br />
            &#160;&#160;&#160; SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/><br />
            &#160;&#160;&#160; &lt;SOAP-ENV:Header><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 5<br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/t:Transaction><br />
            &#160;&#160;&#160; &lt;/SOAP-ENV:Header><br />
            &#160;&#160;&#160; &lt;SOAP-ENV:Body><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;m:GetLastTradePrice xmlns:m="Some-URI"><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;symbol>SUNW&lt;/symbol><br />
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/m:GetLastTradePrice><br />
            &#160;&#160;&#160; &lt;/SOAP-ENV:Body><br />
            &lt;/SOAP-ENV:Envelope></span></td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 12pt; "><strong>JAXR</strong></p>
<p style="text-indent: 12pt; ">为了支持UDDI在Java平台上的功能，Java APIs for XML Registries (JAXR)允许开发者来访问注册中心。 值得注意的是，JAXR并不是建立Web服务必需的，你可以利用其他常用的XML APIs来直接集成这些协议。 JAXR是一个方便的API，它提供了Java API来发布，查找以及编辑那些注册信息。它的重点在于基于XML的B2B应用，复杂的地址本查找以及对XML消息订阅的支持等Web服务。 它也可以用来访问其他类型的注册中心，象ebXML注册中心。这些对Web服务的注册信息进行的操作，可以使用当前的一些Web服务工具来完成（例如第三方的SOAP和ebXML消息工具）。另外，当JAXP提供了一致并具有针对性的API来完成这些操作，这将使开发变得更加容易。</p>
<p style="text-indent: 12pt; "><strong>JAX/RPC</strong></p>
<p style="text-indent: 12pt; ">为了使开发人员专注于建立象SOAP那样的基于XML的请求，JCP正在开发基于RPC (JAX/RPC) 的Java API。JAX/RPC是用来发送和接收方法调用请求的，它基于XML协议，象SOAP，或者其他的象XMLP (XML Protocol，要了解更多可以参考http://www.w3.org/2000/xp/)。JAX/RPC使你不用再关注这些协议的规范，使应用的开发更快速。不久，开发人员就不用直接以XML表示方法调用了。目前有很多第三方实现了SOAP，开发人员可以在不同的层次上调用SOAP，并选择使用哪一种。将来，JAX/RPC会取代这些APIs并提供一个统一的接口来构造以及处理SOAP RPC请求。在接收一个从商业伙伴那里过来的SOAP请求的时候，一个Java servlet用JAX/RPC来接收这个基于XML的请求。一旦接收到请求后，servlet会调用商务方法，并且把结果回复给商业伙伴。</p>
<p style="text-indent: 12pt; "><strong>JAXM</strong></p>
<p style="text-indent: 12pt; ">当从商业合作伙伴那里接收一个Web服务的请求时，我们需要Java API实现一个Servlet来处理ebXML消息，就象我们用JAX/RPC来处理SOAP请求一样。 Java API for XML Messaging (JAXM) 是集成XML消息标准（象ebXML消息或者SOAP消息）的规范。 这个API是用来推动XML消息处理的，它检测那些预定单的消息格式以及约束。它控制了所有的消息封装机制，用一种直观的方式分割了消息中的信息，象路由信息，发货单。这样，开发人员只要关注消息的有效负载，而不用去担心那些消息的重复处理。目前的开发人员用JAXP来实现JAXM将要提供的功能，JAXM将会提供一套非常具有针对性的API来处理基于XML的消息传送。这将大大简化开发人员的代码，并使它们具有统一的接口。 JAXM和JAX/RPC的差别在于处理消息导向的中间件以及远程过程调用的不同。JAXM注重于消息导向，而JAX/RPC是用来完成远程过程调用的。</p>
<p style="text-indent: 12pt; ">请注意，在JAXM 和 JAX/RPC技术成熟之前，开发人员还是依赖于第三方的SOAP APIs，象Apache SOAP, IdooXOAP, 以及 GLUE。当JAXM 和 JAX/RPC正式发布后，它将为当前不同的SOAP和ebXML消息提供统一的接口。就象JDBC位多种不同的数据库提供统一的接口。</p>
<p style="text-indent: 12pt; "><strong>JAXB</strong></p>
<p style="text-indent: 12pt; ">XML绑定技术可以把XML文档和Java对象进行自由转换。 用JAXB，你可以在后台的EJB层，把XML文档转换成Java对象。同样你也可以把从EJB中取出的Java对象转换成XML文档返回给用户。 JAXB接口提供了比SAX和DOM更高级的方法来处理XML文档。它提供的特性可以在XML数据和Java类之间互相映射，提供了一个简单的方法来转换XML数据。它比逐个解析标记更简单。</p>
</span>
<img src ="http://www.blogjava.net/yifeng/aggbug/233040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng/" target="_blank">忆风</a> 2008-10-08 04:12 <a href="http://www.blogjava.net/yifeng/archive/2008/10/08/233040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>