﻿<?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-SIMONE-随笔分类-AXIS</title><link>http://www.blogjava.net/wangxinsh55/category/9194.html</link><description>www.likeuu.com</description><language>zh-cn</language><lastBuildDate>Wed, 12 May 2010 19:39:46 GMT</lastBuildDate><pubDate>Wed, 12 May 2010 19:39:46 GMT</pubDate><ttl>60</ttl><item><title>java通过axis访问.net webService 简单例子</title><link>http://www.blogjava.net/wangxinsh55/archive/2010/05/11/320576.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Tue, 11 May 2010 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2010/05/11/320576.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/320576.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2010/05/11/320576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/320576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/320576.html</trackback:ping><description><![CDATA[<div>
原文地址：http://www.javaeye.com/topic/151541
<br />
在原文基础上加了点注释 呵呵。
<br />
<br />
所需jar包：
<br />
saaj.jar
<br />
wsdl4j-1.5.1.jar
<br />
commons-discovery-0.2.jar
<br />
commons-logging-1.0.4.jar
<br />
jaxrpc.jar
<br />
axis.jar
<br />
<br />
这些jar包都在axis项目下，
<br />
axis下载地址：http://ws.apache.org/axis/
<br />
<br />
java代码：<br />
// 需导入的类<br />
import javax.xml.namespace.QName;<br />
import org.apache.axis.client.Call;<br />
import org.apache.axis.client.Service;<br />
import org.apache.axis.encoding.XMLType;<br />
<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .net webService 地址<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String url="http://localhost:1246/WebSite3/Service.asmx"; &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .net webService 命名空间<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String namespace = "http://tempuri.org/"; &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .net webService 需调用的方法<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String methodName = "HelloWorld"; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String soapActionURI = "http://tempuri.org/HelloWorld"; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Service service = new Service();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Call call = (Call) service.createCall();<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.setTargetEndpointAddress(new java.net.URL(url)); &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.setUseSOAPAction(true); &nbsp;<br />
//&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;这个地方没设对就会出现Server was unable to read request的错误 &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.setSOAPActionURI(soapActionURI); &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置要调用的.net webService方法<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.setOperationName(new QName(namespace, methodName)); &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置该方法的参数，temp为.net webService中的参数名称<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.addParameter( new QName(namespace,"temp"), &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; org.apache.axis.encoding.XMLType.XSD_STRING,&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; javax.xml.rpc.ParameterMode.IN); &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置该方法的返回值<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;call.setReturnType(XMLType.XSD_STRING);<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.invoke(new Object[] { "kusix" });&nbsp; 中"kusix"为传入参数值<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String ret = (String) call.invoke(new Object[] { "kusix" }); &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("返回结果---&gt; " + ret); &nbsp;<br />
<br />
<br />
.net 代码 <br />
using System;<br />
using System.Web;<br />
using System.Web.Services;<br />
using System.Web.Services.Protocols;<br />
<br />
[WebService(Namespace = "http://tempuri.org/")]<br />
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]<br />
public class Service : System.Web.Services.WebService<br />
{<br />
&nbsp;&nbsp;&nbsp; public Service () {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果使用设计的组件，请取消注释以下行 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //InitializeComponent(); <br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; [WebMethod]<br />
&nbsp;&nbsp;&nbsp; public string HelloWorld(String temp) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return temp+" add by .net";<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
}<br />
<br />
<br />
<pre style="display: none;" name="code" class="c#">using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用设计的组件，请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld(String temp) {
return temp+" add by .net";
}
}
</pre>
</div>
<script type="text/javascript"><!--
google_ad_client = "pub-1076724771190722";
/* JE个人博客468x60 */
google_ad_slot = "5506163105";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/320576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2010-05-11 11:41 <a href="http://www.blogjava.net/wangxinsh55/archive/2010/05/11/320576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Apache Geronimo 和 Axis2 实现在线银行，第 1 部分: 服务：布设框架（3）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90798.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:45:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90798.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90798.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90798.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">
						<font face="Arial" size="4">结束语</font>
				</span>
		</p>
		<p>您已从头至尾地完成了 WSDL，从原始的 SOAP 结构到 WSDL 绑定。还成功地使用 Axis2 的 WSDLJava 工具将其编译成了 Java 代码，并在 Geronimo 上进行了测试与部署。</p>
		<p>请继续阅读第 2 部分，开发 Axis2 生成的 Java 代码，创建一个功能齐全的在线银行 Web 服务。稍后在第 3 部分中，我们将创建一个基于 Web 的客户机，与 Axis2 Web 服务进行通信，请继续关注本系列教程。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<p>
												<span class="atitle">
														<a name="download">
																<font face="Arial" size="4">下载</font>
														</a>
												</span>
										</p>
										<table class="data-table-1" cellspacing="0" cellpadding="0" width="70%" border="0">
												<tbody>
														<tr>
																<th>描述</th>
																<th>名字</th>
																<th style="TEXT-ALIGN: right">大小</th>
																<th>下载方法</th>
														</tr>
														<tr>
																<td class="tb-row">Part 1 source code</td>
																<td nowrap="">os-ag-onbank1.zip</td>
																<td style="TEXT-ALIGN: right" nowrap="">9KB</td>
																<td nowrap="">
																		<a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/opensource/os-ag-onbank1.zip">
																				<b>
																						<font color="#5c81a7">HTTP</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr valign="top">
																<td colspan="5">
																		<font color="#5c81a7">
																				<img height="12" alt="" src="https://www.ibm.com/i/c.gif" width="12" border="0" />
																		</font>
																</td>
														</tr>
														<tr>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/fw.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/whichmethod.html">
																				<font color="#5c81a7">关于下载方法的信息</font>
																		</a>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="50" />
																		</font>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/sout.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="http://www.adobe.com/products/acrobat/readstep2.html">
																				<font color="#5c81a7">Get Adobe® Reader®</font>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="resources">
						<span class="atitle">
								<font face="Arial" size="4">参考资料 </font>
						</span>
				</a>
		</p>
		<b>学习</b>
		<br />
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/edu/os-dw-os-ag-onbank1.html" target="_blank"><font color="#5c81a7">英文原文</font></a>。<br /><br /></li>
				<li>阅读关于 <a href="http://www.ibm.com/developerworks/opensource/library/ws-webaxis1/"><font color="#5c81a7">developing Web services using Axis2</font></a> 的文章（developerWorks，2005 年 11 月）。<br /><br /></li>
				<li>访问 <a href="http://ant.apache.org/manual/index.html"><font color="#5c81a7">Apache Ant 手册</font></a> 和 <a href="http://ws.apache.org/axis2/0_94/index.html"><font color="#5c81a7">Apache Axis2 0.94 文档</font></a>。<br /><br /></li>
				<li>获得 <a href="http://ws.apache.org/axis/java/index.html"><font color="#5c81a7">Apache Axis 文档</font></a>。<br /><br /></li>
				<li>访问 <a href="http://geronimo.apache.org/"><font color="#5c81a7">Apache Geronimo 主页</font></a>。 <br /><br /></li>
				<li>加入 <a href="http://geronimo.apache.org/mailing.html"><font color="#5c81a7">Apache Geronimo 邮件列表</font></a>，获得 Apache Geronimo 的信息。<br /><br /></li>
				<li>加入 <a href="http://ws.apache.org/axis2/mail-lists.html"><font color="#5c81a7">Axis2 邮件列表</font></a>。 <br /><br /></li>
				<li>查看 developer.com 推荐的 <a href="http://www.developer.com/open/article.php/3557741"><font color="#5c81a7">新 Axis2 部署架构</font></a> 相关内容。<br /><br /></li>
				<li>访问 <a href="http://wiki.apache.org/ws/FrontPage/Axis2"><font color="#5c81a7">Axis2 Wiki</font></a>。 <br /><br /></li>
				<li>查看 developerWorks 的 <a href="http://www.ibm.com/developerworks/webservices"><font color="#5c81a7">SOA 和 Web 服务专区</font></a>，其中提供了关于 Web 服务和 Web 服务标准的文章与教程。<br /><br /></li>
				<li>阅读教程 “<a href="http://www.ibm.com/developerworks/opensource/edu/ws-dw-ws-wsdm.html?S_TACT=105AGX44&amp;S_CMP=GRNMO"><font color="#5c81a7">Understand Web Services Distributed Management (WSDM)</font></a>” （developerWorks，2005 年 7 月），了解 WSDM 的理论及安装。<br /><br /></li>
				<li>访问 <a href="http://www.ibm.com/developerworks/opensource"><font color="#5c81a7">developerWorks 开放源码专区</font></a>，获得广泛的 how-to 信息、工具和项目更新，帮助您使用开放源码技术进行开发并将其与 IBM 产品共同使用。<br /><br /></li>
				<li>查看 developerWorks 的 <a href="http://www.ibm.com/developerworks/opensource/top-projects/geronimo.html"><font color="#5c81a7">Apache Geronimo 项目专区</font></a>，获得文章、教程和其他资源，帮助您立即开始使用 Geronimo 进行开发。<br /><br /></li>
				<li>查看 <a href="http://www.ibm.com/software/webservers/appserv/geronimo/?S_TACT=105AGX44&amp;S_CMP=GRNMO"><font color="#5c81a7">IBM 对 Apache Geronimo 的支持</font></a> 产品，这使您能在 IBM 的世界级支持下开发 Geronimo 应用程序。<br /><br /></li>
				<li>访问 developerWorks 中的 <a href="http://www.ibm.com/developerworks/opensource/top-projects/geronimo-starthere.html"><font color="#5c81a7">立即开始使用 Apache Geronimo</font></a> 部分，获得面向新手和经验丰富的用户的有用资源。<br /><br /></li>
				<li>访问 developerWorks 的开放源码专区，浏览所有 <a href="http://www.ibm.com/developerworks/views/opensource/libraryview.jsp?topic_by=All+topics+and+related+products&amp;sort_order=asc&amp;lcl_sort_order=desc&amp;search_by=apache&amp;search_flag=true&amp;type_by=Articles&amp;show_abstract=true&amp;start_no=1&amp;sort_by=Title&amp;end_no=100&amp;show_all=false"><font color="#5c81a7">Apache 文章</font></a> 与 <a href="http://www.ibm.com/developerworks/views/opensource/libraryview.jsp?topic_by=All+topics+and+related+products&amp;sort_order=desc&amp;lcl_sort_order=asc&amp;search_by=apache&amp;search_flag=true&amp;type_by=Tutorials&amp;show_abstract=true&amp;start_no=1&amp;sort_by=Title&amp;end_no=100&amp;show_all=false&amp;S_TACT=105AGX44&amp;S_CMP=article"><font color="#5c81a7">免费 Apache 教程</font></a>。<br /><br /></li>
				<li>访问 <a href="http://safari.bvdep.com/?x=1&amp;portal=bvdep&amp;uicode=&amp;Key=&amp;GUID=D1F1DB57-50AF-4998-99-DA-6D-BB-A5-E0-E4-0B"><font color="#5c81a7">Safari 书店</font></a>，浏览关于上述主题及其他技术的图书。</li>
		</ul>
		<br />
		<b>获得产品和技术</b>
		<br />
		<ul>
				<li>下载 <a href="http://ws.apache.org/axis2/"><font color="#5c81a7">Apache Axis2</font></a>，它提供了一个用于构建基于 Web 服务的应用程序的 SOAP 平台。<br /><br /></li>
				<li>使用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX44"><font color="#5c81a7">IBM 试用软件</font></a> 革新您的下一个开放源码开发项目，这些软件可通过下载获得，也可在 DVD 上获得。<br /><br /></li>
				<li>下载 <a href="http://geronimo.apache.org/"><font color="#5c81a7">Apache Geronimo 1.0</font></a>。<br /><br /></li>
				<li>下载免费的 <a href="http://www.ibm.com/developerworks/downloads/ws/wasce/?S_TACT=105AGX44&amp;S_CMP=WASCE"><font color="#5c81a7">IBM WebSphere® Application Server Community Edition V1.0</font></a> —— 轻量级 J2EE 应用服务器，构建于专为帮助您加速开发和部署工作而设计的 Apache Geronimo 开放源码技术之上。<br /><br /></li>
		</ul>
		<br />
		<b>讨论</b>
		<br />
		<ul>
				<li>
						<a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=541&amp;cat=51">
								<font color="#5c81a7">参与论坛讨论</font>
						</a>。<br /><br /></li>
				<li>访问 <a href="http://www.ibm.com/developerworks/blogs/dw_blog.jspa?blog=764"><font color="#5c81a7">Apache Geronimo blog</font></a>，了解 Geronimo 开发的最新信息。<br /><br /></li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/resources.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">
								<font face="Arial" size="4">关于作者</font>
						</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="70%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<font face="Arial" size="4">
												<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										</font>
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
												<font face="Arial" size="4">
												</font>
										</p>
								</td>
								<td>
										<font face="Arial" size="4">
												<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="4" />
										</font>
								</td>
								<td width="100%">
										<p>Nicholas Chase 参与过多家公司的网站开发，包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 曾是一名高中物理教师、放射性废弃品设施低级管理员、在线科幻杂志编辑、多媒体工程师、Oracle 讲师、一家交互式通信公司的首席技术官。他撰写了许多图书，其中包括 <i><a href="http://search.safaribooksonline.com/JVXSL.asp?x=1&amp;amp;mode=section&amp;amp;sortKey=rank&amp;amp;sortOrder=desc&amp;amp;view=section&amp;amp;xmlid=0-672-32422-9&amp;amp;k=20&amp;amp;g=&amp;amp;srchText=XML+Primer+Plus&amp;amp;code=&amp;amp;h=0&amp;amp;m=&amp;amp;l=1&amp;amp;j=list&amp;amp;catid=&amp;amp;s=1&amp;amp;b=1&amp;amp;f=1&amp;amp;t=1&amp;amp;c=1&amp;amp;u=1&amp;amp;r=&amp;amp;o=1&amp;amp;n=1&amp;amp;d=1&amp;amp;p=1&amp;amp;a=0&amp;amp;page=0"><font color="#5c81a7">XML Primer Plus</font></a></i>。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:45 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Apache Geronimo 和 Axis2 实现在线银行，第 1 部分: 服务：布设框架（2）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90797.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90797.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90797.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90797.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 公开 Web 服务：WSDL								在线银行服务由几种操作构成，在实现这些操作之前，我们将首先介绍一下各操作。您将了解到各操作的细节、消息、端口类型和 WSDL 绑定。																														操作																						之前已经看到了 在线银行 Web 服务的概述。现在将了解构建此 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90797.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:40 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Apache Geronimo 和 Axis2 实现在线银行，第 1 部分: 服务：布设框架（1）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90796.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90796.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90796.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90796.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90796.html</trackback:ping><description><![CDATA[
		<p>级别: 中级</p>
		<p>
				<a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/authors.html">
						<font color="#5c81a7">Nicholas Chase</font>
				</a> (<a href="mailto:ibmquestions@nicholaschase.com?subject=服务：布设框架&amp;cc=ruterbo@us.ibm.com"><font color="#5c81a7">ibmquestions@nicholaschase.com</font></a>), 自由作者, Backstop Media, LLC<br /></p>
		<p>2006 年 5 月 25 日</p>
		<blockquote>使用 Apache Geronimo 和 Axis2 构建复杂 Web 服务应用程序是一项错综复杂的任务，本系列将深入研究相关内容。本系列教程由 3 个部分构成，引领您构建一个示例在线银行 Web 服务，文中介绍了整个流程的每个步骤，因此新用户可快速掌握概念并构建一个完整的 Web 服务和可与 Web 服务连接并通信的 Web 界面客户机。在第一期中，将为您介绍示例 Web 服务和使用 WSDL 的 Web 服务，构建并编译 WSDL 文件，然后在 Geronimo 上测试及部署它。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!--#include virtual="/developerworks/cn/inc/s-search-query-capture.inc"-->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<span class="atitle">
						<font face="Arial" size="4">开始之前</font>
				</span>
		</p>
		<p>本系列教程分 3 部分，面向对使用 Apache Geronimo 和 Apache Axis2 开发大型 Web 服务有兴趣的读者。了解如何构建 WSDL 文件及与在线银行系统相关的一些操作。然后使用 Axis2 将 WSDL 文件编译为 Web 服务，并在 Geronimo 上进行部署和测试。</p>
		<p>
				<a name="N1012D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">关于本系列</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本系列中将创建一个在线银行 Web 服务示例。使用 WSDL 和 Axis2 创建的 Web 服务将包含一个 Apache Derby 数据库，用于保存交易数据、账户数据和账单支付数据。您会将 Axis2 作为 Apache Geronimo 上的 Web 应用程序部署，新 Web 服务将是在 Axis2 中部署的 Axis 归档。您在示例中可能会用到在线银行中的多个命令，包括查看账户、搜索交易、划拨资金和支付账单。您还会创建一个客户机 Web 应用程序来连接到 Web 服务，以查询信息及执行交易 —— 主要是为了调用在 Web 服务中实现的操作。</p>
		<p>在本系列的第 1 部分中，将在 WSDL 中构建在线银行 Web 服务的基础设施。在第 2 部分中，将通过在 Apache Derby 数据库中存储账户和交易信息来构建 Web 服务的功能。在最后的第 3 部分中，将为 Web 服务创建功能完整、基于 Web 的客户机用户界面（UI），用户可在其中登录、进行在线银行活动及注销。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/index.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10139">
						<span class="smalltitle">
								<strong>
										<font face="Arial">关于本教程</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本教程首先介绍示例 Web 服务，并展示使用 WSDL 的多种 Web 服务。您将使用 Axis2 将 WSDL 文件转换为 Java™ 代码，其中将实现一些简单的功能，以测试客户机与 Web 服务之间的通信。测试环境包括作为 Geronimo 上的模块部署的 Axis2、作为 Axis2 内的归档部署的 Web 服务，以及与 Web 服务通信的一个简单 Java 客户机。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/index.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10144">
						<span class="smalltitle">
								<strong>
										<font face="Arial">前提条件</font>
								</strong>
						</span>
				</a>
		</p>
		<p>要学习本教程，需要具备以下工具：</p>
		<ul>
				<li>Apache Geronimo —— 下载 <a href="http://geronimo.apache.org/"><font color="#5c81a7">Apache Geronimo V1.0</font></a>，您将在 Geronimo 上部署 Axis2 Web 服务。 
</li>
				<li>Apache Axis2 —— 下载 <a href="http://ws.apache.org/axis2/"><font color="#5c81a7">V0.94 Axis2 WAR 及二进制发行版</font></a>，用于从 WSDL 构建 Web 服务。 
</li>
				<li>Apache Ant —— 下载 <a href="http://ant.apache.org/bindownload.cgi"><font color="#5c81a7">Apache Ant</font></a>，由于 Axis2 的 WSDL2Java 工具为构建 Web 服务创建了一个便捷的 Ant build.xml 文件，因此您需要用到此工具，这将使 Web 服务源代码的构建更容易。 
</li>
				<li>Java 代码 —— 下载最新版的 Java 1.4，<a href="http://java.sun.com/"><font color="#5c81a7">Java 1.4.10</font></a>，Geronimo、Axis2 和 Ant 都需要用到它。 </li>
		</ul>
		<p>本教程假设您具备 Java 语法和编写代码的基本知识，但不必了解 Axis2 或特定 Geronimo 的相关知识。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/index.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<span class="atitle">
						<font face="Arial" size="4">在线银行 Web 服务概述</font>
				</span>
		</p>
		<p>下面简要介绍本系列教程的最终成果 —— 在线银行 Web 服务示例。该 Web 服务涵盖了在线银行体验的几种特性，包括查看账户和交易、划拨资金、申请贷款和在线支付账单。</p>
		<p>
				<a name="N1017B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">账户</font>
								</strong>
						</span>
				</a>
		</p>
		<p>登录到 Web 服务之后，您会看到您所拥有的账户及其余额。出于安全性方面的考虑，登录过程包括发送用户名和密码，以及接收保证安全性的二进制令牌。因此，在您登录之后，仅需发送该令牌即可使 Web 服务识别您的身份。之后您就可以单击查看账户中的交易，见下节。</p>
		<p>
				<a name="N10185">
						<span class="smalltitle">
								<strong>
										<font face="Arial">交易</font>
								</strong>
						</span>
				</a>
		</p>
		<p>您在银行中做的每一件事都涉及交易，各交易的历史 —— 可在各账户中查看其历史 —— 记录在您的账户中。Web 服务还使您根据支票编号、金额或日期搜索交易。这使您可在纳税时更轻松地回溯和查找账户中的交易。您可将资金从一个账户划拨到另外一个账户中，这也作为账户的一项交易记入日志。</p>
		<p>
				<a name="N1018F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">申请贷款</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本特性允许您通过在线银行 Web 服务申请贷款。您可输入贷款类型、欲贷金额、偿还时间。成功提交贷款申请表后，您可查看每笔贷款的状态。</p>
		<p>
				<a name="N10199">
						<span class="smalltitle">
								<strong>
										<font face="Arial">支付账单</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在线账单支付服务现已非常普及。这种服务使您能够通过银行账户支付账单。但在支付账单之前，必须首先添加作为支付对象的人或公司，我们称之为<i>收款方（payee）</i>。Web 服务允许您查看、添加和编辑账户中的收款方。在账户中设置好收款方后，您就可以向其偿还债务或划拨资金了。所支持的支付类型有两种：<i>一次性支付</i> 和 <i>定期支付</i>。您可通过 Web 服务执行各类支付。每次支付都有一个与其相关的日期，在支付发生之前（<i>待定支付</i>），允许您编辑其内容。</p>
		<p>在下一节中，我们将开始构建在线银行 Web 服务的 WSDL。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<span class="atitle">
						<font face="Arial" size="4">数据结构</font>
				</span>
		</p>
		<p>您在 Web 服务中支持的消息及操作需要一些数据结构用于来回传递数据，在 WSDL 中也称为<i>复型</i>。这些数据结构是通过简单对象访问协议（SOAP）传送的，并且是使用 WSDL 定义的。Web 服务的操作需要 6 个数据结构，我们将从最常用的一种开始，即交易。</p>
		<p>
				<a name="N101C0">
						<span class="smalltitle">
								<strong>
										<font face="Arial">交易</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在您的在线银行 Web 服务上下文中，两个账户（或一个账户和银行）是所涉两方。就我们的在线银行应用程序而言，一个交易可能有 5 项属性。下面看看这些属性，参见 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list1"><font color="#5c81a7">清单 1</font></a>。现在创建一个 WSDL 文件 —— OnlineBanking.wsdl，将 <code>Transaction complexType</code> 放置在其中。</p>
		<p>
				<code>Transaction complexType</code> 中的 5 个元素在 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list1"><font color="#5c81a7">清单 1</font></a> 中显示为黑体。所有必需元素均以 <code>minOccurs="1" maxOccurs="1"</code> 表示。这表示该元素号应至少出现一次，且最多出现一次，也就是恰好一次。注意 <code>checknumber</code> 非必需，因为 <code>minOccurs="0"</code>，这表示在一个 <code>Transaction</code> 中，该元素可被忽略，也可以恰好出现一次。另外，查看数据类型。注意，号码定义为 <code>int</code>、<code>checknumber</code> 和 <code>int</code>、<code>date</code> 和 <code>date</code>、<code>header</code> 和 <code>string</code>，以及 <code>amount</code> 和 <code>float</code>。</p>
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<br />
		<a name="list1">
				<b>清单 1. 交易</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="Transaction"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="<span class="boldcode"><strong>1</strong></span>" maxOccurs="<span class="boldcode"><strong>1</strong></span>"
                       name="<span class="boldcode"><strong>number</strong></span>" type="xsd: <span class="boldcode"><strong>int</strong></span>" /&gt;
          &lt;xsd:element minOccurs="<span class="boldcode"><strong>0</strong></span>" maxOccurs="<span class="boldcode"><strong>1</strong></span>"
                       name="<span class="boldcode"><strong>checknumber</strong></span>" type="xsd: <span class="boldcode"><strong>int</strong></span>" /&gt;
          &lt;xsd:element minOccurs="<span class="boldcode"><strong>1</strong></span>" maxOccurs="<span class="boldcode"><strong>1</strong></span>"
                       name="<span class="boldcode"><strong>date</strong></span>" type="xsd: <span class="boldcode"><strong>date</strong></span>" /&gt;
          &lt;xsd:element minOccurs="<span class="boldcode"><strong>1</strong></span>" maxOccurs="<span class="boldcode"><strong>1</strong></span>"
                       name="<span class="boldcode"><strong>header</strong></span>" type="xsd: <span class="boldcode"><strong>string</strong></span>" /&gt;
          &lt;xsd:element minOccurs="<span class="boldcode"><strong>1</strong></span>" maxOccurs="<span class="boldcode"><strong>1</strong></span>"
                       name="<span class="boldcode"><strong>amount</strong></span>" type="xsd: <span class="boldcode"><strong>float</strong></span>" /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接下来将介绍收款方复型。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1026A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">收款方</font>
								</strong>
						</span>
				</a>
		</p>
		<p>收款方接受您通过在线银行支付的账单。因此，需要几个字段来获得地址和账单金额信息。为您的 WSDL 文件添加收款方复型，参见 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list2"><font color="#5c81a7">清单 2</font></a>。</p>
		<br />
		<br />
		<a name="list2">
				<b>清单 2. 收款方</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="Payee"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>name</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>address1</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="0" maxOccurs="1"
                       name="<span class="boldcode"><strong>address2</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="0" maxOccurs="1"
                       name="<span class="boldcode"><strong>address3</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>city</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>state</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>zip</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>phoneAreaCode</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>phonePrefix</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>phoneSuffix</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>accountToPay</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>nameOnBill</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>alias</strong></span>" type="xsd:string" /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>对于邮汇，您可以想到，需要的所有必需数据，在 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list2"><font color="#5c81a7">清单 2</font></a> 中以黑体显示。注意 <code>address2</code> 和 <code>address3</code>，补充的额外地址行非必需。接下来定义贷款申请表复型。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102B6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">贷款申请表</font>
								</strong>
						</span>
				</a>
		</p>
		<p>如果银行不发放贷款，我们要如何生存？这里定义的数据结构包括贷款申请表信息和贷款状态信息。我们首先定义贷款申请表复型，参见 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list3"><font color="#5c81a7">清单 3</font></a>。</p>
		<br />
		<br />
		<a name="list3">
				<b>清单 3. 贷款申请表</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="LoanApplication"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>loanType</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>amount</strong></span>" type="xsd:float" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>termMonths</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>joint</strong></span>" type="xsd:boolean" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>percentFinanced</strong></span>" type="xsd:int" /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>各字段都包括贷款申请表中的典型数据。接下来将贷款状态添加到您的 WSDL 中，如 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list4"><font color="#5c81a7">清单 4</font></a> 所示。</p>
		<br />
		<br />
		<a name="list4">
				<b>清单 4. 贷款申请表状态</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="LoanApplicationStatus"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>loanNumber</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>approved</strong></span>" type="xsd:boolean" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>denied</strong></span>" type="xsd:boolean" /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>每笔贷款都获得一个号码以及一个与其相关的批准或拒绝状态。如果它既未得到批准，也未被拒绝，则该贷款尚未处理。接下来介绍与账单支付相关的结构。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102F7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">账单支付</font>
								</strong>
						</span>
				</a>
		</p>
		<p>支付账单要求您输入信息，如支付金额、支付对象，以及是否为定期支付等。接下来的两个清单展示了两种结构，供您参考。向您的 WSDL 文件中添加账单支付复型，参见 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list5"><font color="#5c81a7">清单 5</font></a>。</p>
		<br />
		<br />
		<a name="list5">
				<b>清单 5. 账单支付</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="BillPayment"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>payeeName</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>account</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>amount</strong></span>" type="xsd:float" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>date</strong></span>" type="xsd:date" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>notes</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>recurring</strong></span>" type="xsd:<span class="boldcode"><strong>boolean</strong></span>" /&gt;
          &lt;xsd:element <span class="boldcode"><strong>minOccurs="0"</strong></span> maxOccurs="1"
                       name="<span class="boldcode"><strong>recurringData"</strong></span>
                       type="<span class="boldcode"><strong>xsd1:RecurringBillPayment"</strong></span> /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这里显示的金额即为您所支付的金额。如果是定期支付，则此金额为您每次支付的金额，所以日期将为起始日期。另外，注意这里 <code>recurring</code> 指定支付是否为定期支付，如果是，则定义 <code>recurringData</code>（注意其 <code>minOccurs</code> 定义为 <code>0</code>）。<code>recurringData</code> 元素引用 <code>RecurringBillPayment</code> 复型，如 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list6"><font color="#5c81a7">清单 6</font></a> 所示。将其添加到您的 WSDL 中。</p>
		<br />
		<br />
		<a name="list6">
				<b>清单 6. 追加定期账单支付数据</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">      &lt;xsd:complexType name="RecurringBillPayment"&gt;
        &lt;xsd:sequence&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>finalPayment</strong></span>" type="xsd:float" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>frequency</strong></span>" type="xsd:string" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>totalNumberOfPayments</strong></span>" type="xsd:int" /&gt;
          &lt;xsd:element minOccurs="1" maxOccurs="1"
                       name="<span class="boldcode"><strong>recurringType</strong></span>" type="xsd:string" /&gt;
        &lt;/xsd:sequence&gt;
      &lt;/xsd:complexType&gt;
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list6">
						<font color="#5c81a7">清单 6</font>
				</a> 中的数据直接填充 <a href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#list5"><font color="#5c81a7">清单 5</font></a> 所示复型。在这里，您的最后支付为 <code>finalPayment</code> 字段的值，<code>frequency</code> 则为支付账单的周期。<code>recurringType</code> 字段表示账单金额是否为固定数量，也就是说表示您是否可在下一次提交之前更改金额。接下来为您介绍需要通过 WSDL 公开的几种不同操作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:38 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 3 部分：统一描述、发现和集成 (UDDI)（4）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90794.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90794.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90794.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90794.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">结束语</span>
		</p>
		<p>分布式环境要求使用集成存储库，以便用户和开发人员了解哪些功能可用以及能在何处找到这些功能，Web 服务也不例外。本教程说明了统一描述、发现和集成 (UDDI) 的使用，UDDI 提供了保存有关可用企业和服务的信息的注册中心。</p>
		<p>在本教程中，您了解了以下内容：</p>
		<ul>
				<li>什么是 UDDI 以及它为何重要 
</li>
				<li>如何设计 UDDI 数据的结构 
</li>
				<li>如何区分 SOAP 接口和实现 
</li>
				<li>如何在 UDDI 注册中心中查找数据 
</li>
				<li>如何使用 Java 与 UDDI 注册中心交互 </li>
		</ul>
		<p>本系列的后续部分将介绍如何应对不断增加的安全需求，并对 WS-Security 和 WS-Policy 进行探讨。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section8.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<p>
												<span class="atitle">
														<a name="download">下载</a>
												</span>
										</p>
										<table class="data-table-1" cellspacing="0" cellpadding="0" width="70%" border="0">
												<tbody>
														<tr>
																<th>描述</th>
																<th>名字</th>
																<th align="right">大小</th>
																<th>下载方法</th>
														</tr>
														<tr>
																<td class="tb-row">Source code</td>
																<td nowrap="">uddicode.zip</td>
																<td nowrap="" align="right">6KB</td>
																<td nowrap="">
																		<a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/webservices/ws-understand-web-services3/uddicode.zip">
																				<b>
																						<font color="#5c81a7">HTTP</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr valign="top">
																<td colspan="5">
																		<font color="#5c81a7">
																				<img height="12" alt="" src="https://www.ibm.com/i/c.gif" width="12" border="0" />
																		</font>
																</td>
														</tr>
														<tr>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/fw.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/whichmethod.html">
																				<font color="#5c81a7">关于下载方法的信息</font>
																		</a>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="50" />
																		</font>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/sout.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="http://www.adobe.com/products/acrobat/readstep2.html">
																				<font color="#5c81a7">Get Adobe® Reader®</font>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<b>学习</b>
		<br />
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/edu/ws-dw-ws-understand-web-services3.html?S_TACT=105AGX52&amp;S_CMP=cn-t-ws" target="_blank"><font color="#5c81a7">英文原文</font></a> 。<br /><br /></li>
				<li>阅读<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?view_by=search&amp;search_by=%E4%BA%86%E8%A7%A3+Web+%E6%9C%8D%E5%8A%A1%E8%A7%84%E8%8C%83"><font color="#5c81a7">本系列的其他教程</font></a>。<br /><br /></li>
				<li>请访问 <a href="http://www.uddi.org/"><font color="#5c81a7">UDDI 网站</font></a>。<br /><br /></li>
				<li>您可以找到<a href="http://www.oasis-open.org/committees/uddi-spec/doc/tcspecs.htm"><font color="#5c81a7">所有三个版本的规范</font></a>，包括 XML 模式文档。<br /><br /></li>
				<li>请参见 Tom Bellwood 所撰写的 <a href="http://www.ibm.com/developerworks/cn/webservices/ws-uddiv3/"><font color="#5c81a7">使用 UDDI V3 加速前进</font></a>，以了解 UDDI 3.0 版中的更改。<br /><br /></li>
				<li>有关将 WSDL 与 UDDI 注册中心一起使用的各种不同方法的系列教程（由三部分组成），请参见 developerWorks 系列教程“Understanding WSDL in a UDDI registry”。 
<ul><li><a href="http://www.ibm.com/developerworks/cn/webservices/ws-wsdl/"><font color="#5c81a7">WSDL : 描述你的Web服务</font></a>（2001 年 8 月） 
</li><li><a href="http://www.ibm.com/developerworks/webservices/library/ws-wsdl2.html?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Part 2: Usage scenarios in publishing and finding WSDL service descriptions</font></a>（2001 年 9 月） 
</li><li><a href="http://www.ibm.com/developerworks/webservices/library/ws-wsdl3?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Part 3: How to publish and find WSDL service descriptions</font></a>（2001 年 11 月） </li></ul><br /></li>
				<li>阅读 developerWorks 系列文章“The role of private UDDI nodes in Web services”。 
<ul><li><a href="http://www.ibm.com/developerworks/webservices/library/ws-rpu1.html?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Part 1: Six species of UDDI </font></a>（2001 年 5 月） 
</li><li><a href="http://www.ibm.com/developerworks/webservices/library/ws-rpu2.html?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Part 2: Private nodes and operator nodes</font></a>（2001 年 5 月） </li></ul><br /></li>
				<li>阅读由五个部分组成的系列文章“使用 UDDI 和 WSDL 的一种新方法”。 
<ul><li><a href="http://www.ibm.com/developerworks/cn/webservices/ws-udmod1/"><font color="#5c81a7">第 1 部分：介绍新的OASIS UDDI WSDL TechnicalNote</font></a>（2003 年 8 月） 
</li><li><a href="http://www.ibm.com/developerworks/cn/webservices/ws-udmod2/"><font color="#5c81a7">第 2 部分：新的OASIS UDDI WSDL TechnicalNote支持的查询</font></a>（2003 年 9 月） 
</li><li><a href="http://www.ibm.com/developerworks/cn/webservices/ws-udmod3/"><font color="#5c81a7">第 3 部分：正在发挥作用的新 OASIS UDDI WSDL Technical Note 的一个示例</font></a>（2003 年 10 月） 
</li><li><a href="http://www.ibm.com/developerworks/cn/webservices/ws-udmod4/"><font color="#5c81a7">第 4 部分：使用新的 OASIS UDDI WSDL Technical Note 来从 Java 应用程序发布 WSDL</font></a>（2004 年 3 月） 
</li><li><a href="http://www.ibm.com/developerworks/webservices/library/ws-udmod5/?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Part 5: Query from a Java application using the new OASIS UDDI WSDL Technical Note</font></a>（2004 年 11 月） </li></ul><br /></li>
				<li>阅读有关 UDDI4J 的更多信息：<a href="http://www.ibm.com/developerworks/cn/webservices/ws-uddi4j/"><font color="#5c81a7">UDDI4J: 安排 Web 服务 -- 与 UDDI 服务器交互</font></a>。<br /><br /></li>
				<li>请参见：<a href="http://www.ibm.com/developerworks/cn/webservices/ws-uddi4j2/"><font color="#5c81a7">UDDI4J v2 编程</font></a>（developerWorks，2002 年 7 月），这篇文章讨论了下一代 UDDI 客户机 API——UDDI4J v2。<br /><br /></li>
		</ul>
		<br />
		<b>获得产品和技术</b>
		<br />
		<ul>
				<li>下载 <a href="http://geronimo.apache.org/downloads.html"><font color="#5c81a7">Apache Geronimo</font></a>。<br /><br /></li>
				<li>要创建自己的 UDDI 注册中心，请下载 <a href="http://ws.apache.org/juddi/releases.html"><font color="#5c81a7">Apache jUDDI</font></a>。<br /><br /></li>
				<li>下载 <a href="http://sourceforge.net/projects/uddi4j/"><font color="#5c81a7">UDDI4J</font></a>。<br /><br /></li>
				<li>下载 <a href="http://www.apache.org/dyn/closer.cgi/ws/axis/1_3"><font color="#5c81a7">Apache Axis 1.3</font></a>。<br /><br /></li>
				<li>下载 <a href="http://java.sun.com/j2se/1.4.2/download.html"><font color="#5c81a7">Java 1.4.2</font></a>。Geronimo 将无法与 Java 1.5 一起正常使用。<br /><br /></li>
				<li>
						<a href="http://www.alphaworks.ibm.com/tech/uddi4py">
								<font color="#5c81a7">UDDI4Py</font>
						</a> 是一个 Python 包，允许将请求发送到 UDDI V2 API 并允许处理来自后者的响应。</li>
		</ul>
		<br />
		<b>讨论</b>
		<br />
		<ul>
				<li>
						<a href="http://www.ibm.com/developerworks/community/?S_TACT=105AGX52&amp;S_CMP=cn-t-ws">
								<font color="#5c81a7">参与论坛讨论</font>
						</a>。</li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/resources.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="70%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Nicholas Chase 曾经参与过许多公司网站的开发，包括 Lucent Technologies、Sun Microsystems、Oracle 及 Tampa Bay Buccaneers。他当过中学物理教师、低级放射性废弃设备管理员、在线科幻杂志编辑、多媒体工程师、Oracle 讲师以及一家交互式通信公司的首席技术官。他写过几本书，其中包括<i>XML Primer Plus</i> (Sams)。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:36 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 3 部分：统一描述、发现和集成 (UDDI) （3）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90792.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90792.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90792.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90792.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90792.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 查找和使用信息				现在已经有了所有信息（至少从理论上是这样），Gene 需要再次对查找的过程进行处理。																														UDDI 搜索的工作方式：查找公司																						在 UDDI 中进行搜索将涉及到两个步骤。首先，查找所需对象的键，然后获取有关该对象的信息。因此，为了查找公...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90792.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:33 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 3 部分：统一描述、发现和集成 (UDDI) （2）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90791.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90791.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90791.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90791.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">UDDI 数据结构</span>
		</p>
		<p>为了开始将公司添加到 UDDI 注册中心，Francis 定义了要输入注册中心的信息。</p>
		<p>
				<a name="N1030F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">businessEntity </font>
								</strong>
						</span>
				</a>
		</p>
		<p>第一步是将报社本身的信息输入注册中心。为此，Francis 创建了一个 <code>businessEntity</code> 对象。此对象包含有关企业的信息，既用于对企业进行标识，也用于提供与其有关的信息。例如，businessEntity 对象可以包含多个名称（从而能够为公司所使用的每种语言创建一个 name 元素），联系信息（Francis 被告知将 Pat Mooney 添加为主要联系人）、与实体相关的服务（Gene 将稍后添加）和用于对公司进行标识与分类的信息。</p>
		<p>尽管大部分人都不会采用这种方式与 UDDI 注册中心交互，但要注意的一个事实是，UDDI 实际上就是 SOAP 应用程序；执行的所有操作都作为往返传递 SOAP 消息的结果发生。这意味着，Francis 所创建的 businessEntity 最终将表示为 XML 元素。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#listing2"><font color="#5c81a7">清单 2</font></a>。</p>
		<br />
		<a name="listing2">
				<b>清单 2. businessEntity 元素</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;businessEntity businessKey="{uuid}"</strong>
												</span> operator="(optional)" 
authorizedName="(optional)"&gt;
&lt;discoveryURLs&gt;
&lt;discoveryURL&gt;&lt;/discoveryURL&gt;
&lt;discoveryURL&gt;&lt;/discoveryURL&gt;
&lt;/discoveryURLs&gt;
<span class="boldcode"><strong>&lt;name&gt;The Daily Moon&lt;/name&gt;</strong></span>
&lt;name lang="fr-ca"&gt;La Lune Quotidienne&lt;/name&gt;
&lt;description&gt;&lt;/description&gt;
&lt;contacts&gt;
&lt;contact&gt;
&lt;description&gt;&lt;/description&gt;
&lt;personName&gt;Pat Mooney&lt;/personName&gt;
&lt;phone&gt;&lt;/phone&gt;
&lt;email&gt;patm@daily-moon.com&lt;/email&gt;
&lt;address useType="optional, billing, etc." 
sortCode="optional" 
tModelKey="optional"&gt;
&lt;addressLine&gt;&lt;/addressLine&gt;
&lt;addressLine&gt;&lt;/addressLine&gt;
&lt;addressLine&gt;&lt;/addressLine&gt;
&lt;/address&gt;
&lt;/contact&gt;
&lt;contact&gt;
         ...
&lt;/contact&gt;
&lt;/contacts&gt;
&lt;businessServices&gt;
&lt;businessService serviceKey="required" 
businessKey="optional"&gt;
         ...
&lt;/businessService&gt;
&lt;/businessServices&gt;
&lt;identifierBag&gt;
      ...
&lt;/identifierBag&gt;
&lt;categoryBag&gt;
      ...
&lt;/categoryBag&gt;
<span class="boldcode"><strong>&lt;/businessEntity&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>businessEntity</code> 记录并不一定要很复杂。事实上，按照 <code>businessKey</code> 的要求，单个名称和一个唯一标识符就足够了。不过，出于完整性考虑，我包含了完整的结构，但去掉了一些稍后将另行讨论的部分。在生产环境中，应将空白元素删除。</p>
		<p>让我们看一看此处的一些信息。</p>
		<p>从代码的起始处开始，<code>businessKey</code> 当然是唯一标识符。operator 和 <code>authorizedName</code> 属性由注册中心内部进行处理；您不必考虑这部分内容，它们仅仅分别表示运行注册中心的实体和添加此记录的人员或帐户。</p>
		<p>
				<code>discoveryURLs</code> 会在每次将 businessEntity 保存到注册中心时添加到注册中心。这些 URL 旨在用作供用户访问有关 <code>businessEntity</code> 的更多信息的地址。</p>
		<p>请注意，Francis 添加了一个额外的名称，用于以法语表示其名称（报社打算在法国宣传其业务）。这些实体中的每一个都具有 <code>lang</code> 属性，用于指定相关语言的代码。您可以提供常见缩写的可替换名称，如 IBM 对应于 International Business Machines。</p>
		<p>接下来的可选描述是一个简单的文本字符串。事实上，UDDI 中的大部分元素都具有一个可选描述。</p>
		<p>接下来，Francis 添加了其他一些联系人。对于每个联系人，他可以根据需要指定任意多的信息。通常会提供 <code>personName</code>，但电话号码、电子邮件等其他信息是由个人自行提供的，因为 UDDI 注册中心的所有信息对所有用户均可用。联系人还可能具有地址信息，使用 <code>useType</code> 来指定地址类型。例如，对于联系人，它可以为家庭地址和公司地址等。对于公司，<code>useType</code> 可以为总部、发行中心等等。 </p>
		<p>
				<code>businessServices</code> 元素将列出已与 <code>businessEntity</code> 关联的任何服务。由于 Gene 尚未添加任何服务，故而此元素通常为空。最后两项 <code>identifierBag</code> 和 <code>categoryBag</code> 提供了有关公司本身的其他信息，以便进行搜索。我们稍后将对二者分别进行分析。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1038E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">publisherAssertion </font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<code>publisherAssertion</code> 是 <code>businessEntity</code> 之间的关系声明。例如，Francis 知道此项目的目标之一是使用 Daily Star 中提供的服务，其中，Daily Star 将为 <i>Daily Moon</i> 提供体育赛事比分。这使得 <i>Daily Star</i> 成为 <i>Daily Moon</i> 的内容提供者。Francis 可以按照<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#listing3"><font color="#5c81a7">清单 3</font></a> 中所示的方式表示此关系。</p>
		<br />
		<a name="listing3">
				<b>清单 3. publisherAssertion </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;publisherAssertion&gt;
&lt;fromKey&gt;(businessKey for Daily Star)&lt;/fromKey&gt;
&lt;toKey&gt;(businessKey for Daily Moon)&lt;/toKey&gt;
&lt;keyedReference tModelKey="904BD800-D53A-11DA-B055-850A1DA99D79" 
         keyName="optional" keyValue="CONTENTPROVIDER" /&gt;
&lt;/publisherAssertion&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>fromKey</code> 和 <code>toKey</code> 元素表示所涉及的两个实体的唯一 ID。在本例中，这两个实体指 <i>Daily Moon</i> 和 <i>Daily Star</i>。<i>Daily Star</i> 是 <i>Daily Moon</i> 的内容提供者，故而据此放置二者的键。<code>keyedReference</code> 将会多次出现。在本例中，我们可以说引用本身就是内容提供者。<code>keyValue</code> 是 <code>keyedReference</code> 的唯一必需属性，但常常也会包含 <code>keyName</code>（为了提高可读性）和 <code>tModelKey</code>（标识特定的引用类型）。在本例中，<code>tModelKey</code> 表示两个报社之间关联的命名空间（与内部关系相对）。我们稍后将对 <code>tModels</code> 进行进一步的讨论。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N103F1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">businessService </font>
								</strong>
						</span>
				</a>
		</p>
		<p>接下来，Francis 需要输入有关 Daily Moon 将要提供的任何实际服务的信息。除了所需的唯一 <code>serviceKey</code> 和名称外，<code>businessService</code> 对象中还包含两条重要信息。即 <code>bindingTemplates</code> 和服务所属的任何类别。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#listing4"><font color="#5c81a7">清单 4</font></a>。</p>
		<br />
		<a name="listing4">
				<b>清单 4. businessService </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;businessService serviceKey="required"</strong>
												</span> businessKey="optional"&gt;
&lt;name&gt;&lt;/name&gt;
&lt;description&gt;&lt;/description&gt;
&lt;bindingTemplates&gt;
&lt;bindingTemplate serviceKey="optional" bindingKey="required"&gt;
         ...
&lt;/bindingTemplate&gt;
&lt;/bindingTemplates&gt;
&lt;categoryBag&gt;
      ...
&lt;/categoryBag&gt;
<span class="boldcode"><strong>&lt;/businessService&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10422">
						<span class="smalltitle">
								<strong>
										<font face="Arial">BindingTemplate </font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<code>Tmodelinstancedetails</code> 指示其兼容的应用程序或规范。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#listing5"><font color="#5c81a7">清单 5</font></a>。</p>
		<br />
		<a name="listing5">
				<b>清单 5. bindingTemplate </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;bindingTemplate</strong>
												</span> serviceKey="optional"
 <span class="boldcode"><strong>bindingKey="required"&gt;</strong></span>
                    &lt;accessPoint&gt; OR &lt;hostingRedirector bindingKey="another
 binding to be used instead"&gt;
&lt;tModelInstanceDetails&gt;
&lt;tModelInstanceDetail&gt;
&lt;tModelInstanceInfo tModelKey=""uuid key for specification tModel"&gt;&gt;
&lt;description&gt;&lt;/description&gt;
&lt;instanceDetails&gt;
&lt;description&gt;&lt;/description&gt;
&lt;overviewDoc&gt;
&lt;description&gt;&lt;/description&gt;
&lt;overviewURL&gt;&lt;/overviewURL&gt;
&lt;/overviewDoc&gt;
&lt;instanceParams&gt;string&lt;/intstanceParms&gt;
&lt;/instanceDetails&gt;
<span class="boldcode"><strong>&lt;/tModelInstanceInfo&gt;</strong></span>
&lt;tModelInstanceInfo&gt;
            ...
&lt;/tModelInstanceInfo&gt;
  <span class="boldcode"><strong>&lt;/tModelInstanceDetail&gt;
   &lt;tModelInstanceDetails&gt;
&lt;/bindingTemplate&gt;</strong></span>
TModels (including tModel of tModels)
Serve two purposes.  As specification indicators, and as namespace indicators.
<span class="boldcode"><strong>&lt;tModel tModelKey="required"</strong></span> operator="optional" 
authorizedName="optional"&gt;
&lt;name&gt;&lt;/name&gt;
&lt;description&gt;&lt;/description&gt;
&lt;overviewDoc&gt;
&lt;description&gt;&lt;/description&gt;
&lt;overviewURL&gt;&lt;/overviewURL&gt;
&lt;overviewDoc&gt;

   &lt;identifierBag&gt;
...
&lt;/identifierBag&gt;
&lt;categoryBag&gt;
      ...
&lt;/categoryBag&gt;
<span class="boldcode"><strong>&lt;/tModel&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>bindingTemplate</code> 定义在何处能找到服务以及其执行什么工作，这听起来并不复杂。不过，这两项功能在 UDDI 上下文中担任了新的重要角色。例如，为了确定可以在何处访问服务，可以提供 <code>accessPoint</code>（表示简单的 URL）或任何其他相应的数据，如求助热线的号码或 <code>hostingRedirector</code>。</p>
		<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N1046C">
																				<b>分类法</b>
																		</a>
																		<br />
																		<p>对信息进行分类时，如果能就如何进行分类达成一致则很有帮助。这些一致同意的分类标准称为分类法。</p>
																		<p>例如，北美工业分类系统 (NAICS) 通过为每种类别指定一个唯一代码来区分“体育用品出租”、“体育用品商店”和“二手体育用品商店”。这样，当遇到代码 532292 时，就知道所说的是出租体育用品的商家，而不是出售这些东西的商家。</p>
																		<p>UDDI 操作员向系统添加一系列分类法作为例行规定，可供您在无需为其注册 tModels 的情况下使用。例如，jUDDI 可以使用 <code>tModel</code> 键 <code>A035A07C-F362-44DD-8F95-E2B134BF43B4</code> 为 <code>uddi-org:general_keywords</code> 创建 <code>tModel</code>，因此您可以使用它，而不必自己定义。</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>当服务的绑定发生更改时，将使用 <code>hostingRedirector</code>。例如，如果 <i>Daily Moon</i> 要建立自己的分类广告服务，并允许这两家报社使用 <code>createNewAdd()</code> 调用提交广告，则需要确保服务永远不会更改，或者提供一个方法来告知客户机服务已发生更改。而这就是要使用 <code>hostingRedirector</code> 的地方。在这种情况下，Francis（或实际由 Gene 进行）将创建一个新 <code>bindingTemplate</code>，用于表示新信息，并将该 <code>bindingTemplate</code> 的 <code>bindingKey</code> 输入 <code>hostingRedirector</code> 元素的 <code>bindingKey</code> 属性中。</p>
		<p>定义服务能进行的工作可能会更困难。这个原因是两方面的。首先，由于我们讨论的并不一定是 SOAP 服务，因此无法直接为其提供 WSDL 文件。其次，由于这应该是一个自动化过程，因此需要以无歧义的方式提供此信息。</p>
		<p>这样所得的结果是一个包括 <code>tModelInstanceDetails</code> 元素的 <code>bindingTemplate</code>，而此元素中又包含一个或多个 <code>tModelInstanceDetail</code> 元素。每个 <code>tModelInstanceDetail</code> 元素又包含一个或多个 <code>tModelInstanceInfo</code> 元素，而后者各自指向一个特定的 <code>tModel</code>。我们稍后将对 <code>tModels</code> 进行讨论。不过，重要的是要理解，<code>tModelInstanceInfo</code> 元素可以包含一个 <code>instanceDetails</code> 元素，后者本身包含一个 <code>overviewDoc</code>，其中包括 <code>overviewURL</code>，即实际定义服务的文档的 URL。（是的，就是在此处指定 WSDL 文件。）</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104E3">
						<span class="smalltitle">
								<strong>
										<font face="Arial">TModels（包括 tModels 的 tModel）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>现在让我们讨论一下 <code>tModels</code>。</p>
		<p>
				<code>tModels</code> 实际有两个用途。第一，就是我们在关于 <code>publisherAssertions</code> 的讨论中了解到的，作为“命名空间指示符”。也就是说，<code>tModel</code> 可以提供用于区分很容易混淆的信息类型的方法。经常给出的一个例子是税码（或其他很容易混淆的数字）。例如，包含以下内容的 <code>keyedReference</code> 并不会提供所有信息，因为这两个税务 ID 属于不同的国家。它们在两个国家里都称为税务 ID，但就编程而言，我们必须提供一个区分二者的方法，如<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#list6"><font color="#5c81a7">清单 6</font></a> 中所示。</p>
		<br />
		<a name="list6">
				<b>清单 6. 来自不同国家的税务 ID</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;keyedReference tModelKey="" keyName="taxid" 
keyValue="11111111" /&gt;
&lt;keyedReference tModelKey="" keyName="taxid" 
keyValue="22222222" /&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这就是要使用 <code>tModel </code>的地方。我们可以为“美国税码”创建一个键模型，再为“墨西哥税码”创建一个键模型，依此类推。创建了这些模型后，可以使用其 <code>tModel</code> 键来进一步限定这些 <code>keyedReference</code>。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#list7"><font color="#5c81a7">清单 7</font></a>。</p>
		<br />
		<a name="list7">
				<b>清单 7. tModels 和 keyedReferences </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;tModel tModelKey="902CDE50-D53A-11DA-B055-A74C17FA61A7"&gt;
   &lt;name&gt;United States codes&lt;/name&gt;
&lt;/tModel&gt;
&lt;tModel tModelKey="062377D0-D5F5-11DA-8170-8ACF057FECAD"&gt;
   &lt;name&gt;Mexico codes&lt;/name&gt;
&lt;/tModel&gt;
&lt;keyedReference tModelKey="902CDE50-D53A-11DA-B055-A74C17FA61A7" 
                keyName="taxid" keyValue="11111111" /&gt;
&lt;keyedReference tModelKey="062377D0-D5F5-11DA-8170-8ACF057FECAD" 
                keyName="taxid" keyValue="22222222" /&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>tModel</code> 的另一个用途是作为规范标识符。例如，Francis 知道 Gene 将为上个月所处理的 <code>ClassifiedService</code> 创建相应的条目。此服务表示特定的接口，因此可以使用 <code>tModel</code> 对其进行标识。<code>tModel</code> 可能与<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#list8"><font color="#5c81a7">清单 8</font></a> 中所示类似。</p>
		<br />
		<a name="list8">
				<b>清单 8. tModel </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;tModel tModelKey="66999A50-D5F4-11DA-9A50-FA44D6AD622A"</strong>
												</span> 
        operator="optional" authorizedName="optional"&gt;

   &lt;name&gt;Classified Service Interface&lt;/name&gt;
   &lt;description&gt;&lt;/description&gt;

   &lt;overviewDoc&gt;
      &lt;description&gt;&lt;/description&gt;
      &lt;overviewURL&gt;
        http://www.daily-moon.com/ClassifiedService-interface.wsdl
      &lt;/overviewURL&gt;
   &lt;overviewDoc&gt;

   &lt;identifierBag&gt;
...
   &lt;/identifierBag&gt;

   &lt;categoryBag&gt;
      ...
   &lt;/categoryBag&gt;
<span class="boldcode"><strong>&lt;/tModel&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>和我们所讨论的各个其他对象一样，<code>tModel</code> 具有一个唯一键，这是它唯一必需的信息。不过，在本例中，我们还要指定 <code>overviewURL</code>，即接口的 WSDL 文件的 URL。（我们将在后面部分创建它。）</p>
		<p>同样，可以使用 <code>identifierBag</code> 对 <code>tModels </code>进行标识，还可以使用 <code>categoryBag</code> 对其进行归类。接下来让我们看一看如何进行此工作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10587">
						<span class="smalltitle">
								<strong>
										<font face="Arial">identifierBag </font>
								</strong>
						</span>
				</a>
		</p>
		<p>由于 UDDI 设计十分灵活，因此没有特定的方式来标识 businessEntity。UDDI 并不强制要求使用其 D-U-N-S 编号、其税务 ID 编号或任何特定的标识方法对公司进行标识。相反，它提供了一个容器，可以根据需要在其中放置任意数量的标识符，如<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#list9"><font color="#5c81a7">清单9</font></a> 中所示。</p>
		<br />
		<a name="list9">
				<b>清单 9. indentifierBag </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;identifierBag&gt;</strong>
												</span>
												<span class="boldcode">
														<strong>&lt;keyedReference</strong>
												</span>
 tModelKey="4064C064-6D14-4F35-8953-9652106476A9" 
         keyName="DUNS Number" <span class="boldcode"><strong>keyValue="55555555" /&gt;</strong></span><span class="boldcode"><strong>&lt;keyedReference</strong></span> tModelKey="" 
         keyName="US Tax ID" <span class="boldcode"><strong>keyValue="111111111" /&gt;
&lt;/identifierBag&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在 <code>identifierBag</code> 中添加的每个 <code>keyedReference</code> 都代表用户在搜索中找到相关对象的另一个机会。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N105C0">
						<span class="smalltitle">
								<strong>
										<font face="Arial">categoryBag </font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<code>categoryBag</code> 的工作方式与 <code>identifierBag</code> 类似，因为其中包含一个或多个 <code>keyedReferences</code>。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#list10"><font color="#5c81a7">清单 10</font></a>。</p>
		<br />
		<a name="list10">
				<b>清单 10. categoryBag </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">
												<span class="boldcode">
														<strong>&lt;categoryBag&gt;
   &lt;keyedReference</strong>
												</span> tModelKey="C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
           keyName="optional" <span class="boldcode"><strong>keyValue="511110" /&gt;
&lt;/categoryBag&gt;</strong></span></pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，Francis 创建了一个 <code>categoryBag</code>，指示 Daily Moon 是一个报社分支机构。现在让我们了解如何使用所有这些对象。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<span class="atitle">将 WSDL 映射到 UDDI </span>
		</p>
		<p>在 Gene 编写任何代码将所有这些信息发送到 UDDI 注册中心前，他必须在其当前服务和 UDDI 之间建立一个重要的联系。他必须对其进行调整，以适应 UDDI 的服务、接口和绑定模板概念。</p>
		<p>
				<a name="N10604">
						<span class="smalltitle">
								<strong>
										<font face="Arial">服务与接口</font>
								</strong>
						</span>
				</a>
		</p>
		<p>您可能还记得，服务在 UDDI 中包含三个部分：接口（使用 <code>tModels</code> 定义）、<code>businessService</code> 和 <code>bindingTemplate</code>（用于将两者捆绑在一起）。因此，Gene 将首先确定用于定义 SOAP 服务的 WSDL 文件如何适应此结构。</p>
		<p>他首先对 WSDL 进行分析。幸运的是，这非常简单。除了实现本身外，其余所有 WSDL 内容都属于接口。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#list11"><font color="#5c81a7">清单 11</font></a>。</p>
		<br />
		<a name="list11">
				<b>清单 11. WSDL 接口</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
      xmlns:tns="http://ws.apache.org/axis2"
      xmlns:axis2="http://ws.apache.org/axis2"
      xmlns:ns1="http://org.apache.axis2/xsd" 
      targetNamespace="http://ws.apache.org/axis2"&gt;

   &lt;wsdl:types&gt;
      &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://org.apache.axis2/xsd" 
            elementFormDefault="unqualified" 
            attributeFormDefault="unqualified"&gt;

         &lt;xs:element type="ns1:ClassifiedAd" name="ClassifiedAd"
 /&gt;
         &lt;xs:complexType name="ClassifiedAd"&gt;
            &lt;xs:sequence&gt;
               &lt;xs:element type="xs:int" name="id" /&gt;
               &lt;xs:element type="xs:string" name="content" /&gt;
               &lt;xs:element type="xs:string" name="endDate" /&gt;
               &lt;xs:element type="xs:string" name="startDate" /&gt;
            &lt;/xs:sequence&gt;
         &lt;/xs:complexType&gt;
         ...
      &lt;/xs:schema&gt;
   &lt;/wsdl:types&gt;

   &lt;wsdl:message name="createNewAdRequestMessage"&gt;
      &lt;wsdl:part name="part1" element="ns1:createNewAdRequest" /&gt;
   &lt;/wsdl:message&gt;
   &lt;wsdl:message name="createNewAdResponseMessage"&gt;
      &lt;wsdl:part name="part1" element="ns1:createNewAdResponse" /&gt;
   &lt;/wsdl:message&gt;
   ...

   &lt;wsdl:portType name="ClassifiedServicePortType"&gt;
      &lt;wsdl:operation name="finalizeIssue"&gt;
         &lt;wsdl:input message="tns:finalizeIssueRequestMessage" /&gt;
      &lt;/wsdl:operation&gt;
      &lt;wsdl:operation name="createNewAd"&gt;
         &lt;wsdl:input message="tns:createNewAdRequestMessage" /&gt;
         &lt;wsdl:output message="tns:createNewAdResponseMessage" /&gt;
      &lt;/wsdl:operation&gt;
      ...
   &lt;/wsdl:portType&gt;

   &lt;wsdl:binding name="ClassifiedServiceBinding" 
                  type="tns:ClassifiedServicePortType"&gt;
      &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
                  style="document" /&gt;
      &lt;wsdl:operation name="createNewAd"&gt;
         &lt;soap:operation soapAction="createNewAd" style="document"
 /&gt;
         &lt;wsdl:input&gt;
            &lt;soap:body use="literal" 
                        namespace="http://ws.apache.org/axis2" /&gt;
         &lt;/wsdl:input&gt;
         &lt;wsdl:output&gt;
            &lt;soap:body use="literal" 
                        namespace="http://ws.apache.org/axis2" /&gt;
         &lt;/wsdl:output&gt;
      &lt;/wsdl:operation&gt;
      ...
   &lt;/wsdl:binding&gt;
&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这包括类型定义（XML 模式）、任何消息、<code>portType</code> 甚至 <code>binding</code>，因为绑定并不是特定于实现的。</p>
		<p>实现由实际的服务元素组成。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#list12"><font color="#5c81a7">清单 12</font></a>。</p>
		<br />
		<a name="list12">
				<b>清单 12. 服务实现 WSDL</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
      xmlns:tns=
        "http://www.daily-moon.com/ClassifiedService-interface"
      xmlns:axis2="http://ws.apache.org/axis2"
      xmlns:ns1="http://org.apache.axis2/xsd" 
      targetNamespace=
        "http://www.daily-moon.com/ClassifiedService-interface"&gt;

&lt;wsdl:import namespace="http://ws.apache.org/axis2" 
   location=
"http://www.nicholaschase.com/ClassifiedService-interface.wsdl" 
/&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
   &lt;wsdl:port name="ClassifiedServicePort" 
               binding="axis2:ClassifiedServiceBinding"&gt;
      &lt;soap:address 
         location=
 "http://www.daily-moon.com:8080/axis2/services/ClassifiedService" 
      /&gt;
   &lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请注意，实现文件导入了接口文件。也就是说，此文件是服务的完整定义。</p>
		<p>现在让我们来看一看这如何与我们的 UDDI 对象对应。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1064C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">将接口映射到 tModel </font>
								</strong>
						</span>
				</a>
		</p>
		<p>Gene 首先必须将接口映射到相应的 <code>tModel</code>。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#list13"><font color="#5c81a7">清单 13</font></a>。</p>
		<br />
		<a name="list13">
				<b>清单 13. tModel </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;tModel tModelKey="66999A50-D5F4-11DA-9A50-FA44D6AD622A"&gt;

  
 &lt;name&gt;http://www.daily-moon.com/ClassifiedService-
interface&lt;/name&gt;
   &lt;description&gt;Interface for the Daily Moon Classified 
Department web application&lt;/description&gt;

   &lt;overviewDoc&gt;
      &lt;description&gt;WSDL interface document&lt;/description&gt;
      &lt;overviewURL&gt;
          http://www.daily-moon.com/ClassifiedService-interface.wsdl
      &lt;/overviewURL&gt;
   &lt;overviewDoc&gt;

   &lt;categoryBag&gt;
      &lt;keyedReference
 tModelKey="C1ACF26D-9672-4404-9D70-39B756E62AB4"
               keyName="uddi-org:types" keyValue="wsdlSpec" /&gt;
      &lt;keyedReference
 tModelKey="C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
               keyName="ntis-gov:naics:1997" keyValue="511110" /&gt;
   &lt;/categoryBag&gt;
&lt;/tModel&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先看最下面，请注意 <code>categoryBag</code>。Gene 添加了两个 <code>keyReferences</code>。第一个指定我们事实上在处理 WSDL 文件。已预定义了特定的 <code>tModelKey</code> 来表示 <code>uddi-org:types</code> 命名空间。所有 WSDL 文件都必须采用这种方式指定。第二个引用绑定到 <code>ntis-gov:naics:1997</code> 命名空间，因此 Gene 的用户可以方便地在表示与报纸有关的服务的所有 WSDL 文件中找到此定义。继续往上，我们可以看到 <code>overviewDoc</code>。除了可选描述外，它还指定了实际的 URL，可以在此处找到 WSDL 文件。</p>
		<p>最后，<code>tModel</code> 的名称应与 WSDL 文件的目标命名空间匹配。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10691">
						<span class="smalltitle">
								<strong>
										<font face="Arial">将实现映射到绑定模板</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Gene 接下来必须将实现本身映射到 <code>bindingTemplate</code>。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#list14"><font color="#5c81a7">清单 14</font></a>。</p>
		<br />
		<a name="list14">
				<b>清单 14. bindingTemplate </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;bindingTemplate serviceKey="" bindingKey=""&gt;

   &lt;accessPoint&gt;
      http://www.daily-moon.com:8080/axis2/services/ClassifiedService
   &lt;/accessPoint&gt;

   &lt;tModelInstanceDetails&gt;
      &lt;tModelInstanceDetail&gt;
         &lt;tModelInstanceInfo 
                 tModelKey="66999A50-D5F4-11DA-9A50-FA44D6AD622A"&gt;
            &lt;instanceDetails&gt;
               &lt;description&gt;The canonical implementation of 
                  the Daily Moon's classified
 service.&lt;/description&gt;
               &lt;overviewDoc&gt;
                  &lt;overviewURL&gt;
           http://www.daily-moon.com/ClassifiedService-impl.wsdl
                  &lt;/overviewURL&gt;
               &lt;/overviewDoc&gt;
            &lt;/instanceDetails&gt;
         &lt;/tModelInstanceInfo&gt;
      &lt;/tModelInstanceDetail&gt;
   &lt;/tModelInstanceDetails&gt;


&lt;/bindingTemplate&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这里我们看到，Gene 创建了一个新 <code>bindingTemplate</code>，并将 <code>accessPoint</code> 设置为实际服务的 URL。键 <code>modelInstanceDetails</code> 将接口 <code>tModel</code>（通过 <code>tModelKey</code>）链接到实现文档（在 <code>overviewDoc</code> 中指定）。现在他只需要从服务引用它即可。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N106CB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">从 businessService 和 businessEntity 引用 bindingTemplate </font>
								</strong>
						</span>
				</a>
		</p>
		<p>最后一步是将所有这些组装起来，并从 <code>businessService</code> 引用 <code>bindingTemplate</code>、从 <code>businessEntity</code> 引用 <code>businessService</code>。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#list15"><font color="#5c81a7">清单 15</font></a>。</p>
		<br />
		<a name="list15">
				<b>清单 15. 完整的 businessEntity </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;businessEntity businessKey="1A3DB880-D5F4-11DA-B880-F94D3591C691"&gt;
   &lt;name&gt;The Daily Moon&lt;/name&gt;
   &lt;name lang="fr-ca"&gt;La Lune Quotidienne&lt;/name&gt;
   &lt;contacts&gt;
      &lt;contact&gt;
         &lt;personName&gt;Pat Mooney&lt;/personName&gt;
         &lt;email&gt;patm@daily-moon.com&lt;/email&gt;
      &lt;/contact&gt;
   &lt;/contacts&gt;

   &lt;businessServices&gt;
      &lt;businessService 
            serviceKey="064B4170-D5F5-11DA-8170-A74C17FA61A7"&gt;
         &lt;name&gt;ClassifiedService&lt;/name&gt;
         &lt;bindingTemplates&gt;
            &lt;bindingTemplate 
                 bindingKey="904BD800-D53A-11DA-B055-850A1DA99D79"&gt;
               &lt;accessPoint&gt;
      http://www.daily-moon.com:8080/axis2/services/ClassifiedService
               &lt;/accessPoint&gt;

               &lt;tModelInstanceDetails&gt;
                  &lt;tModelInstanceDetail&gt;
                     &lt;tModelInstanceInfo 
                 tModelKey="66999A50-D5F4-11DA-9A50-FA44D6AD622A"&gt;
                        &lt;instanceDetails&gt;
                           &lt;description&gt;The canonical
 implementation of the Daily Moon's classified 
service.&lt;/description&gt;
                           &lt;overviewDoc&gt;
                              &lt;overviewURL&gt;
           http://www.daily-moon.com/ClassifiedService-impl.wsdl
                              &lt;/overviewURL&gt;
                           &lt;/overviewDoc&gt;
                        &lt;/instanceDetails&gt;
                     &lt;/tModelInstanceInfo&gt;
                  &lt;/tModelInstanceDetail&gt;
               &lt;/tModelInstanceDetails&gt;

            &lt;/bindingTemplate&gt;
         &lt;/bindingTemplates&gt;

         &lt;categoryBag&gt;
            &lt;keyedReference 
                 tModelKey="C1ACF26D-9672-4404-9D70-39B756E62AB4"
                 keyName="uddi-org:types" keyValue="wsdlSpec" /&gt;
            &lt;keyedReference 
                 tModelKey="C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
                 keyName="ntis-gov:naics:1997" keyValue="511110" /&gt;
         &lt;/categoryBag&gt;
      &lt;/businessService&gt;
   &lt;/businessServices&gt;

   &lt;identifierBag&gt;
      &lt;keyedReference
 tModelKey="4064C064-6D14-4F35-8953-9652106476A9" 
         keyName="DUNS Number" keyValue="55555555" /&gt;
      &lt;keyedReference tModelKey="" 
         keyName="US Tax ID" keyValue="111111111" /&gt;
   &lt;/identifierBag&gt;

   &lt;categoryBag&gt;
      &lt;keyedReference
 tModelKey="C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
           keyName="optional" keyValue="511110" /&gt;
   &lt;/categoryBag&gt;
&lt;/businessEntity&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>也就是说，服务现在已经完成：Gene 现在有了一个包含服务的 <code>businessEntity</code>。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:32 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 3 部分：统一描述、发现和集成 (UDDI) （1）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90789.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90789.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90789.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90789.html</trackback:ping><description><![CDATA[
		<p>级别: 中级</p>
		<p>
				<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/authors.html">
						<font color="#5c81a7">Nicholas Chase</font>
				</a> (<a href="mailto:ibmquestions@nicholaschase.com?subject=第 3 部分：统一描述、发现和集成 (UDDI)"><font color="#5c81a7">ibmquestions@nicholaschase.com</font></a>), 顾问, Backstop Media<br /></p>
		<p>2006 年 11 月 05 日</p>
		<blockquote>面向服务的体系结构（Service-Oriented Architectures，SOA）当前强调的重点在 Web 服务上，但很容易被所传播的各种信息搞得昏头转向。本系列教程将对主要 Web 服务规范进行全面说明，从简单对象访问协议（Simple Object Access Protocol，SOAP）一直介绍到 WS Business Process Execution Language (WS-BPEL)。本教程是系列教程的第 3 部分，将说明统一描述、发现和集成 (UDDI) 的基本概念，并介绍如何使用 Java 应用程序访问它。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!--#include virtual="/developerworks/cn/inc/s-search-query-capture.inc"-->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<span class="atitle">开始之前</span>
		</p>
		<p>本教程介绍统一描述、发现和集成 (UDDI)。UDDI 指定 Web 服务和其他公司信息的注册中心，旨在提供一种发现可使用的新 Web 服务并在理想的情况下实现操作自动化的方法。</p>
		<p>本教程假定您熟悉 Web 服务和 SOAP 的一般概念。熟悉 WSDL 的相关知识也将有所帮助，但本教程中会对一般概念进行回顾。</p>
		<p>为了理解本教程最后一部分给出的代码，您需要熟悉 Java，不过其中的概念与本教程的其他内容一样，适用于任何编程语言。</p>
		<p>
				<a name="N10137">
						<span class="smalltitle">
								<strong>
										<font face="Arial">关于本系列</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本系列教程以假想的报社 <i>Daily Moon</i> 为例，为了提高在竞争激烈的环境中的工作效率，其员工将使用各种 Web 服务来创建工作流系统，我们将在此过程中讲解各个 Web 服务基本概念。 </p>
		<p>第 1 部分说明了 Web 服务背后的基本概念，并演示了如何使用 SOAP（后续教程讨论的大部分内容的基础规范）来将 Classifieds Department 连接到内容管理系统。</p>
		<p>第 2 部分进一步深入说明如何使用 Web 服务描述语言 (WSDL) 定义 Web 服务预期产生的消息，从而使团队更方便地创建服务以及连接到服务的客户机。</p>
		<p>在第 3 部分中，团队希望准备一系列服务，并希望能方便地查找这些服务。与此对应，统一描述、发现和集成（Universal Description, Discovery and Integration，UDDI）提供了可用服务的可搜索注册中心，以便使自己的服务为其他人所注意。</p>
		<p>第 4 部分和第 5 部分讨论 WS-Security 和 WS-Policy，将详细说明如何保证该报社的服务的安全，以及团队为了访问这些刚提供了安全保护的服务需要进行哪些更改。</p>
		<p>第 6 部分重点讨论互操作性，因为必须从单个系统访问来自几个不同实现的服务。这一部分还将讨论 WS-I 证书中涉及的要求和测试。</p>
		<p>最后，第 7 部分演示如何使用业务流程执行语言（Business Process Execution Language，WS-BPEL）来从各个服务创建复杂应用程序。</p>
		<p>接下来让我们更为详细地了解一下本教程中将讨论的内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10158">
						<span class="smalltitle">
								<strong>
										<font face="Arial">关于本教程</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614">
						<font color="#996699">本系列的第 1 部分</font>
				</a>介绍了 Web 服务，并强调了 SOAP 的重要性。这些内容是通过虚构的 Daily Moon 报社的 Classifieds Department 进行相关工作的过程说明的。在<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=169509"><font color="#996699">本系列的第 2 部分</font></a>中，Classifieds Department 决定创建自己的服务，并使用 Web 服务描述语言 (WSDL) 记录其使用方式。在第 3 部分中，报社的发行人决定全面推行 Web 服务，并强制要求使用 UDDI 注册中心来记录所有可用服务。</p>
		<p>在本教程中，您将了解以下内容：</p>
		<ul>
				<li>什么是 UDDI 
</li>
				<li>UDDI 的用途 
</li>
				<li>UDDI 数据的结构 
</li>
				<li>如何有效地使用 UDDI 表示 WSDL 
</li>
				<li>可以对 UDDI 数据执行的操作 
</li>
				<li>使用 Java 与 UDDI 注册表交互 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10181">
						<span class="smalltitle">
								<strong>
										<font face="Arial">先决条件</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了处理本教程中的代码，您需要有以下软件： </p>
		<p>Apache Geronimo 或其他 UDDI 实现。为了处理本教程中的代码，您需要访问 UDDI 注册中心。为了实现此目标，所使用的注册中心类型并不重要，因为 UDDI 根本就是 Web 服务，应该可以从任何平台或语言进行访问，并能够访问任何平台或语言。既然这样，就可以使用我们在本系列的第 1 部分和第 2 部分使用的 Apache Geronimo 应用服务器（同时也是 IBM 的 WebSphere Community Edition 的基础），其中预安装了 Apache 的 UDDI 注册中心实现 jUDDI，并将其配置为基本安装的一部分。您可以从 Apache.org 下载 <a href="http://geronimo.apache.org/downloads.html"><font color="#5c81a7">Apache Geronimo</font></a>。有关安装 Geronimo 的更多信息，请参见本系列的<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614"><font color="#996699">第 1 部分</font></a>。</p>
		<p>UDDI4J——为了访问注册中心，本教程说明了 UDDI4J 项目的使用方法；此项目提供了 UDDI 概念和 Java 代码间非常紧密的集成。可以从 Sourceforge.net 下载 <a href="http://sourceforge.net/projects/uddi4j/"><font color="#5c81a7">UDDI4J</font></a>。</p>
		<p>Apache Axis2 或其他 SOAP 实现——可以手动创建 SOAP 消息，也可以手动对其进行解释，但手边如果有一个可用实现就会方便得多。您将使用的是 Apache Axis2，其中包含了各种 SOAP 相关的 API，可极大地简化您的工作。可以从 Apache.org 下载 <a href="http://ws.apache.org/axis2/download.cgi"><font color="#996699">Apache Axis2 </font></a>。本教程使用的是 0.94 版，但应该也能使用更高版本。</p>
		<p>Java 2 Standard Edition 的 1.4.x 版——所有这些工具都是基于 Java 的，本教程中将要构建的服务和客户机也是如此。可以从 Sun Developer Network 下载 <a href="http://java.sun.com/j2se/1.4.2/download.html"><font color="#5c81a7">J2SE SDK</font></a>。Geronimo 将无法与 Java 1.5 一起正常使用。</p>
		<p>另外，还需要 Web 浏览器和文本编辑器，但我想您已经有了这两个工具。如果愿意，还可以使用 Eclipse 之类的 IDE，但由于我们的重点是技术而不是工具，因此我将使用文本编辑器和命令行来编辑和编译文件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<span class="atitle">概述</span>
		</p>
		<p>让我们看一看目前已经完成的工作。</p>
		<p>
				<a name="N101B9">
						<span class="smalltitle">
								<strong>
										<font face="Arial">已完成的工作</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本系列教程逐步说明了虚构的 <i>Daily Moon</i> 报社的员工将其日常操作更改为基于 Web 服务的系统的过程。在第 1 部分中，Classifieds Department 通过与内容管理系统交互了解了 SOAP 的相关信息，在第 2 部分中，他们创建了自己的服务，并使用 Web 服务描述语言 (WSDL) 对其进行描述。现在，该报社的发行人 Rudy 对 Web 服务在其组织内的工作情况印象非常好，希望能更广泛地应用 Web 服务，甚至希望将其用于与其他组织进行交互。</p>
		<p>为此，他要求 IT 人员 Gene 和 Francis 创建一个 Web 服务注册中心，以便能让其他部门更方便地找到为了将自己的操作过渡到 Web 服务而需要的构件。</p>
		<p>Gene 和 Francis 认为最好的做法是实现统一描述、发现和集成 (UDDI) 注册中心，从而不仅能存储有关报社自己服务的信息，还能够与其他报社的注册中心进行交互。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101CB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">WSDL 回顾</font>
								</strong>
						</span>
				</a>
		</p>
		<p>向 UDDI 注册中心注册服务的部分过程将涉及到对 WSDL 定义进行操作，因此在开始新项目前，Gene 重新分析了一下上个项目中的文件，以回顾 WSDL 的基本概念。请参见<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section2.html#listing1"><font color="#5c81a7">清单 1</font></a>。</p>
		<br />
		<a name="listing1">
				<b>清单 1. WSDL 文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:tns="http://www.daily-moon.com/classifieds"
       xmlns:ns1="http://org.apache.axis2/xsd" 
       targetNamespace="http://www.daily-moon.com/classifieds"&gt;

&lt;wsdl:types&gt;
  &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://org.apache.axis2/xsd" 
         elementFormDefault="unqualified" 
         attributeFormDefault="unqualified"&gt;

    &lt;xs:element name="createNewAdRequest"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:string" name="content" /&gt;
          &lt;xs:element type="xs:string" name="endDate" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="createNewAdResponse"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:int" name="newAdId" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
...
  &lt;/xs:schema&gt;

&lt;/wsdl:types&gt;

&lt;wsdl:message name="createNewAdRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="createNewAdResponseMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdResponse" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="getExistingAdsResponseMessage"&gt;
...
&lt;/wsdl:message&gt;

&lt;wsdl:portType name="ClassifiedServicePortType"&gt;

  &lt;wsdl:operation name="createNewAd"&gt;
    &lt;wsdl:input message="tns:createNewAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:createNewAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;...&lt;/wsdl:operation&gt;
  &lt;wsdl:operation name="editExistingAd"&gt;...&lt;/wsdl:operation&gt;
  &lt;wsdl:operation name="getExistingAds"&gt;...&lt;/wsdl:operation&gt;

&lt;/wsdl:portType&gt;

&lt;wsdl:binding name="ClassifiedServiceBinding" 
              type="tns:ClassifiedServicePortType"&gt;

  &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
                style="document" /&gt;

  &lt;wsdl:operation name="createNewAd"&gt;
    &lt;soap:operation soapAction="createNewAd" style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                 namespace="http://ws.apache.org/axis2" /&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output&gt;
      &lt;soap:body use="literal" 
                 namespace="http://ws.apache.org/axis2" /&gt;
    &lt;/wsdl:output&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;...&lt;/wsdl:operation&gt;
  &lt;wsdl:operation name="editExistingAd"&gt;...&lt;/wsdl:operation&gt;
  &lt;wsdl:operation name="getExistingAds"&gt;...&lt;/wsdl:operation&gt;

&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
  &lt;wsdl:port name="ClassifiedServicePort" 
             binding="tns:ClassifiedServiceBinding"&gt;
    &lt;soap:address location=
"http://www.daily-moon.com:8080/axis2/services/ClassifiedService" /&gt;
  &lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于篇幅的原因，我们从此文档中删除了部分代码，但我们仍然能通过剩下的部分了解其一般概念。</p>
		<p>首先看最下面，我们定义了实际的服务，可通过特定的位置对其进行访问，且实现了 <code>ClassifiedServiceBinding</code> 接口。该接口表示为绑定，指定在 <code>ClassifiedServicePortType</code> portType 中定义的操作。<code>portType</code> 使用在 types 部分中定义的元素定义输入和输出消息。</p>
		<p>XML 客户机可以读取此信息，并将其用于访问 Web 服务。（或者，更为准确地说，Web 服务客户机生成工具可以读取此信息，然后生成可以访问 Web 服务的客户机。）</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101F7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">我们的目标</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在本教程中，Gene 和 Francis 将 <i>Daily Moon</i> 的信息拆分为 UDDI 友好的结构，包括业务信息和服务信息。他们将使用其通过 UDDI4J 将报社的信息和服务输入 UDDI 注册中心。它们还将与另一个报社 <i>Daily Star</i> 的私有注册中心协同工作，以查找提供即时体育赛事比分的服务。</p>
		<p>现在让我们看一看到底什么是 UDDI。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<span class="atitle">UDDI 简介</span>
		</p>
		<p>UDDI 基本上就是一个 Web 服务，但与 SOAP 和 WSDL 存在很大差异，最好在开始之前了解一些背景知识。</p>
		<p>
				<a name="N10215">
						<span class="smalltitle">
								<strong>
										<font face="Arial">为何使用 UDDI？</font>
								</strong>
						</span>
				</a>
		</p>
		<p>当所有应用程序都位于本地时，要找到所需的功能会非常容易。不过，使用 Web 服务之类的分布式系统时，您不能获得中央注册中心的好处。分布式系统也容易发生更改。而这正是 UDDI 的用武之地。它旨在用于两个目的。最初形成时，它被认为是一种“通用业务注册中心”。其想法是，企业可以使用以下三种方法之一搜索合作伙伴：</p>
		<ul>
				<li>“白页”：白页与电话簿中用于查找公司信息的白页类似。例如，如果您知道公司的名称，可以在其中查找公司的地址、如何进行联系，甚至还能够确定与组织中的哪个人联系。 
</li>
				<li>“黄页”：同样，黄页与电话簿中的黄页一样，可以在其中根据分类查找公司。UDDI 指定了各种分类法，以供各个公司用于对自己进行分类。例如，如果您在查找体育用具，则可以查找其北美工业分类系统（North American Industry Classification System，NAICS）代码为 339920 的公司。 
</li>
				<li>“绿页”：电话簿中没有绿页，但这里的想法是，公司可以使用此搜索方法来查找实现了特定服务的贸易合作伙伴。例如，可以搜索实现了使用邮政编码的距离计算功能的公司。 </li>
		</ul>
		<p>UDDI 同时也被认为是一种保持分布式应用程序长期运行的方法。其想法是这样的，可以缓存有关访问特定服务的信息，如果客户机崩溃，应用程序将自动回到注册中心并进行检查，以确定信息是否已更改。如果已更改，则可以直接在应用程序内进行更改（在理想的情况下将自动进行更改）并重试您的请求。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1022D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">UDDI 的实际应用</font>
								</strong>
						</span>
				</a>
		</p>
		<p>当 Francis 想尝试统一业务注册中心（Universal Business Registry，UBR）时，发现它已不复存在了。事实上，在推出 UDDI 3.0 版时，UBR 已被其企业赞助商终止了。为什么呢？无论 UBR 的想法多么好，但事实是基本上没有人使用它。其原因是双方面的：首先，在 UBR 中几乎没有任何可用信息——除非希望使用的是实时股票行情服务（在此情况下可找到大量信息）。第二个原因是，通常公司并不会与不熟悉的组织开展业务。很少有组织通过自动搜索寻找贸易伙伴，然后在不进行大量前期工作的情况下直接向其开发系统。自动搜索和调用模型并没有实际的效用。</p>
		<p>同时，这也受到 UDDI 在某种意义上有些超前的事实的阻碍。它设计为处理所有类型的服务，而不仅是 SOAP over HTTP，并没有提供使用 WSDL 定义的机制（至少尝试使用它的人这样认为）。</p>
		<p>不过，这并不是说根本不会使用 UDDI。相反，实际上它更多地用作“私有注册中心”。各个公司创建自己的注册中心，并在其中输入自己的服务。UDDI 还可以用作内部的业务注册中心，就像 LDAP 的传统用法一样。</p>
		<p>而且，随着从“只有 Web 服务”的思维方式转变为更多强调面向服务的体系结构（Service Oriented Architecture，SOA）的思维方式，这种处理 SOAP 之外的内容的能力可能具有极高的长期价值。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1023F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">UDDI 数据结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>UDDI 注册中心中的信息包含五种不同类型：</p>
		<ul>
				<li>
						<code>businessEntity</code> 或实际企业组织。这可以是整个组织，也可以为隶属部门或分支机构。 
</li>
				<li>
						<code>publisherAssertion</code> 或各个 <code>businessEntities</code> 间的关系。<code>publisherAssertions</code> 必须由双方共同声明才有效（因此无法将自己声明为另一个公司的分支机构），除非两个实体都对发布者负责，或除非两个实体都由同一个用户帐户输入注册中心。 
</li>
				<li>
						<code>bindingTemplate</code>，这对服务接口的规范非常重要。它可以由多个 <code>businessServices</code> 进行实现。 
</li>
				<li>
						<code>businessService</code> 或业务提供的服务。虽然现在看起来有些简单，但在 UDDI 的世界中，这并不意味着它是 Web 服务。例如，可以实际将您的公司的电话服务支持（即用户实际拨打的电话号码以及其他相关的内容）指定为 UDDI 服务。当然，您并不会提供虚拟 WSDL 文档，但这将是您的公司提供的一个服务。 
</li>
				<li>
						<code>tModels</code> 或元数据模型。研究了 UDDI 后，Francis 得出结论，tModel 可能是 UDDI 未达到预期目标的最大原因。作为服务的注册中心，您希望找到像 WSDL 一样直接为服务指定接口的方法。但是，正如所指出的，UDDI 并不是仅供用于 Web 服务，而是设计时包含了更大的灵活性。<code>tModels</code> 的确可帮助指向 XML 文档（我们稍后将证实这一点），但事实上旨在提供通过服务、业务或任何其他对象指定关于某个事项的信息的通用方法。 </li>
		</ul>
		<p>以上是 UDDI 的基本数据结构。现在让我们了解一下可以用于与 UDDI 交互的方法。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10281">
						<span class="smalltitle">
								<strong>
										<font face="Arial">UDDI API</font>
								</strong>
						</span>
				</a>
		</p>
		<p>UDDI 被认为过于复杂，但其核心在于上述五种数据类型以及四个操作：<b>find</b>、<b>get</b>、<b>save</b> 和 <b>delete</b>。也就是说，UDDI 规范说明了可以对数据进行的以下操作：</p>
		<ul>
				<li>
						<code>find_xx</code>：<code>find_businessEntity</code>、<code>find_businessService</code> 等方法提供了在 UDDI 注册中心中搜索记录的方法。这些方法返回用于标识对象的键。 
</li>
				<li>
						<code>get_xx</code>：获得了标识对象的唯一键后，可以使用 <code>get_businessService</code> 等 <code>get_xx</code> 方法来检索实际的对象本身。例如，<code>get_businessService</code> 将返回整个 <code>businessService</code> 对象，可从其中获得任何所需的信息。 
</li>
				<li>
						<code>save_xx</code>：您可能已经猜到，这些方法会将信息添加到数据库，或更改数据库中已经存在的信息。 
</li>
				<li>
						<code>delete_xx</code>：<code>delete_bindingTemplate</code>、<code>delete_tModel</code> 等方法获取对象的唯一键作为参数，然后将其从数据库中删除。这些方法的实际行为根据所删除的对象不同而有所变化。例如，由于数据库中的其他对象经常引用 <code>tModels</code>，因此并不能实际将其删除，而会将其隐藏。 </li>
		</ul>
		<p>几乎所有的 UDDI 都依赖于五个对象（<code>businessService</code>、<code>bindingTemplate</code>、<code>publisherAssertion</code>、<code>businessEntity</code> 和 <code>tModel</code>）与四个操作（<code>find</code>、<code>get</code>、<code>save</code> 和 <code>delete</code>）的这 20 个交叉方法。</p>
		<p>现在让我们看一看此结构的实际情况。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services3/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:29 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 2 部分：Web 服务描述语言 (WSDL) （4）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90786.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90786.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90786.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90786.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">结束语</span>
		</p>
		<p>在本系列教程的第 1 部分中，Daily Moon 报社的 Classifieds Department 了解了如何使用 SOAP Web 服务连接到报社的内容管理系统。在本教程中，其员工了解了如何使用 Web 服务描述语言 (WSDL) 来描述自己的服务，以供其他人使用。本教程介绍了 XML 模式的基本知识，并说明了 WSDL 文件的结构，以便能够手动进行构建。本文还讨论了各种可用样式和编码间的差异。本教程还说明了如何使用随 Apache Axis2 提供的 Java2WSDL 和 WSDL2Java 工具，以便自动从 Java 文件生成 WSDL 或反向生成。</p>
		<p>本系列教程的第 3 部分将讨论如何使用 UDDI 构建 Web 服务注册中心。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section7.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<p>
												<span class="atitle">
														<a name="download">下载</a>
												</span>
										</p>
										<table class="data-table-1" cellspacing="0" cellpadding="0" width="70%" border="0">
												<tbody>
														<tr>
																<th>描述</th>
																<th>名字</th>
																<th align="right">大小</th>
																<th>下载方法</th>
														</tr>
														<tr>
																<td class="tb-row">WSDL files</td>
																<td nowrap="">ws-understand-web-services2-WSDL.zip</td>
																<td nowrap="" align="right">3000KB</td>
																<td nowrap="">
																		<a class="fbox" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/webservices/ws-understand-web-services2-WSDL.zip">
																				<b>
																						<font color="#5c81a7">HTTP</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr valign="top">
																<td colspan="5">
																		<font color="#5c81a7">
																				<img height="12" alt="" src="https://www.ibm.com/i/c.gif" width="12" border="0" />
																		</font>
																</td>
														</tr>
														<tr>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/fw.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/whichmethod.html">
																				<font color="#5c81a7">关于下载方法的信息</font>
																		</a>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="50" />
																		</font>
																</td>
																<td>
																		<font color="#5c81a7">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/sout.gif" width="16" />
																		</font>
																</td>
																<td>
																		<a class="fbox" href="http://www.adobe.com/products/acrobat/readstep2.html">
																				<font color="#5c81a7">Get Adobe® Reader®</font>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<b>学习</b>
		<br />
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="https://www6.software.ibm.com/developerworks/education/ws-understand-web-services2/?S_TACT=105AGX52&amp;S_CMP=cn-t-ws" target="_blank"><font color="#5c81a7">英文原文</font></a> 。<br /><br /></li>
				<li>在本系列教程的第 1 部分<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614"><font color="#996699">了解 Web 服务规范，第 1 部分：SOAP</font></a> 中，您将了解有关 Web 服务的总体信息，特别是 SOAP Web 服务。<br /><br /></li>
				<li>访问 <a href="http://www.w3.org/TR/2001/NOTE-wsdl-20010315"><font color="#5c81a7">WSDL 1.1 规范</font></a>。<br /><br /></li>
				<li>WSDL 2.0（候选）推荐标准包括三个文档：<a href="http://www.w3.org/TR/wsdl20-primer/"><font color="#5c81a7">第 0 部分：引言</font></a>、<a href="http://www.w3.org/TR/wsdl20/"><font color="#5c81a7">第 1 部分：核心语言</font></a>和<a href="http://www.w3.org/TR/wsdl20-adjuncts/"><font color="#5c81a7">第 2 部分：附录</font></a>。您还可以参考两个相关文档 <a href="http://www.w3.org/TR/wsdl20-soap11-binding/"><font color="#5c81a7">SOAP 1.1 绑定</font></a>和<a href="http://www.w3.org/TR/wsdl20-rdf/"><font color="#5c81a7">RDF 映射</font></a>。<br /><br /></li>
				<li>访问 <a href="http://ws.apache.org/axis2/"><font color="#5c81a7">Apache Axis2 网站</font></a>，以获取您的特定版本的文档的相关链接。<br /><br /></li>
				<li>
						<a href="http://geronimo.apache.org/">
								<font color="#5c81a7">Apache Geronimo 网站</font>
						</a>提供了 Apache Software Foundation 的 J2EE 服务器项目 Apache Geronimo 的详细信息。<br /><br /></li>
				<li>developerWorks 教程“<a href="http://www.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=85023"><font color="#5c81a7">XML 入门</font></a>”（2002 年 11 月）很好地介绍了 XML 的基本知识。<br /><br /></li>
				<li>要更好地了解如何将 XML 作为对象处理，请参阅 <a href="http://www.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=84890"><font color="#5c81a7">理解 DOM</font></a>。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/webservices/ws-whichwsdl/">
								<font color="#5c81a7">我应该采用哪一种 WSDL 样式？</font>
						</a> 是一篇优秀的文章，说明了 Document 与 RPC 及 Encoded 与 Literal 样式的对比情况，其中包括每种样式的优缺点。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/webservices/ws-rdf/">
								<font color="#5c81a7">借助 RDF 增强您的 WSDL</font>
						</a> 说明了如何与资源描述框架 (Resource Description Framework) 结合来更好地利用 WSDL；此框架是万维网联盟 (World Wide Web Consortium) 用于定义 XML 对象的元数据的正式格式。<br /><br /></li>
				<li>您可以通过导入和包含数据来为 WSDL 添加更多的功能和灵活性，但这样做可能会比较麻烦。<a href="http://www.ibm.com/developerworks/cn/webservices/ws-tip-imports.html"><font color="#5c81a7">Web 服务编程技巧和诀窍: WSDL 文件导入</font></a> 说明了如何正确进行此工作。<br /><br /></li>
				<li>Axis2 并不是唯一用于从 WSDL 生成代码的机制。<a href="http://www.ibm.com/developerworks/edu/i-dw-wes-wsdl-i.html?S_TACT=105AGX52&amp;S_CMP=cn-t-ws"><font color="#5c81a7">Top-down Web service development: Build a WSDL file to generate a Web service using WebSphere Studio</font></a> 提供了另一种方法。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/webservices/ws-xsltwsdl/">
								<font color="#5c81a7">使用 XSLT 处理 WSDL 文档</font>
						</a> 说明了多种方法，可通过这些方法深入理解 XSL 样式表中的 WSDL 文件，并了解应该避免的常见错误。<br /><br /></li>
				<li>可以在 <a href="http://www.ibm.com/developerworks/cn/webservices"><font color="#996699">developerWorks SOA and Web Services 专区</font></a>获得大量相关信息。<br /><br /></li>
				<li>访问 <a href="http://www.ibm.com/developerworks/cn/opensource"><font color="#996699">developerWorks Open Source 专区</font></a>，全面了解 Apache Geronimo。<br /><br /></li>
				<li>阅读 developerWorks 上的 <a href="http://www.ibm.com/developerworks/cn/views/opensource/tutorials.jsp?view_by=search&amp;search_by=%E7%94%A8+Apache+Geronimo+%E5%92%8C+Axis2+%E5%AE%9E%E7%8E%B0%E5%9C%A8%E7%BA%BF%E9%93%B6%E8%A1%8C"><font color="#5c81a7">Online banking with Apache Geronimo and Axis2 系列教程</font></a>，以获得一个实际的 Axis2 示例。<br /><br /></li>
				<li>访问 <a href="http://www.ibm.com/developerworks/cn/java"><font color="#5c81a7">developerWorks Java zone</font></a>，以了解有关 Java 编程的更多信息。<br /><br /></li>
				<li>访问 <a href="http://www.ibm.com/developerworks/cn/xml"><font color="#5c81a7">developerWorks XML 专区</font></a>，全面了解 XML。<br /><br /></li>
		</ul>
		<br />
		<b>获得产品和技术</b>
		<br />
		<ul>
				<li>获取 <a href="http://geronimo.apache.org/downloads.html"><font color="#5c81a7">Apache Geronimo</font></a>。<br /><br /></li>
				<li>获取 <a href="http://ws.apache.org/axis2/download.cgi"><font color="#996699">Apache Axis2</font></a>。本教程使用的是 0.95 版，但应该也能使用更高版本。<br /><br /></li>
				<li>获取 <a href="http://java.sun.com/j2se/1.5.0/download.jsp"><font color="#5c81a7">J2SE SDK</font></a>。<br /><br /></li>
				<li>获取 <a href="http://ant.apache.org/bindownload.cgi"><font color="#5c81a7">Apache Ant</font></a>。</li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="70%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
												<img height="80" alt="Nicholas Chase 的照片" src="http://www.ibm.com/developerworks/i/p-nchase.jpg" width="64" align="left" border="0" />
										</p>
								</td>
								<td>
										<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Nicholas Chase 曾参与多家公司的网站开发工作，如 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 担任过高中物理教师、低辐射废料处理设施管理员、在线科幻小说杂志编辑、多媒体工程师、Oracle 讲师以及一家交互通信公司的首席技术官。他已经出版了多本图书，其中包括 <i>XML Primer Plus</i> (Sams)。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:19 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 2 部分：Web 服务描述语言 (WSDL) （3）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90785.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:11:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90785.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90785.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90785.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: WSDL 样式				对于刚刚学习 WSDL 的开发人员而言，最容易混淆的是为文档选择样式。让我们了解一下不同的选项及其对 WSDL 和 SOAP 文档的影响。																														编程样式和编码																						在 XML 世界中，通常有两种类型的人：将 XML 视为数据格式的人和将 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90785.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:11 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 2 部分：Web 服务描述语言 (WSDL) （2）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90784.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90784.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90784.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90784.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">创建 WSDL 文档</span>
		</p>
		<p>Christine 负责实际的数据，而 Larry 负责在服务及其客户机间传递的实际消息。为了处理这些消息，他创建了 WSDL 文档。</p>
		<p>
				<a name="N10394">
						<span class="smalltitle">
								<strong>
										<font face="Arial">消息</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Larry 的第一步是决定服务将实际执行的函数，然后再为服务定义消息。与部门的其他人商议后，他制订了函数及其对应消息的列表，我们将在这一部分的其余内容中讨论这些函数。</p>
		<p>
				<a name="N1039D">
						<b>createNewAd </b>
				</a>
		</p>
		<p>此函数在广告结束日期接受广告的内容，并返回新创建的广告的内容（请参见清单 10 和清单 11）。</p>
		<br />
		<a name="N103AE">
				<b>清单 10. createNewAdRequest（输入）</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;req:createNewAdRequest 
              xmlns:req="http://daily-moon.com/classifieds/"&gt;
     &lt;req:content&gt;Vintage 1963 T-Bird...&lt;/req:content&gt;
     &lt;req:endDate&gt;4/30/07&lt;/req:endDate&gt;
  &lt;/req:createNewAdRequest&gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<a name="N103BF">
				<b>清单 11. createNewAdResponse（输出）</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;res:createNewAdResponse 
              xmlns:res="http://daily-moon.com/classifieds/"&gt;
      &lt;res:newAdId&gt;1138&lt;/res:newAdId&gt;
  &lt;/res:createNewAdResponse&gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N103CC">
						<b>editExistingAd </b>
				</a>
		</p>
		<p>此函数接受现有广告，并替换其在数据库中的内容。它将返回一个 Boolean 值声明，指示操作是否成功（请参见清单 12 和清单 13）。</p>
		<br />
		<a name="N103DD">
				<b>清单 12. editExistingAdRequest（输入）</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;req:editExistingAdRequest
              xmlns:req="http://daily-moon.com/classifieds/"&gt;
      &lt;req:ClassifiedAd&gt;
         &lt;req:id&gt;1138&lt;/req:id&gt;
         &lt;req:content&gt;Vintage 1963 T-Bird...&lt;/req:content&gt;
         &lt;req:startDate&gt;4/1/2007&lt;/req:startDate&gt;
         &lt;req:endDate&gt;4/30/2007&lt;/req:endDate&gt;
      &lt;req:ClassifiedAd&gt;
  &lt;/req:editExistingAdRequest &gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<a name="N103EE">
				<b>清单 13. editExistingAdResponse（输出） </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;res:editExistingAdResponse
              xmlns:res="http://daily-moon.com/classifieds/"&gt;
      &lt;res:isOK&gt;true&lt;/res:isOK&gt;
  &lt;/res:editExistingAdResponse&gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N103FB">
						<b>getExistingAds </b>
				</a>
		</p>
		<p>此函数将返回现有 <code>ClassifiedAds</code> 的列表（请参见清单 14 和清单 15）。</p>
		<br />
		<a name="N10410">
				<b>清单 14. getExistingAdsRequest（输入）</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                     
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;req:getExistingAdsRequest 
                  xmlns:req="http://daily-moon.com/classifieds/"&gt;
  &lt;/req:getExistingAdsRequest&gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<a name="N10421">
				<b>清单 15. getExistingAdsResponse（输出） </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;res:getExistingAdsResponse
              xmlns:res="http://daily-moon.com/classifieds/"&gt;
    &lt;res:ClassifiedList&gt;
      &lt;res:ClassifiedAd&gt;
         &lt;res:id&gt;1138&lt;/res:id&gt;
         &lt;res:content&gt;Vintage 1963 T-Bird...&lt;/res:content&gt;
         &lt;res:startDate&gt;4/1/2007&lt;/res:startDate&gt;
         &lt;res:endDate&gt;4/30/2007&lt;/res:endDate&gt;
      &lt;/res:ClassifiedAd&gt;
      &lt;res:ClassifiedAd&gt;
         &lt;res:id&gt;2883&lt;/res:id&gt;
         &lt;res:content&gt;Championship playoff
 tickets...&lt;/res:content&gt;
         &lt;res:startDate&gt;4/1/2007&lt;/res:startDate&gt;
         &lt;res:endDate&gt;4/30/2007&lt;/res:endDate&gt;
      &lt;/res:ClassifiedAd&gt;
    &lt;/res:ClassifiedList&gt;
  &lt;/res:getExistingAdsResponse &gt;
&lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1042E">
						<b>finalizeIssue </b>
				</a>
		</p>
		<p>此函数是“仅输入”的函数，接收最终的发布日期，而并不返回任何数据（请参见清单 16）。</p>
		<br />
		<a name="N1043F">
				<b>清单 16. finalizeIssueRequest（输入） </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope 
       xmlns:env="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;env:Body&gt;
  &lt;req:finalizeIssueRequest 
                  xmlns:req="http://daily-moon.com/classifieds/"&gt;
     &lt;req:issueDate&gt;4/10/06&lt;/req:issueDate&gt;
  &lt;/req:FinalizeIssueRequest &gt;
 &lt;/env:Body&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>有了这些消息后，Larry 开始着手创建实际的 WSDL 文档。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1044F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建基本文档</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Larry 首先创建 WSDL 文档的基本框架（请参见清单 17）。</p>
		<br />
		<a name="N1045C">
				<b>清单 17. 基本 WSDL 文档</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       targetNamespace="http://ws.apache.org/axis2"&gt;

&lt;wsdl:types&gt;
&lt;/wsdl:types&gt;

&lt;wsdl:message name="createNewAdRequestMessage"&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:portType name="ClassifiedServicePortType"&gt;
&lt;/wsdl:portType&gt;

&lt;wsdl:binding name="ClassifiedServiceBinding"&gt;
&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>像其所定义的 SOAP 消息一样，WSDL 也是由 XML 组成的。定义位于 <code>definitions</code> 元素内，如此处所示。首先看下面，您定义了 <code>service</code>。<code>service</code> 使用一个特殊的 <code>binding</code>，而后者是 <code>portType</code> 的一个实现。<code>portType</code> 定义操作，而操作由 <code>messages</code> 组成。消息中包含由 <code>types</code> 部分中定义的 XML 组成。</p>
		<p>
				<code>definitions</code> 元素定义两个命名空间。第一个使用前缀 <code>wsdl</code>:，为组成 WSDL 的实际元素提供命名空间。第二个 <code>targetNamespace</code> 定义 WSDL 定义的项所属的命名空间。</p>
		<p>Larry 首先定义的是类型。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10497">
						<span class="smalltitle">
								<strong>
										<font face="Arial">定义类型</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Larry 拿到 Christine 提供的定义，并将其放入 <code>types</code> 元素中，从而在文档内创建了一个新模式，如清单 18 中所示。</p>
		<br />
		<a name="N104A8">
				<b>清单 18. 定义类型</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       <span class="boldcode"><strong>xmlns:ns1="http://org.apache.axis2/xsd" </strong></span>
       targetNamespace="http://ws.apache.org/axis2"&gt;

&lt;wsdl:types&gt;
  &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://org.apache.axis2/xsd" 
         elementFormDefault="unqualified" 
         attributeFormDefault="unqualified"&gt;

    &lt;xs:element type="ns1:ClassifiedAd" name="ClassifiedAd" /&gt;
    &lt;xs:complexType name="ClassifiedAd"&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element type="xs:int" name="id" /&gt;
        &lt;xs:element type="xs:string" name="content" /&gt;
        &lt;xs:element type="xs:string" name="endDate" /&gt;
        &lt;xs:element type="xs:string" name="startDate" /&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;

    &lt;xs:element type="ns1:ClassifiedList" name="ClassifiedList" /&gt;
    &lt;xs:complexType name="ClassifiedList"&gt;
      &lt;xs:sequence&gt;
        &lt;xs:element minOccurs="0" type="ns1:ClassifiedAd" 
                        name="ClassifiedAd" maxOccurs="unbounded" /&gt;
      &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;

    &lt;xs:element name="createNewAdRequest"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:string" name="content" /&gt;
          &lt;xs:element type="xs:string" name="endDate" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="createNewAdResponse"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:int" name="newAdId" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="editExistingAdRequest"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="ns1:ClassifiedAd" 
name="ClassifiedAd" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="editExistingAdResponse"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:boolean" name="isOK" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="getExistingAdsRequest"&gt;
      &lt;xs:complexType /&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="getExistingAdsResponse"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="ns1:ClassifiedList" 
                                   name="ClassifiedList" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="finalizeIssueRequest"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:string" name="issueDate" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

  &lt;/xs:schema&gt;

&lt;/wsdl:types&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>从代码的起始处开始，请注意我们有两个命名空间部分。第一个位于 <code>schema</code> 元素本身中。此处 Larry 定义了两个命名空间。第一个命名空间是 XML Schema 命名空间，使用前缀 <code>xs</code>:。第二个命名空间是 <code>targetNamespace</code>，定义模式创建的定义所属的命名空间。也就是说，当第二个版本创建名为 <code>ClassifiedAd</code> 的 <code>complexType</code> 时，该定义属于命名空间 <code>http://org.apache.axis2/xsd</code>。不过，为了引用该命名空间，Larry 需要创建另一个别名。您可以在以 <code>ns1</code>: 为前缀的 definitions 元素上看到此别名。（Larry 可以直接将该定义放在 schema 元素上，但他稍后需要在 schema 元素外使用此定义。）后面两个属性 <code>elementFormDefault</code> 和 <code>attributeFormDefault</code> 表示元素和属性是否应该有命名空间前缀。</p>
		<p>前面四个定义来自 Christine 提供给 Larry 的定义，但其余定义用于定义 Larry 前面创建的消息。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104DE">
						<span class="smalltitle">
								<strong>
										<font face="Arial">有关命名空间的说明</font>
								</strong>
						</span>
				</a>
		</p>
		<p>和许多编程语言一样，在 XML 中，经常有必要为各种元素和属性指定“命名空间”。这样就能方便地对具有相同名称但用途不同（来源也可能不同）的元素进行区分。XML 通过 URI 引用命名空间。例如，XML 模式命名空间为 <code>http://www.w3.org/2001/XMLSchema</code>。不过，为了方便起见，还为其分配了一个别名（或前缀）。例如，此处的模式命名空间的前缀为 <code>xs:</code>。请记住，别名只是一个别名而已，重要的是 URI。因此，属于 <code>ns1: </code>命名空间的元素或属性也是模式的 <code>targetNamespace</code> 的一部分。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104F7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建消息</font>
								</strong>
						</span>
				</a>
		</p>
		<p>定义了各个类型后，Larry 就可以定义将在 SOAP 信封中来回传递的消息了（请参见清单 19）。</p>
		<br />
		<a name="N10504">
				<b>清单 19. 创建消息</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:ns1="http://org.apache.axis2/xsd" 
       targetNamespace="http://ws.apache.org/axis2"&gt;

&lt;wsdl:types&gt;
  &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://org.apache.axis2/xsd" 
         elementFormDefault="unqualified" 
         attributeFormDefault="unqualified"&gt;
...
    &lt;xs:element name="createNewAdRequest"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:string" name="content" /&gt;
          &lt;xs:element type="xs:string" name="endDate" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

    &lt;xs:element name="createNewAdResponse"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:sequence&gt;
          &lt;xs:element type="xs:int" name="newAdId" /&gt;
        &lt;/xs:sequence&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;

...
  &lt;/xs:schema&gt;

&lt;/wsdl:types&gt;

&lt;wsdl:message name="createNewAdRequestMessage"&gt;
  <span class="boldcode"><strong>&lt;wsdl:part name="part1" element="ns1:createNewAdRequest"
 /&gt;</strong></span>
&lt;/wsdl:message&gt;

&lt;wsdl:message name="createNewAdResponseMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdResponse" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="getExistingAdsResponseMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:getExistingAdsResponse" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="editExistingAdRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:editExistingAdRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="getExistingAdsRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:getExistingAdsRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="editExistingAdResponseMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:editExistingAdResponse" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="finalizeIssueRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:finalizeIssueRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:portType name="ClassifiedServicePortType"&gt;
&lt;/wsdl:portType&gt;

&lt;wsdl:binding name="ClassifiedServiceBinding"&gt;
&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>每个消息都具有一个 <code>name</code>，以便稍后对其进行引用。在每个消息内，您可以定义一个或多个 <code>part</code>。请注意，WSDL 2.0 仅允许每个 <code>message</code> 包含一个 <code>part</code>，因此 Larry 此处严格遵循了此约定。 </p>
		<p>每个 <code>part</code> 都有一个 <code>name</code>，而由 <code>element</code> 的名称组成该 <code>part</code>。元素名称将反过来引用在 <code>types</code> 元素中定义的类型。请注意，元素的名称以 <code>ns1:</code> 为前缀，即与模式的 <code>targetNamespace</code> 匹配的命名空间前缀。也就是说，当 Larry 创建 <code>createNewAdResponse</code> 的定义时，该定义进入了 <code>http://org.apache.axis2/xsd namespace</code> 中，由于前缀 <code>ns1:</code> 也引用此命名空间，因此现在可以使用该前缀引用此命名空间。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1054E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">定义接口 (portType)</font>
								</strong>
						</span>
				</a>
		</p>
		<p>消息本身并不会带来什么好处，因此 Larry 需要将其与特定的操作关联。这些 <code>operation</code> 属于 <code>portType</code> 的一部分。<code>portType</code> 仅包含定义，而不包含实现。就这个意义而言，它与接口很相似。事实上，在 WSDL 2.0 中，<code>portType</code> 的名称已更改为 <code>interface</code>。Larry 为每个功能创建了一个操作（请参见清单 20）。</p>
		<br />
		<a name="N1056F">
				<b>清单 20. 添加操作</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       <span class="boldcode"><strong>xmlns:tns=http://ws.apache.org/axis2</strong></span>
       xmlns:ns1="http://org.apache.axis2/xsd" 
       targetNamespace="http://ws.apache.org/axis2"&gt;

&lt;wsdl:types&gt;
...
&lt;/wsdl:types&gt;

&lt;wsdl:message name="createNewAdRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:message name="createNewAdResponseMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdResponse" /&gt;
&lt;/wsdl:message&gt;
...
&lt;wsdl:message name="finalizeIssueRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:finalizeIssueRequest" /&gt;
&lt;/wsdl:message&gt;

&lt;wsdl:portType name="ClassifiedServicePortType"&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;
    &lt;wsdl:input message="tns:finalizeIssueRequestMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="createNewAd"&gt;
    &lt;wsdl:input message="tns:createNewAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:createNewAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="editExistingAd"&gt;
    &lt;wsdl:input message="tns:editExistingAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:editExistingAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="getExistingAds"&gt;
    &lt;wsdl:input message="tns:getExistingAdsRequestMessage" /&gt;
    &lt;wsdl:output message="tns:getExistingAdsResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

&lt;/wsdl:portType&gt;

&lt;wsdl:binding name="ClassifiedServiceBinding"&gt;
&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>Larry 创建了两种类型的消息。一类消息（如 <code>finalizeIssue</code>）是“仅输入”的操作，因为它仅具有输入消息。消息 <code>finalizeIssueRequest</code> 是前面定义的，和前面一样，我们将创建一个新前缀 <code>tns:</code> 来引用其所属的命名空间。</p>
		<p>第二种操作类型是请求/响应操作，如 <code>createNewAd</code>。在这种情况下，Larry 将同时定义输入和输出消息。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10591">
						<span class="smalltitle">
								<strong>
										<font face="Arial">定义绑定</font>
								</strong>
						</span>
				</a>
		</p>
		<p>如果 <code>portType</code> 像接口，则 <code>binding</code> 为该接口的实现（请参见清单 21）。</p>
		<br />
		<a name="N105A6">
				<b>清单 21. 创建绑定</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;wsdl:definitions 
<span class="boldcode"><strong>xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" </strong></span>
       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:tns="http://ws.apache.org/axis2"
       xmlns:ns1="http://org.apache.axis2/xsd" 
       targetNamespace="http://ws.apache.org/axis2"&gt;

&lt;wsdl:types&gt;
&lt;/wsdl:types&gt;

&lt;wsdl:message name="createNewAdRequestMessage"&gt;
  &lt;wsdl:part name="part1" element="ns1:createNewAdRequest" /&gt;
&lt;/wsdl:message&gt;
...
&lt;wsdl:portType name="ClassifiedServicePortType"&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;
    &lt;wsdl:input message="tns:finalizeIssueRequestMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="createNewAd"&gt;
    &lt;wsdl:input message="tns:createNewAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:createNewAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="editExistingAd"&gt;
    &lt;wsdl:input message="tns:editExistingAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:editExistingAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="getExistingAds"&gt;
    &lt;wsdl:input message="tns:getExistingAdsRequestMessage" /&gt;
    &lt;wsdl:output message="tns:getExistingAdsResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;

&lt;/wsdl:portType&gt;

&lt;wsdl:binding name="ClassifiedServiceBinding" 
                         type="tns:ClassifiedServicePortType"&gt;

  &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
                                                style="document" /&gt;

  &lt;wsdl:operation name="createNewAd"&gt;
    &lt;soap:operation soapAction="createNewAd" style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:output&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;
    &lt;soap:operation soapAction="finalizeIssue" style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:input&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="editExistingAd"&gt;
    &lt;soap:operation soapAction="editExistingAd" style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:output&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="getExistingAds"&gt;
    &lt;soap:operation soapAction="getExistingAds" style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output&gt;
      &lt;soap:body use="literal" 
                      namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:output&gt;
  &lt;/wsdl:operation&gt;

&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先，请注意绑定 <code>type</code> 引用 Larry 已经创建的 <code>ClassifiedServicePortType</code>。其次，请注意添加了 <code>soap: </code>命名空间。此 <code>binding</code> 用于 HTTP 上的 SOAP 消息，如 <code>soap:binding</code> 元素中所示。请注意 <code>transport</code> 属性。（尚不用担心 <code>style</code>，我们将在接下来的部分中对其进行讨论。）</p>
		<p>对于共享其在 <code>portType</code> 中的名称的每个操作，Larry 现在都要添加一个 <code>soap:operation</code> 元素。此元素执行两个操作。根据此元素的说明，第一个操作实际上是 SOAP 操作。第二个操作用于指定 <code>soapAction</code>，此为在实际 SOAP 消息前发送的 HTTP Header。服务器可以使用此 Header 来将请求路由到相应的操作。</p>
		<p>请注意，<code>soapAction</code> 始终有一定的问题，虽然在 WSDL 1.1 是可选的，但已经完全从 WSDL 2.0 中删除了。</p>
		<p>每个操作还定义 <code>input</code> 和 <code>output</code> 消息（或者，使用仅输入的消息时，只定义 <code>input</code> 消息），但现在 Larry 还将添加特定的 SOAP 信息。同样，不用担心 <code>use</code> 属性；我们也将在稍后讨论此属性。此元素还为有效负载的内容定义命名空间。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N105FA">
						<span class="smalltitle">
								<strong>
										<font face="Arial">定义服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>定义了接口和绑定后，接下来就要定义服务了（请参见清单 22）。</p>
		<br />
		<a name="N10607">
				<b>清单 22. 定义服务</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
&lt;wsdl:binding name="ClassifiedServiceBinding" 
                     type="tns:ClassifiedServicePortType"&gt;

...
&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
  &lt;wsdl:port name="ClassifiedServicePort" 
                    binding="tns:ClassifiedServiceBinding"&gt;
    &lt;soap:address location=
 "http://127.0.0.1:8080/axis2/services/ClassifiedService" /&gt;
  &lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>service</code> 可以具有多个端点，每个端点都由其自己对应的 <code>port</code> 元素进行定义。<code>port</code> 元素与特定绑定对应，包括有关如何访问此绑定的信息。在本例中，Larry 指定可以通过 SOAP 在以下位置访问该端口：<code>http://127.0.0.1:8080/axis2/services/ClassifiedService</code>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10623">
						<span class="smalltitle">
								<strong>
										<font face="Arial">为服务添加注释</font>
								</strong>
						</span>
				</a>
		</p>
		<p>定义了服务后，还要进行一个步骤。虽然是可选的，但真的应该进行此步骤。WSDL 允许您向 WSDL 文档中的任何元素添加 documentation 元素。清单 23 提供了一个示例。</p>
		<br />
		<a name="N10630">
				<b>清单 23. 为服务添加注释</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
&lt;wsdl:portType name="ClassifiedServicePortType"&gt;

  &lt;wsdl:document&gt;The finalizeIssue operation is an "in-only"
         operation that tells the system not to accept any 
         more ads for a particular date.&lt;/wsdl:document&gt;

  &lt;wsdl:operation name="finalizeIssue"&gt;
    &lt;wsdl:input message="tns:finalizeIssueRequestMessage" /&gt;
  &lt;/wsdl:operation&gt;
...
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>有关 WSDL 的知识还有很多，但上面这些是基本的内容。不过，继续学习本教程之前，让我们了解一些您可能遇到的更为复杂的情况。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1063C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">绑定 SOAP over HTTP 之外的其他协议</font>
								</strong>
						</span>
				</a>
		</p>
		<p>尽管 WSDL 的最常见用法是定义 SOAP over HTTP，但却不是指定 Web 服务的唯一方法。例如，Larry 可以创建一个使用 SOAP over E-mail 的绑定，并仅为 <code>finalizeIssue</code> 操作启用它（请参见清单 24）。</p>
		<br />
		<a name="N1064D">
				<b>清单 24. 添加其他绑定</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
&lt;wsdl:binding name="ClassifiedService<span class="boldcode"><strong>Email</strong></span>Binding" 
                          type="tns:ClassifiedServicePortType"&gt;

   <span class="boldcode"><strong>&lt;soap:binding style="document" transport="http://example.com/smtp"/&gt;</strong></span>

   &lt;wsdl:operation name="finalizeIssue"&gt;
     &lt;wsdl:input message="tns:finalizeIssueRequestMessage"&gt;
         <span class="boldcode"><strong>&lt;soap:body parts="body" use="literal"/&gt;</strong></span>
      &lt;/wsdl:input&gt;
   &lt;/wsdl:operation&gt;

&lt;/wsdl:binding&gt;

&lt;wsdl:service name="ClassifiedService"&gt;
  &lt;wsdl:port name="ClassifiedServicePort" 
                    binding="tns:ClassifiedServiceBinding"&gt;
    &lt;soap:address location=
       "http://127.0.0.1:8080/axis2/services/ClassifiedService" /&gt;
  &lt;/wsdl:port&gt;

  &lt;wsdl:port name="ClassifiedServiceEmailPort" 
                       binding="tns:ClassifiedServiceEmailBinding"&gt;
    &lt;soap:address location="mailto:finalizeIssue@daily-moon.com" /&gt;
  &lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;

&lt;/wsdl:definitions&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>此处 Larry 添加了第二个绑定 <code>ClassifiedServiceEmailBinding</code>。和 <code>ClassifiedServiceBinding</code> 绑定一样，此绑定基于 <code>ClassifiedServicePortType portType</code>。不过，在本例中，他使用的是 SMTP（用于发送电子邮件的协议），而不是 HTTP。他可以随后向服务添加第二个端口，使其基于新绑定，使用电子邮件 URL 作为地址，而不是 HTTP URL。您可以为单个服务创建任意多的端口。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1066E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">SOAP 和 Mime</font>
								</strong>
						</span>
				</a>
		</p>
		<p>另一个与此解决方案有关的主题还不甚明显，即将 SOAP 用于附件。由于消息不仅是 XML 文档，您应该如何使用 WSDL 进行指定呢？这个问题的答案涉及到一个事实，即消息是使用“多部分 MIME”发送的。幸运的是，您可以在 WSDL 文档中指定这一点。例如，Larry 希望指定一个操作，通过此操作，用户可以编辑从广告的 PDF 校样获得的现有广告（请参见清单 25）。</p>
		<br />
		<a name="N1067B">
				<b>&gt;清单 25. 指定包含多个部分的消息</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
  &lt;wsdl:operation name="editExistingAd"&gt;
    &lt;soap:operation soapAction="editExistingAd" 
style="document" /&gt;
    &lt;wsdl:input&gt;
      &lt;soap:body use="literal" 
                namespace="http://daily-moon.com/classifieds" /&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output&gt;
      &lt;soap:body use="literal" 
                namespace="http://daily-moon.com/classifieds" /&gt;
      &lt;mime:multipartRelated&gt;
          &lt;mime:part&gt;
             &lt;soap:body parts="body" use="literal"/&gt;
          &lt;/mime:part&gt;
          &lt;mime:part&gt;
              &lt;mime:content part="docs" type="text/html"/&gt;
          &lt;/mime:part&gt;
          &lt;mime:part&gt;
              &lt;mime:content part="proof" type="image/gif"/&gt;
              &lt;mime:content part="proof" type="image/jpeg"/&gt;
           &lt;/mime:part&gt;
       &lt;/mime:multipartRelated&gt;
    &lt;/wsdl:output&gt;
...
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，返回消息包含 SOAP、一个 HTML 文档和两个图像文件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10687">
						<span class="smalltitle">
								<strong>
										<font face="Arial">WSDL 2.0 中包含的新内容</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在此部分中，我尽力说明 WSDL 2.0 与 WSDL 1.1 的一些不同之处，如从可能出现多个 <code>portType</code> 的情况变为单个 <code>interface</code>，以及 <code>message</code> 不再能包含多个部分等。其他方面也有一定程度的调整。</p>
		<p>有多个因素促成了这些更改，但大部分更改的目的都是为了提高互操作性——不符合 WS-I 基本概要 (WS-I Basic Profile) 的构造通常都禁止使用——或为了更方便地将 WSDL 与经过扩展的 SOAP 规范一起使用。例如，WSDL 2.0 更多使用的是“组件”模型，此模型更适合与 WS-Choreography 等规范的要求进行集成。</p>
		<p>另一个更改与“消息交换模式”的正式规范有关。WSDL 2.0 不依赖于用户确定是同时存在输入和输出还是仅有一个输入消息，它允许您具体地声明所使用的模式（请参见清单 26）。</p>
		<br />
		<a name="N106A6">
				<b>清单 26. 指定消息交换模式</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
  &lt;wsdl:operation name="finalizeIssue"
            <span class="boldcode"><strong>pattern=http://www.w3.org/2006/01/wsdl/in-only</strong></span>"&gt;
    &lt;wsdl:input message="tns:finalizeIssueRequestMessage" /&gt;
  &lt;/wsdl:operation&gt;

  &lt;wsdl:operation name="createNewAd"
              <span class="boldcode"><strong>pattern="http://www.w3.org/2006/01/wsdl/in-out</strong></span>"&gt;
    &lt;wsdl:input message="tns:createNewAdRequestMessage" /&gt;
    &lt;wsdl:output message="tns:createNewAdResponseMessage" /&gt;
  &lt;/wsdl:operation&gt;
...
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>现在让我们深入了解一下 WSDL 样式。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:09 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 2 部分：Web 服务描述语言 (WSDL) （1）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90783.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90783.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90783.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90783.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<p id="subtitle">共享 Web 服务</p>
										<img class="display-img" height="6" alt="" src="https://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="https://www6.software.ibm.com/developerworks/cn/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table class="no-print" cellspacing="0" cellpadding="0" width="150" align="center" border="0">
																				<tbody>
																						<tr>
																								<td align="left" width="21">
																										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="21" />
																								</td>
																								<td valign="center" align="middle">第 1 页，共 11 页</td>
																								<td align="right" width="21">
																										<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section2.html">
																												<img height="21" alt="后一页" src="https://www.ibm.com/i/v14/buttons/cn/zh/arrow_rd.gif" width="21" align="middle" border="0" />
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<br />
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<!--#include virtual="/developerworks/cn/inc/s-new-site-features.inc"-->
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">对本教程的评价</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<table cellspacing="0" cellpadding="0" width="143" border="0">
																												<tbody>
																														<tr valign="top">
																																<td width="8">
																																		<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="8" />
																																</td>
																																<td>
																																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/d_bold.gif" width="16" vspace="3" border="0" />
																																</td>
																																<td width="125">
																																		<p>
																																				<a class="smallplainlink" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/rating.html">
																																						<b>
																																								<font color="#5c81a7" size="2">帮助我们改进这些内容</font>
																																						</b>
																																				</a>
																																		</p>
																																</td>
																														</tr>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>级别: 中级</p>
										<p>
												<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/authors.html">
														<font color="#5c81a7">Nicholas Chase</font>
												</a> (<a href="mailto:ibmquestions@nicholaschase.com?subject=第 2 部分：Web 服务描述语言 (WSDL)"><font color="#5c81a7">ibmquestions@nicholaschase.com</font></a>) Backstop Media<br /></p>
										<p>2006 年 10 月 19 日</p>
										<blockquote>面向服务的体系结构（Service-Oriented Architectures，SOA）当前强调的重点在 Web 服务上，但很容易被所传播的各种信息搞得昏头转向。本系列教程将对主要 Web 服务规范进行全面说明，从简单对象访问协议（Simple Object Access Protocol，SOAP）一直介绍到 WS Business Process Execution Language (WS-BPEL)。在第 2 部分中，您将了解有关 Web 服务描述语言的内容，因为 Daily Moon Classified Department 需要使用 WSDL 来描述其 Web 服务，以便其他人能够方便地从任何编程语言或平台创建客户机访问此服务。</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!--#include virtual="/developerworks/cn/inc/s-search-query-capture.inc"-->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>
												<span class="atitle">开始之前 </span>
										</p>
										<p>本教程旨在帮助您了解 Web 服务描述语言 (Web Services Description Language)。本教程适合希望通过使用 WSDL 公开自己的服务供他人使用的开发人员，同时也适合拥有希望访问的服务的 WSDL 而需要创建客户机的开发人员。</p>
										<p>为了学习本教程，您应该具有 SOAP 的基本知识（可以通过阅读本系列教程的第 1 部分了解 SOAP）和 XML 的基本知识。WSDL 与编程语言无关，但本教程最后的示例使用了 Java 和 Apache Axis2 项目。不过，其中的概念也适用于任何编程语言和环境。与此类似，本教程侧重于通常实现的 WSDL 1.1，但即将推出的 WSDL 2.0 的概念也与此相同，本教程将对二者的基本差异进行说明。 </p>
										<p>
												<a name="N10146">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">关于本系列</font>
																</strong>
														</span>
												</a>
										</p>
										<p>本系列教程以假想的报社 <i>Daily Moon</i> 为例，为了提高在竞争激烈的环境中的工作效率，其员工将使用各种 Web 服务来创建工作流系统，我们将在此过程中讲解各个 Web 服务基本概念。 </p>
										<p>第 1 部分比较简单，说明了 Web 服务背后的基本概念，并演示了如何使用 SOAP（后续教程讨论的大部分内容的基础规范）来将 Classifieds Department 连接到内容管理系统。</p>
										<p>在第 2 部分中，Classifieds Department 将开展进一步的工作：使用 Web 服务描述语言 (WSDL) 定义 Web 服务预期产生的消息，从而使团队更方便地创建服务以及连接到服务的客户机。</p>
										<p>在第 3 部分中，团队希望准备一系列服务，并希望能方便地查找这些服务。与此对应，统一描述、发现和集成（Universal Description, Discovery and Integration，UDDI）提供了可用服务的可搜索注册中心，以便使自己的服务为其他人所注意。</p>
										<p>第 4 部分和第 5 部分讨论 WS-Security 和 WS-Policy，将详细说明如何保证该报社的服务的安全，以及团队为了访问这些刚提供了安全保护的服务需要进行哪些更改。</p>
										<p>第 6 部分重点讨论互操作性，因为必须从单个系统访问来自几个不同实现的服务。这一部分还将 WS-I 证书中涉及的要求和测试。</p>
										<p>最后，第 7 部分演示如何使用业务流程执行语言（Business Process Execution Language，WS-BPEL）来从各个服务创建复杂应用程序。</p>
										<p>接下来让我们更为详细地了解一下本教程中将讨论的内容。 </p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/#main">
																												<b>
																														<font color="#5c81a7">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10167">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">关于本教程</font>
																</strong>
														</span>
												</a>
										</p>
										<p>本系列的第 1 部分<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614"><font color="#996699">了解 Web 服务规范：SOAP</font></a> 介绍了虚构的 Daily Moon 报社。具体来说，您了解了 Classifieds Department 所进行的工作。在该教程中，Classifieds Department 构建了一个客户机来在表示内容管理系统的 Web 服务间发送 SOAP 消息。在本教程中，由于对所看到的结果印象深刻，Classifieds Department 决定构建自己的 Web 服务来接收和管理 classifieds 数据库中的广告。不过，为了允许其他人使用此服务，他们将需要创建 Web 服务描述语言 (WSDL) 文件。此文件将向构建客户机提供说明，以便了解服务预期和返回的消息。 </p>
										<p>在本教程中，您将了解以下内容：</p>
										<ul>
												<li>
														<p>WSDL 文件为何重要</p>
												</li>
												<li>
														<p>可以如何处理 WSDL 文件</p>
												</li>
												<li>
														<p>XML 模式（出现在 WSDL 文件中）的基本知识</p>
												</li>
												<li>
														<p>如何设计 WSDL 文件的结构</p>
												</li>
												<li>
														<p>WSDL 1.1 和 WSDL 2.0 的基本差异</p>
												</li>
												<li>
														<p>如何自动从表示服务的 Java 类自动生成 WSDL 文件</p>
												</li>
												<li>
														<p>如何从 WSDL 文件生成表示服务的 Java 类</p>
												</li>
												<li>
														<p>如何从 WSDL 文件生成 Web 服务客户机</p>
												</li>
										</ul>
										<p>Classifieds Department 将构建一个服务来接收新广告、编辑和显示现有广告，还能结束一个主题，使其不再接受任何广告。他们将同时使用请求/响应和单向消息传递。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/#main">
																												<b>
																														<font color="#5c81a7">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N101AD">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">工具和先决条件</font>
																</strong>
														</span>
												</a>
										</p>
										<p>本教程的大部分内容都是概念性的，但为了处理整个教程中的代码，您将需要安装以下软件： </p>
										<p>
												<b>Apache Geronimo 或其他应用服务器</b>——团队将在本教程中创建新 Web 服务，您将需要可在其上运行服务的应用程序。当然，由于 Web 服务应当可互操作，因此使用何种应用服务器并不重要。本教程演示了 Apache Geronimo 的用法，而此应用服务器也是 IBM 的 WebSphere Community Edition 的基础。还可以使用 WebSphere Application Server 等其他应用服务器。您可以从以下网址下载 Apache Geronimo：<a href="http://geronimo.apache.org/downloads.html"><font color="#5c81a7">http://geronimo.apache.org/downloads.html</font></a>。有关安装 Geronimo 的更多信息，请参见本系列的第一篇教程“<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614"><font color="#996699">了解 Web 服务规范，第 1 部分：SOAP</font></a>”。</p>
										<p>
												<b>Apache Axis2 的 0 .95 或更高版本</b>——可以手动创建 SOAP 消息，也可以手动对其进行解释，但手边如果有一个可用实现就会方便得多。本教程将演示 Apache Axis2 的用法，其中包含了各种 SOAP 相关的 API，可极大地简化您的工作。可以从以下网址下载 Apache Axis2：<a href="http://ws.apache.org/axis2/download.cgi"><font color="#996699">http://ws.apache.org/axis2/download.cgi</font></a>。本教程使用的是 0.95 版，但应该也能使用更高版本。（请注意，在本系列教程的第 1 部分使用的是 0.94 版，但并未使用该版本对本部分的代码进行测试。） </p>
										<p>
												<b>Java 2 Standard Edition 的 1.4 或更高版本</b>——所有这些工具都是基于 Java 的，本教程中将要构建的服务和客户机也是如此。可以从以下网址下载 J2SE SDK：<a href="http://java.sun.com/j2se/1.5.0/download.jsp"><font color="#5c81a7">http://java.sun.com/j2se/1.5.0/download.jsp</font></a>。</p>
										<p>另外，还需要 Web 浏览器和文本编辑器，但我想您已经有了这两个工具。如果愿意，还可以使用 Eclipse 之类的 IDE，但由于我们的重点是技术而不是工具，因此我将使用文本编辑器和命令行来编辑和编译文件。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/#main">
																												<b>
																														<font color="#5c81a7">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<span class="atitle">概述</span>
		</p>
		<p>在深入了解细节前，让我们了解一下其总体概貌。</p>
		<p>
				<a name="N101E7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Web 服务回顾</font>
								</strong>
						</span>
				</a>
		</p>
		<p>相对于传统编程方法而言，使用 Web 服务的主要优势是互操作性。您可以创建一个分布式系统，让分散在各个位置的计算机能够进行通信，但在大多数情况下，您需要使用限制灵活性的专用中间件。也就是说，发送方和接收方都需要使用相同的软件。</p>
		<p>Web 服务提供了基于文本（实际上是基于 XML）的方法来往返传递消息，这意味着应用程序不仅不依赖计算机，而且也不依赖于操作系统和编程语言。只要双方遵循相同的 Web 服务标准，就不受各方运行何种软件的影响。</p>
		<p>有多个用于传输此信息的标准，但本系列教程重点讨论的是 SOAP，因为此标准非常灵活，而且能与更高级的标准结合使用。 </p>
		<p>
				<a name="N101F6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">SOAP 知识巩固</font>
								</strong>
						</span>
				</a>
		</p>
		<p>SOAP 消息包括三个主要部分：Header、主体和有效负载（包含在主体中）。请看以下示例：</p>
		<br />
		<a name="N10203">
				<b>清单 1. 示例 SOAP 消息</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
    &gt;SOAPenv:Envelope 
       xmlns:SOAPenv="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;
 &gt;SOAPenv:Body&lt;
  &gt;req:getNumberOfArticles xmlns:req="http://daily-moon.com/CMS/"&lt;
     &gt;req:category&lt;classifieds&gt;/req:category&lt;
  &gt;/req:getNumberOfArticles&lt;
 &gt;/SOAPenv:Body&lt;
&gt;/SOAPenv:Envelope&lt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>整个消息称为信封，其内容由 Header 和主体组成。Header 包括有关消息本身的信息（如路由信息），或要由位于发送方和最终接收方之间可能对消息进行处理的“SOAP 中间层”或服务处理的信息。消息的主体中包含“有效负载”，其中包含传递给 Web 服务的实际数据。</p>
		<p>在本例中，有效负载为 <code>getNumberOfArticles</code> 元素及其内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10213">
						<span class="smalltitle">
								<strong>
										<font face="Arial">WSDL 的用途</font>
								</strong>
						</span>
				</a>
		</p>
		<p>创建服务时，通常的原因都是因为希望其他人使用此服务。为了使用服务，需要知道向服务发送什么信息、服务将发送回什么信息以及在何处能找到此服务。当然，可以将这些放入字处理文档中，但相比之下，如果此信息采用标准的、最好为人机均可读的格式，则要有用得多。</p>
		<p>WSDL 就提供了这样的标准格式。除了不会造成混淆不清外，其主要优势是，由于 WSDL 是事实标准，且采用 XML 格式，因而可由计算机进行处理，便于自动创建客户机（甚至自动创建服务的框架）。Classifieds Department 将要创建接受和管理 classified 广告的服务，以允许其他人（如作业聚合网站）能更方便地使用此服务，他们同样也将使用 WSDL 文件对其进行描述。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1021F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">本教程的任务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在本教程中，您将逐步了解 Daily Moon Classifieds Department 的员工如何创建服务并将其公开给其他人使用，从而了解有关 WSDL 的知识。 </p>
		<p>首先，Christine 将设计 XML 模式，其中定义可以在 SOAP 消息中出现的数据。接下来，Larry 形成实际 WSDL 文件的结构，以确定将往返传递何种信息。然后，Gene 拿到 WSDL 文件，以其为基础设计表示服务的 Java 类，随后，为了进一步确认，他使用 Axis2 从该 Java 类生成 WSDL 文件，以了解二者的差异。然后，Francis 得到此 WSDL 文件，使用其生成基本 Web 服务和访问该服务的客户机。</p>
		<p>现在让我们开始吧。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<span class="atitle">XML 模式简要介绍</span>
		</p>
		<p>Daily Moon 是一家相当小的报社，因此 Classifieds Department 无法承担专用 DBA 带来的相关支出。所以，Christine 总是将数据库视为“自己的孩子”。了解了 WSDL 的规范后，她决定承担起定义 SOAP 消息中可包含的数据的任务。</p>
		<p>
				<a name="N1023A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">验证和选项</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在首次尝试 Web 服务之后，员工已经熟悉了 XML，因此 Christine 下一步就要了解有关验证的知识。</p>
		<p>XML 验证是确保 XML 的结构和内容符合任何预先定义的要求的过程。最初的时候，这表示要符合文档类型定义（Document Type Definition，DTD）；DTD 是从 XML 的前身 SGML 语言保留下来的结构。DTD 并不是很难，但存在一些主要的缺点，缺乏灵活性、缺乏 XML 命名空间支持以及其他问题，因此 XML 社区转而采用其他类型的 XML 模式。</p>
		<p>请注意，此处所说的“模式”不是特指的。在这里，我使用的是该术语的一般用法，即文档的具体结构，而不是记录此结构的任何语言。这些 XML 模式的最常见支持是 W3C XML Schema 语言，经常将此语言简称为 XML Schema。（注意首字母大写。）</p>
		<p>Christine 知道将使用 XML Schema 构建其 WSDL 1.1 文档，但注意到 WSDL 2.0 还特别支持其他模式，如 RELAX NG 和 Schematron，可以在此处使用这些模式。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1024C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">实例文档</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Christine 首先从一个与进出系统的预期数据近似的示例文档着手。她以数个现有广告为基础创建了以下 XML：</p>
		<br />
		<a name="N10259">
				<b>清单 2. 实例文档</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
Listing 2: the instance document
&lt;?xml version="1.0"?&gt;
&lt;ClassifiedList&gt;

   &lt;ClassifiedAd adId="1138"&gt;
      &lt;content&gt;Vintage 1963 T-Bird.  Less than 300 miles.  
Driven by my daughter until I took it away.  Serious inquires
only. 555-3264 after 7 PM.&lt;/content&gt;
      &lt;endDate&gt;4/15/2007&lt;/endDate&gt;
      &lt;startDate&gt;4/1/2007&lt;/startDate&gt;
   &lt;/ClassifiedAd&gt;

   &lt;ClassifiedAd adId="2187"&gt;
      &lt;content&gt;30 ft ladder, only used once.  Willing to let
go for half its worth. Has slight dent near the middle.  
Harder than a human head. $150 OBO.&lt;/content&gt;
      &lt;endDate&gt;4/30/2007&lt;/endDate&gt;
      &lt;startDate&gt;4/10/2007&lt;/startDate&gt;
   &lt;/ClassifiedAd&gt;

&lt;/ClassifiedList&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>此文档称为“实例文档”，代表 XML 模式所定义的数据。在本例中，它包括两个作为 <code>ClassifiedList</code> 元素子项的 <code>ClassifiedAd</code> 元素。每个 <code>ClassifiedAd</code> 都包含一个 <code>adId</code> 属性（此属性与数据库内的主键对应）、广告内容以及广告的开始和结束日期。</p>
		<p>她将此文档命名为 <code>classifieds.xml</code>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10279">
						<span class="smalltitle">
								<strong>
										<font face="Arial">基本模式</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Christie 下一步将创建基本模式文档，以便对系统进行测试。实际模式本身也是一个 XML 文档，因此她创建了基础文件 classifieds.xsd 和一个 schema 元素，如清单 3 中所示：</p>
		<br />
		<a name="N10286">
				<b>清单 3. Schema 元素</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

&lt;/xsd:schema&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>此元素将作为 Christine 创建的所有定义的父项。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1028F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">验证文档</font>
								</strong>
						</span>
				</a>
		</p>
		<p>测试系统的下一步是形成一个简单的 Java 应用程序，以根据模式验证实例文档。该类所需要进行的工作就是指定验证并对文档进行解析，如清单 4 中所示。</p>
		<br />
		<a name="N1029C">
				<b>清单 4. ValidateWithSchema 类</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
 
public class ValidateWithSchema {
 
    public static void main(String args[]) {

        DocumentBuilderFactory dbf = 
                        DocumentBuilderFactory.newInstance();
        dbf.setValidating(true);

        dbf.setAttribute(
          "http://java.sun.com/xml/jaxp/properties/schemaLanguage", 
          "http://www.w3.org/2001/XMLSchema");
        dbf.setAttribute(
          "http://java.sun.com/xml/jaxp/properties/schemaSource",
          "classifieds.xsd");

        Document doc = null;
        try{        
           DocumentBuilder parser = dbf.newDocumentBuilder();
           doc = parser.parse("classifieds.xml");
        } catch (Exception e){
           e.printStackTrace();
        }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>实际进行解析的方法并不十分重要；在本例中，Christine 将使用 DOM 解析器构建应用程序。首先，构建一个工厂，然后指定其创建的所有解析器都应为“验证解析器”。（并不会使用所有解析器进行验证。有些仅验证文档是否“形式良好”，而不会验证其实际结构。）</p>
		<p>接下来，指定要使用的模式语言以及模式文档本身。在本例中，Christine 使用的是本地文件，但也可以使用任何可作为 URL 引用的文件。</p>
		<p>Christine 保存文件，并对其进行编译，运行该文件后，她得到了以下输出，如清单 5 中所示。</p>
		<br />
		<a name="N102B3">
				<b>清单 5. 运行空白模式</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
Warning: validation was turned on but an org.xml.sax.ErrorHandler 
was not set, which is probably not what is desired.  Parser will 
use a default ErrorHandler to print the first 10 errors.  Please call
the 'setErrorHandler' method to fix this.

Error: URI=file:///E:/WSDLFiles/classifieds.xml Line=2: cvc-elt.1: 
Cannot find the declaration of element 'ClassifiedList'.
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>Warning</code> 并不重要；Christine 仅希望知道文件是否有效，因此她并不需要任何特定的错误处理功能。<code>Error</code> 很重要，因为这意味着分析器在实际查看模式和验证实例文档。</p>
		<p>接下来她需要添加实际的定义。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102C7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建简单的元素</font>
								</strong>
						</span>
				</a>
		</p>
		<p>定义最初的数个元素非常简单。<code>content</code>, <code>endDate</code> 和 <code>startDate</code> 元素包含简单的字符串，如清单 6 中所示。</p>
		<br />
		<a name="N102E0">
				<b>清单 6. 添加简单的元素</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

   &lt;xsd:element type="xsd:string" name="content" /&gt;
   &lt;xsd:element type="xsd:string" name="endDate" /&gt;
   &lt;xsd:element type="xsd:string" name="startDate" /&gt;

&lt;/xsd:schema&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，Christine 定义了三个仅包含文本的元素（与其他元素相对）作为内容。同样，它们都不具有任何属性。XML Schema 推荐标准定义了一系列可用于定义内容的不同类型。例如，可以指定 <code>endDate</code> 和 <code>startDate</code> 值必须为 <code>datetime</code> 类型的值。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102F8">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建更为复杂的元素</font>
								</strong>
						</span>
				</a>
		</p>
		<p>当然，如果所有元素都这样简单，您可能根本不需要模式了。Christine 将继续定义 <code>ClassifiedList</code> 元素（请参见清单 7）。</p>
		<br />
		<a name="N10309">
				<b>清单 7. 定义 ClassifiedList 元素</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

&lt;xsd:element name="ClassifiedList"&gt;
   &lt;xsd:complexType&gt;

      &lt;xsd:sequence&gt;
         &lt;xsd:element name="ClassifiedAd" maxOccurs="unbounded"
                                       type="ClassifiedAdType"/&gt;
      &lt;/xsd:sequence&gt;

   &lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;

&lt;xsd:complexType name="ClassifiedAdType"&gt;
   &lt;xsd:sequence&gt;
       &lt;xsd:element type="xsd:string" name="content" /&gt;
       &lt;xsd:element type="xsd:string" name="endDate" /&gt;
       &lt;xsd:element type="xsd:string" name="startDate" /&gt;
   <span class="boldcode"><strong>&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;</strong></span>

&lt;/xsd:schema&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先看最下面，Christine 创建了 <code>ClassifiedAdType complexType</code>。这种元素类型按顺序包含以下内容：一个 content 元素、一个 <code>endDate</code> 元素和一个 <code>startDate</code> 元素。回到最上面，她定义 <code>ClassifiedList</code> 元素包含一个元素，而此元素还包含一系列元素。不过，在本例中，它包含零个或更多 <code>ClassifiedAdType</code> 类型的元素，所有这些元素均命名为 <code>ClassifiedAd</code>。</p>
		<p>到目前为止，仅通过这两个定义，她就已覆盖了文档结构的大部分。现在需要做的就是为 <code>adId</code> 属性添加定义。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1033B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">添加属性</font>
								</strong>
						</span>
				</a>
		</p>
		<p>属性在 <code>complexType</code> 元素中定义，如清单 8 中所示。</p>
		<br />
		<a name="N1034C">
				<b>清单 8. 添加属性，不过她还可以创建限制性更多的类型。</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

&lt;xsd:element name="ClassifiedList"&gt;
   &lt;xsd:complexType&gt;
      &lt;xsd:sequence&gt;
         &lt;xsd:element name="ClassifiedAd" maxOccurs="unbounded"
 type="ClassifiedAdType"/&gt;
      &lt;/xsd:sequence&gt;
   &lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;

&lt;xsd:complexType name="ClassifiedAdType"&gt;
   &lt;xsd:sequence&gt;
       &lt;xsd:element type="xsd:string" name="content" /&gt;
       &lt;xsd:element type="xsd:string" name="endDate" /&gt;
       &lt;xsd:element type="xsd:string" name="startDate" /&gt;
   &lt;/xsd:sequence&gt;
   <span class="boldcode"><strong>&lt;xsd:attribute name="adId" type="xsd:integer" /&gt;</strong></span>
&lt;/xsd:complexType&gt;

&lt;/xsd:schema&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，Christine 将 <code>adId</code> 属性的内容限制为整数。不过，她还可以创建限制更多的类型。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1035C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">使用 simpleTypes</font>
								</strong>
						</span>
				</a>
		</p>
		<p>XML Schema 提供了强大的功能，用以处理您的文档可能包含的实际内容。例如，Christine 可以指定 <code>adId</code> 属性一定只能包含大于或等于 1000 的整数（请参见清单 9）。</p>
		<br />
		<a name="N1036D">
				<b>清单 9. 限制值</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;

...

&lt;xsd:complexType name="ClassifiedAdType"&gt;
   &lt;xsd:sequence&gt;
       &lt;xsd:element type="xsd:string" name="content" /&gt;
       &lt;xsd:element type="xsd:string" name="endDate" /&gt;
       &lt;xsd:element type="xsd:string" name="startDate" /&gt;
   &lt;/xsd:sequence&gt;
   &lt;xsd:attribute name="adId" type="<span class="boldcode"><strong>thousandOrGreater</strong></span>" /&gt;
&lt;/xsd:complexType&gt;

&lt;xsd:simpleType name="thousandOrGreater"&gt;
  &lt;xsd:restriction base="xsd:integer"&gt;
      &lt;xsd:minInclusive value="1000"/&gt;
  &lt;/xsd:restriction&gt;
&lt;/xsd:simpleType&gt;

&lt;/xsd:schema&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个定义并不涉及任何元素，因此 Christine 使用了 <code>simpleType</code> 而不是 <code>complexType</code>。她为定义为整数的基本类型创建了一个 <code>restriction</code>（一种对数据类型的限制）。她为该 restriction 添加了一个“facet”，指定最小值为 1000。XML Schema 定义了大量的此类 facet 以供使用。创建了此类型后，她就可以在属性定义中对其进行引用了。因为已经定义了数据，Christine 随后将此模式交给 Larry，供他用于构建实际的 WSDL。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services2/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 19:04 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 1 部分：SOAP （3）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90781.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90781.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90781.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90781.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">构建 SOAP 服务</span>
		</p>
		<p>如果您觉得构建 Web 服务客户机的过程相当简单，事实的确如此。而就很多方面而言，构建服务的过程也同样简单。</p>
		<p>
				<a name="N10591">
						<span class="smalltitle">
								<strong>
										<font face="Arial">总体过程</font>
								</strong>
						</span>
				</a>
		</p>
		<p>创建 Axis2 Web 服务的整个过程涉及以下步骤： </p>
		<ol>
				<li>创建服务清单 
</li>
				<li>创建类 
</li>
				<li>将其打包为 Axis 存档文件 
</li>
				<li>将 Axis 存档文件上载到 Axis2 Web 应用程序 
</li>
				<li>重新启动服务器（如果有必要） </li>
		</ol>
		<p>这就是全部步骤。让我们首先从服务清单开始。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N105AF">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建清单</font>
								</strong>
						</span>
				</a>
		</p>
		<p>服务清单告知 Axis2 应用程序（就更大的范围而言，应用服务器）哪个请求与哪个类对应。例如，可以如清单 22 中所示的那样指定两个服务函数。</p>
		<br />
		<a name="N105BC">
				<b>清单 22. 在清单中指定两个服务函数</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;service name="CMSService"&gt;
    &lt;description&gt;
        This is a sample Web Service for the newspaper's
 Content Managment System.
    &lt;/description&gt;

    &lt;parameter name="ServiceClass" locked="false"
&gt;CMSService&lt;/parameter&gt;

    &lt;operation name="getNumberOfArticles"&gt;
        &lt;messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/&gt;
    &lt;/operation&gt;
    &lt;operation name="addArticle"&gt;
        &lt;messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/&gt;
    &lt;/operation&gt;
&lt;/service&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先，定义服务，提供其名称和描述，并指定实际为请求服务的类。接下来，定义实际的操作。请注意，此示例指定了两种不同类型的 <code>messageReceiver</code>。第一个 <code>RawXMLINOutMessageReceiver</code> 用于传统的请求/响应服务。第二个 <code>RawXMLINOnlyMessageReceiver</code> 用于单向消息。操作的名称与有效负载的根元素以及要执行的方法对应。</p>
		<p>将此文件保存为 services.xml。</p>
		<p>接下来，让我们创建实际的应用程序。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N105D7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建应用程序</font>
								</strong>
						</span>
				</a>
		</p>
		<p>让我们首先创建模拟前面看到的 <code>echo</code> 函数的类（将直接返回原始有效负载的副本），如清单 23 中所示。</p>
		<br />
		<a name="N105E8">
				<b>清单 23. CMSService 类</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
import org.apache.axis2.om.OMElement;
import javax.xml.stream.XMLStreamException;

public class CMSService {

    public OMElement getNumberOfArticles(OMElement element)
                              throws XMLStreamException {

        element.build();
        element.detach();

        return element;
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>要编译此应用程序，请确保 &lt;axis2_home&gt;/lib 中的所有 *.jar 文件都在您的 CLASSPATH 上。</p>
		<p>此应用程序相当简单，仅包含一个与 <code>getNumbereOfArticles</code> 操作对应的类。此函数和任何要作为操作的函数一样，接收单个 <code>OMElement</code> 参数（表示有效负载）。此处，您将首先使用 <code>build()</code> 方法来确定已接收到所有数据——AXIOM 使用一个 pull 方法访问数据——然后将元素从其当前树中分离，以便能够将其返回。</p>
		<p>如果喜欢冒险，可以自由地<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#deploytheservice"><font color="#5c81a7">部署服务</font></a>和<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#accesstheservice"><font color="#5c81a7">访问服务</font></a>，以访问服务并查看结果。应该看到与清单 24 中所示类似的结果输出。 </p>
		<br />
		<a name="N1060F">
				<b>清单 24. CMSService 类响应</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;cms:getNumberOfArticles&gt;&lt;cms:category&gt;classifieds&lt;/cms:category&gt;&lt;/cms:
getNumberOfArticles&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接下来让我们了解如何实际处理数据。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10618">
						<span class="smalltitle">
								<strong>
										<font face="Arial">提取有效负载</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了从有效负载提取信息，将使用与 DOM 非常类似的技术来对接收到的有效负载元素进行操作（请参见清单 25）。</p>
		<br />
		<a name="N10625">
				<b>清单 25. 提取有效负载信息</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
import javax.xml.stream.XMLStreamException;

public class CMSService {
    public OMElement getNumberOfArticles(OMElement element) 
                          throws XMLStreamException {
        element.build();
        element.detach();

        String rootName = element.getLocalName();
        OMElement categoryElement = element.getFirstElement();
        String categoryElementName = categoryElement.getLocalName();
        String categoryValue = childElement.getText();

        return element;
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请记住，有效负载的根是 <code>getNumberOfArticles</code> 函数接收的元素。在此情况下，将提取元素的名称，然后移动到第一个元素子项（与第一个子项不同，后者可能是空格文本节点）并提取其名称和值。请注意，使用的是 <code>getText()</code> 方法来提取实际上是 category 元素的文本节点子项的值。这无疑非常简捷！</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10639">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建并返回响应</font>
								</strong>
						</span>
				</a>
		</p>
		<p>最后，将需要使用从请求的有效负载提取数据来创建响应。在本例中，将从第二个函数（在实际应用程序中，该函数将进行一些其他的工作）提供响应（请参见清单 26）。</p>
		<br />
		<a name="N10646">
				<b>清单 26. 创建响应</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
import javax.xml.stream.XMLStreamException;

public class CMSService {
    public OMElement getNumberOfArticles(OMElement element) 
                         throws XMLStreamException {
        element.build();
        element.detach();

        String rootName = element.getLocalName();
        OMElement childElement = element.getFirstElement();
        String childName = childElement.getLocalName();
        String categoryValue = childElement.getText();

        SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
        OMNamespace namespace = factory.createOMNamespace(
                            "http://daily-moon.com/cms/", "resp");
        OMElement resultElem = factory.createOMElement(
                                   "numberOfArticles",namespace);

        String actualValue = 
                         (articleCount(categoryValue)).toString();
        resultElem.setText(actualValue);

        return resultElem;
    }

    private Integer articleCount(String catId){

       //Perform some function such as searching the CMS 
       //database, and return the actual value.  For our 
       //purposes, you'll hardcode it.
       return new Integer(42);

    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先，创建将用于创建所有其他对象的工厂，然后创建将添加到响应的有效负载的命名空间。接下来，创建实际结果元素，在本例中为名为 <code>numberOfArticles</code> 的元素。</p>
		<p>
				<code>numberOfArticles</code> 元素的内容将为 <code>articleCount()</code> 函数返回的一个数字,在本例中，该函数可以为任何内容。在实际的应用程序中，将进行所需进行的任何工作来获取此数据。获取了此数据后，会将其设置为 <code>numberOfArticles</code> 元素的内容，并直接返回该元素。</p>
		<p>现在剩下的就是部署服务了。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="deploytheservice">
						<span class="smalltitle">
								<strong>
										<font face="Arial">部署服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了部署服务，需要创建一个 Axis 存档文件。此文件和 *.jar 或 *.war 文件类似，实际是使用特殊文件扩展名（在本例中使用的是 .aar）的 zip 文件。请按照以下步骤创建此文件：</p>
		<ol>
				<li>将 &lt;AXIS2_HOME&gt;/lib 目录中的所有文件添加到 CLASSPATH 并编译 CMSService.java 文件。 
</li>
				<li>在与 CMSService.class 文件相同的目录中创建名为 META-INF 的新目录。 
</li>
				<li>从包含 CMSService.class 文件的目录中发出以下命令：&lt;code type="section" width="100"&gt; jar cvf CMSService.aar ./* &lt;/code&gt; 应该看到与以下类似的结果：&lt;code type="section" width="100"&gt; added manifest adding:CMSService.class(in = 513) (out= 330)(deflated 35%) adding:CMSService.java(in = 328) (out= 182)(deflated 44%) ignoring entry META-INF/ adding:META-INF/services.xml(in = 391) (out= 229)(deflated 41%) &lt;/code&gt; 
</li>
				<li>使用<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section3.html#installingasampleservice"><font color="#5c81a7">安装示例服务</font></a>中列出的步骤将此服务添加到服务器上。（如果看到 Web 接口上有 Servlet 错误，请确保登录到了 Axis2 应用程序。如果会话已过期，应用程序将不一定会通知您，而可能会直接显示错误。） 
</li>
				<li>如果有必要，请重新启动 Geronimo。（将可能不必在添加服务后进行此操作，但在进行更改后可能必须这样做。） </li>
		</ol>
		<p>如果单击 View services 链接，应该看到与图 4 中所示类似的内容。</p>
		<br />
		<a name="N1068C">
				<b>图 4. 可用服务</b>
		</a>
		<br />
		<img height="375" alt="可用服务" src="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/fig04.jpg" width="500" />  <br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main"><b><font color="#5c81a7">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="accesstheservice"><span class="smalltitle"><strong><font face="Arial">访问服务</font></strong></span></a></p><p>现在已经完成了服务构建，接下来要通过客户机对其进行访问。对前面创建的 ClassifiedClient.java 文件进行以下更改（请参见清单 27）。</p><br /><a name="N106A5"><b>清单 27. 修改 ClassifiedClient</b></a><br /><table cellspacing="0" cellpadding="0" width="100" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">                    
...
public class ClassifiedClient {
    private static EndpointReference targetEPR = 
         new EndpointReference(
           "http://localhost:8080/axis2/services/<span class="boldcode"><strong>CMSService");</strong></span>

    public static OMElement getEchoOMElement() {
        SOAPFactory fac = OMAbstractFactory.getSOAP12Factory();
        OMNamespace omNs = fac.createOMNamespace(
                "http://daily-moon.com/cms", "cms");
        OMElement method = fac.createOMElement(<span class="boldcode"><strong>"getNumberOfArticles"</strong></span>, omNs);
        OMElement value = fac.createOMElement("category", omNs);
        value.addChild(fac.createText(value, "classifieds"));
        method.addChild(value);

        return method;
    }

    public static void main(String[] args) {
        try {
            OMElement payload = ClassifiedClient.getEchoOMElement();
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
            OMElement result = sender.sendReceive(payload);

            String response = result.getText();
            <span class="boldcode"><strong>System.out.println("There are "+response+" classifieds at the moment.");</strong></span>

        } catch (Exception e) { //(XMLStreamException e) {
System.out.println(e.toString());
        }
    }
}
</pre></td></tr></tbody></table><br /><p>编译并运行了此应用程序后，应看到清单 28 中所示的响应。</p><br /><a name="N106BB"><b>清单 28. ClassifiedClient 响应</b></a><br /><table cellspacing="0" cellpadding="0" width="100" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">                    
There are 42 classifieds at the moment.
</pre></td></tr></tbody></table><br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section6.html#main"><b><font color="#5c81a7">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><p><span class="atitle">单向服务</span></p><p>继续讨论之前，让我们了解一下处理单向服务（而非请求/响应服务）时涉及到的不同之处。</p><p><a name="N106CD"><span class="smalltitle"><strong><font face="Arial">服务</font></strong></span></a></p><p>创建单向服务非常简单。此过程与创建请求/响应服务完全类似，至少不会实际返回任何内容。例如，可以为 <code>CMSService</code> 类创建 <code>addArticle</code> 操作，如图 29 中所示。</p><br /><a name="N106E2"><b>清单 29. CMSServiceclass 中的 addArticle 操作</b></a><br /><table cellspacing="0" cellpadding="0" width="100" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">...
    private Integer articleCount(String catId){
...
    }

    public void addArticle(OMElement element) 
                             throws XMLStreamException{
       element.build();
       System.out.println(element);
    }
}
</pre></td></tr></tbody></table><br /><p>在 services.xml 文件中，将 <code>addArticle</code> 操作指定为“in only”操作，因此不会等待返回任何内容，但即使这样，也能看到会实际发生一些事项，会在命令行输出接收到的有效负载。您将在 Geronimo 窗口中看到此信息。</p><p>在实际应用程序中，此方法将从有效负载提取信息，并会实际添加到某种类型的数据库或其他存储库。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section7.html#main"><b><font color="#5c81a7">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N106F5"><span class="smalltitle"><strong><font face="Arial">客户机</font></strong></span></a></p><p>此服务的客户机也与请求/响应服务所使用的服务类似（请参见清单 30）。</p><br /><a name="N10702"><b>清单 30. 创建客户机</b></a><br /><table cellspacing="0" cellpadding="0" width="100" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">                    
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.om.OMElement;
import org.apache.axis2.SOAP.SOAPFactory;
import org.apache.axis2.om.OMAbstractFactory;
import org.apache.axis2.om.OMNamespace;

public class AddArticleClient {
    private static EndpointReference targetEPR = 
         new EndpointReference(
             "http://localhost:8080/axis2/services/CMSService");

    private static OMElement getOMElement(){

        SOAPFactory fac = OMAbstractFactory.getSOAP12Factory();
        OMNamespace omNs = fac.createOMNamespace(
                "http://daily-moon.com", "cms");
        OMElement method = fac.createOMElement("addArticle", omNs);

        OMElement category = fac.createOMElement("category", omNs);
        category.setText("classifieds");

        OMElement subcategory = 
                        fac.createOMElement("subcategory", omNs);
        category.setText("wantads");

        OMElement adtext = fac.createOMElement("article", omNs);
        adtext.setText("Do you  have good head for numbers"+
              " and a great deal of patience?  Do you like"+
              " to sit for hours sorting objects by their"+
              " size?  If so, then you could be the"+
              " next goober counter in the world famous"+
              " Murphy Brothers peanut factory. "+
              " Willingness to dress up as our mascot"+
              " helpful, but not required.");

        method.addChild(category);
        method.addChild(subcategory);
        method.addChild(adtext); 

        return method;

    }

    public static void main(String[] args) {
        try {
            OMElement payload = AddArticleClient.getOMElement();
            ServiceClient serviceClient = new ServiceClient();

            Options options = new Options();
            serviceClient.setOptions(options);
            options.setTo(targetEPR);

            serviceClient.<span class="boldcode"><strong>fireAndForget</strong></span>(payload);

        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
        }
    }

}
</pre></td></tr></tbody></table><br /><p>尽管有效负载不同，但正如您在 <code>getOMElement()</code> 方法中看到的，编程方面目前的唯一真正的更改是使用 <code>fireAndForget()</code> 方法替代 <code>sendReceive()</code> 方法。此方法并不会返回响应。</p><p>如果运行此客户机，应该在 Geronimo 窗口中看到与图 5 中所示类似的输出。</p><br /><a name="N1071F"><b>图 5. 命令行输出</b></a><br /><img height="248" alt="命令行输出" src="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/fig05.jpg" width="500" /><br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section7.html#main"><b><font color="#5c81a7">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 18:39 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 1 部分：SOAP （2）</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90780.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90780.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90780.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90780.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">理解 SOAP</span>
		</p>
		<p>现在已经安装了软件，接下来可以开始着手处理实际的 Web 服务了。正如我在<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#otherwebservices"><font color="#5c81a7">其他类型的 Web 服务</font></a>中提到的，您可以选择多种格式。在本系列中，将使用 SOAP。</p>
		<p>
				<a name="N10353">
						<span class="smalltitle">
								<strong>
										<font face="Arial">XML 简介</font>
								</strong>
						</span>
				</a>
		</p>
		<p>进行传递的所有这些消息都基于可扩展标记语言（Extensible Markup Language，XML）。如果完全不熟悉 XML，在深入了解各个 Web 服务主题前，真的应该进行一些相关研究。不过，以下提供了继续学习本教程所需的基本知识。</p>
		<p>XML 是一种“标记语言”，即给出了一种提供实际内容的附加信息的方式。此信息以“标记”的形式提供，这些标记用于指示“元素”。例如，考虑一下清单 5 中所示的简单 XML 文档。</p>
		<br />
		<a name="N10363">
				<b>清单 5. 包含基本内容的 XML 文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;article articleId="88271" categoryId="classifieds" subcategoryId="forsale"&gt;
  &lt;articleHeadline&gt;Fun, fun, fun&lt;/articleHeadline&gt;
  &lt;articleText&gt;Vintage 1963 T-Bird.  Less than 300 miles.
Driven by my daughter until I took it away.  Serious 
inquires only.  555-3264 after 7 PM.&lt;/articleText&gt;
&lt;/article&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请留意此文本中的几个值得注意的地方。首先，这是文本。这就使其可以供任何人阅读，或在其中包含关于任何事物的内容。其次，标记使用 &gt; 和 &lt; 指示，开始标记具有一个名称，并可能带有各种属性（如文章 ID），而结束标记以反斜杠 (/) 表示。元素必须为自包含的，并进行了恰当嵌套。也就是说，不能使用与清单 6 所示类似的 XML 文档。 </p>
		<br />
		<a name="N10370">
				<b>清单 6. 无效 XML 文档示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;article articleId="88271" categoryId="classifieds" subcategoryId="forsale"&gt;
  &lt;articleHeadline&gt;Fun, fun, fun
  &lt;articleText&gt;<span class="boldcode"><strong>&lt;/articleHeadline&gt;</strong></span>Vintage 1963 T-Bird.  
Less than 300 miles. Driven by my daughter until I 
took it away.  Serious inquires only.  555-3264 after 
7 PM.&lt;/articleText&gt;
&lt;/article&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>XML 还提供了将内容划分为不同“命名空间”的方法，以便由应用程序对其进行不同的处理。例如，SOAP 消息可能与以下的清单 7 类似。</p>
		<br />
		<a name="N10380">
				<b>清单 7. 示例 SOAP 消息</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
 &lt;/env:Header&gt;
 &lt;env:Body&gt;
  &lt;cms:getNumberOfArticles xmlns:cms="http://www.daily-moon.com/cms"&gt;
    &lt;cms:category&gt;classifieds&lt;/cms:category&gt;
    &lt;cms:subcategory&gt;forsale&lt;/cms:subcategory&gt;
  &lt;/cms:getNumberOfArticles&gt;
 &lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>不要担心消息的实际结构，但要注意存在两种不同的“前缀”，每个前缀与特定的命名空间对应。在这种情况下，我们是为了将 SOAP“信封”与实际的有效负载进行区分。</p>
		<p>再次说明，关于 XML 有很多需要学习，但这些只是本教程需要了解的基础知识。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1038C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">SOAP 信封</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Web 服务消息的基本单元是实际的 SOAP 信封。这是包含处理消息所必需的所有信息的 XML 文档（请参见清单 8）。</p>
		<br />
		<a name="N10399">
				<b>清单 8. 示例 SOAP 信封</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
&lt;/env:Header&gt;
&lt;env:Body&gt;
&lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，获得了一个简单的 <code>Envelope</code>，其命名空间指定为 SOAP 1.2 版本。其中包含两个子元素 <code>Header</code> 和 <code>Body</code>。让我们了解一下这两个子元素所起的作用。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N103AE">
						<span class="smalltitle">
								<strong>
										<font face="Arial">SOAP Header</font>
								</strong>
						</span>
				</a>
		</p>
		<p>SOAP 消息中的 <code>Header</code> 用于提供有关消息本身的信息，与用于应用程序的信息相对。例如，<code>Header</code> 可以包括路由信息，像清单 9 中的示例类似。</p>
		<br />
		<a name="N103C3">
				<b>清单 9. Header 中的路由信息 </b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
  &lt;wsa:ReplyTo xmlns:wsa=
        "http://schemas.xmlSOAP.org/ws/2004/08/addressing"&gt;
   &lt;wsa:Address&gt;
http://schemas.xmlSOAP.org/ws/2004/08/addressing/role/anonymous
   &lt;/wsa:Address&gt;
  &lt;/wsa:ReplyTo&gt;
  &lt;wsa:From&gt;
   &lt;wsa:Address&gt;
http://localhost:8080/axis2/services/MyService&lt;/wsa:Address&gt;
  &lt;/wsa:From&gt;
  &lt;wsa:MessageID&gt;ECE5B3F187F29D28BC11433905662036&lt;/wsa:MessageID&gt; 
  &lt;/env:Header&gt;
&lt;env:Body&gt;
&lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>本例中有一个 WS-Addressing 元素，其中包含有关消息将送达何处以及应将应答送达何处的信息。<code>Header</code> 可包含关于消息本身的所有类型的消息。事实上，SOAP 规范中使用了大量篇幅说明哪些元素可以放入 <code>Header</code>以及应由“SOAP 中间层”如何对其进行处理。也就是说，SOAP 规范并不假定消息将直接从一个点传递到另一个点（从客户机到服务器）。规范考虑了 SOAP 消息在送达最终目的地的过程中可能实际由多个中间层处理的情况，很清楚地说明了中间层应如何对待在 <code>Header</code> 中找到的信息。不过，对此的讨论不在本教程的范围之内。因此，目前只要知道 <code>Header</code> 可以提供许许多多的功能（如果您需要）即可。</p>
		<p>接下来让我们看看实际的有效负载。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N103E6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">SOAP 体</font>
								</strong>
						</span>
				</a>
		</p>
		<p>发送 SOAP 消息时，都是有目的性的。您在尝试告诉接收者执行某种操作，或尝试向服务器传递相关信息。此信息称为“有效负载”。有效负载位于 <code>Envelope</code> 的 <code>Body</code> 中。它还具有自己的命名空间，在本例中其命名空间与内容管理系统对应。在此情况下，可以完全随意地选择命名空间。只需要与 SOAP 命名空间相异即可（请参见清单 10）。</p>
		<br />
		<a name="N103FB">
				<b>清单 10. 有效负载示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
...
&lt;/env:Header&gt;
 &lt;env:Body&gt;
  &lt;cms:addArticle xmlns:cms="http://www.daily-moon.com/cms"&gt;
    &lt;cms:category&gt;classifieds&lt;/category&gt;
    &lt;cms:subcategory&gt;forsale&lt;/cms:subcategory&gt;
    &lt;cms:articleHeadline&gt;&lt;/cms:articleHeadline&gt;
    &lt;cms:articleText&gt;Vintage 1963 T-Bird.  Less than 300 miles.  
Driven by my daughter until I took it away.  Serious inquires only.  
555-3264 after 7 PM.&lt;/cms:articleText&gt;
  &lt;/cms:addArticle&gt;
 &lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在此例中，有效负载很简单，其中包含将文章添加到 <i>Daily Moon</i> 的内容管理系统的指令。</p>
		<p>如何设计有效负载的选择过程将涉及到样式和编码的内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1040D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">样式和编码</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本系列教程的第 2 部分将更深入地了解此主题的内容（该部分讨论 Web 服务描述语言——WSDL），但在创建应用程序时，您将需要确定要发送和接收的实际有效负载的结构。为此，让我们花点时间讨论一下编程样式和编码。</p>
		<p>简单来说，有两种不同的主流 SOA 消息编程样式。第一种是 RPC 样式，基于使用 SOAP 消息创建远程过程调用（Remote Procedure Call）的概念。在此样式中，基本思路是在向服务器发送命令（如“添加文章”），并将该命令的参数（如要添加的文章和应该添加到的类别）作为整个方法的子元素包含在其中，如清单 11 中所示。</p>
		<br />
		<a name="N1041D">
				<b>清单 11. RPC 样式</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt;
 &lt;env:Header&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>RPC 样式的替代方法将数据直接作为 SOAP 体的内容处理，并在应用服务器对消息进行路由的信息中包含有关其所属的过程或函数的信息。（请参见清单 12）。</p>
		<br />
		<a name="N1042A">
				<b>清单 12. 将数据作为 SOAP 体中的内容</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
 &lt;/env:Header&gt;
 &lt;env:Body&gt;
  &lt;cms:addArticle xmlns:cms="http://www.daily-moon.com/cms"&gt;
    &lt;cms:category&gt;classifieds&lt;/category&gt;
    &lt;cms:subcategory&gt;forsale&lt;/cms:subcategory&gt;
    &lt;cms:articleHeadline&gt;&lt;/cms:articleHeadline&gt;
    &lt;cms:articleText&gt;Vintage 1963 T-Bird.  Less than 300 
miles.  Driven by my daughter until I took it away.  
Serious inquires only.  555-3264 after 7 PM.&lt;/cms:articleText&gt;
  &lt;/cms:addArticle&gt;
 &lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>RPC 样式的一个变体就是与上面看到的 RPC/literal 相对的 RPC/encoded。在这种情况下，消息中包含类型信息，如清单 13 中所示。</p>
		<br />
		<a name="N1043A">
				<b>清单 13. RPC/encoded 示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
 &lt;/env:Header&gt;
 &lt;env:Body&gt;
  &lt;cms:addArticle xmlns:cms="http://www.daily-moon.com/cms"&gt;
    &lt;cms:category <span class="boldcode"><strong>xsi:type="xsd:string"</strong></span>&gt;classifieds&lt;/category&gt;
    &lt;cms:subcategory <span class="boldcode"><strong>xsi:type="xsd:string"</strong></span>&gt;forsale
&lt;/cms:subcategory&gt;
    &lt;cms:articleHeadline <span class="boldcode"><strong>xsi:type="xsd:string"</strong></span> /&gt;
    &lt;cms:articleText <span class="boldcode"><strong>xsi:type="xsd:string"</strong></span>&gt;Vintage 1963 
T-Bird.  Less than 300 miles.  Driven by my daughter until
I took it away.  Serious inquires only.  555-3264 after 7 
PM.&lt;/cms:articleText&gt;
  &lt;/cms:addArticle&gt;
 &lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>第二个样式称为 document/literal 样式，即将相应的数据直接添加到消息中，如清单 14 中所示。</p>
		<br />
		<a name="N10453">
				<b>清单 14. Document/literal 样式示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version='1.0' ?&gt;
&lt;env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope"&gt; 
 &lt;env:Header&gt;
 &lt;/env:Header&gt;
 &lt;env:Body&gt;
    &lt;category&gt;classifieds&lt;/category&gt;
    &lt;subcategory&gt;forsale&lt;/subcategory&gt;
    &lt;articleHeadline&gt;&lt;/articleHeadline&gt;
    &lt;articleText&gt;Vintage 1963 T-Bird.  Less than 300 miles.
  Driven by my daughter until I took it away.  Serious 
inquires only.  555-3264 after 7 PM.&lt;/articleText&gt;
&lt;/env:Body&gt;
&lt;/env:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在这种情况下，消息本身并不包含有关数据所提交到的进程的信息，此工作由路由软件进行。例如，所有对特定 URL 或端点的调用都可能指向特定的操作。另外，从技术上讲，可以使用 document/encoded 样式，但目前还没有人这样做，因此可以将其忽略。</p>
		<p>在每个样式中都涉及到不同的折衷，本系列的第 2 部分将进一步对此进行详细讨论。不过，务必知道还有第三种样式“document wrapped”，并未正式地确定此样式，但由于各种互操作性原因而大受欢迎。在此情况下，有效负载的内容包装为单个元素，但元素并不据数据所属的过程或函数进行命名。从肉眼来看，这些消息几乎与 RPC/literal 消息完全相同。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10462">
						<span class="smalltitle">
								<strong>
										<font face="Arial">消息交换模式</font>
								</strong>
						</span>
				</a>
		</p>
		<p>谈到发送消息，您有很多选择，可以发送请求并等待响应，发送请求但不等待响应，发送请求并在到达最终的目的地前通过多个中间层。但就实质而言，只有两个选择：</p>
		<ul>
				<li>
						<b>请求/响应</b>：在请求/响应模式种，以 SOAP 消息的形式发送请求，然后直接等待发送回响应。请求可以为同步的，也可以是异步的。 
</li>
				<li>
						<b>单向消息传递</b>：这种情况也称为“Fire and Forget”方法，发送请求但并不等待响应。可以在仅传递信息时或并不关心接收者对此如何响应时使用此方法。 </li>
		</ul>
		<p>现在，请注意并没有使用术语“客户机”和“服务器”。之所以这样，是因为这些消息交换模式几乎可以用于创建与上面提到的方法类似的任意数量的不同备选方法。例如，可以发送一条请求，然后依靠接收者对其进行处理，并在将来完成应完成的工作时发送一条消息。为此，将使用多个单向消息的组合，因此谈“客户机”和“服务器”并不合理，因为每个消息都有其接收方和发送方，所谓的客户机和服务器的位置会发生对换。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section4.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<span class="atitle">构建 SOAP 客户机</span>
		</p>
		<p>上面已经对理论进行了介绍，现在让我们开始构建实际的实现。首先从客户机开始。</p>
		<p>
				<a name="N10489">
						<span class="smalltitle">
								<strong>
										<font face="Arial">以前的老方式</font>
								</strong>
						</span>
				</a>
		</p>
		<p>最初出现用于使用 SOAP 消息的 Java API 时，其用途非常特定化。它们的用途相当直接，用于创建 SOAP 消息。需要创建消息、<code>Envelope</code>、<code>Header</code>、<code>Body</code> 等等。例如，可以构建“旧式”客户机来访问前面安装的 <code>MyService</code> 服务的 <code>echo</code> 函数（请参见清单 15）。</p>
		<p>注意：为了编译并运行此客户机，将需要 SAAJ 实现（如原始 Axis 软件）。可以从 http://ws.apache.org/axis/ 下载 Axis。据说 Axis2 0.95 也包含此实现，但本教程未针对其进行测试。</p>
		<br />
		<a name="N104AD">
				<b>清单 15. 旧式 SOAP 客户机</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
import javax.xml.SOAP.*; 
import javax.xml.transform.*;
import java.io.FileInputStream;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;

public class SendSOAP {
    
   public static void main(String args[]) {
        
      try {
      
         MessageFactory messageFactory = MessageFactory.newInstance();
         SOAPMessage message = messageFactory.createMessage();
         
         //Create objects for the message parts            
         SOAPPart SOAPPart = message.getSOAPPart();
         SOAPEnvelope envelope = SOAPPart.getEnvelope();
         SOAPBody body = envelope.getBody();

         SOAPElement bodyElement = 
           body.addChildElement(envelope.createName("echo", 
            "req", "http://localhost:8080/axis2/services/MyService/"));
         bodyElement.addChildElement("category")
                             .addTextNode("classifieds");
         message.saveChanges();

         SOAPPart SOAPpartbefore = message.getSOAPPart();
         SOAPEnvelope reqenv = SOAPpartbefore.getEnvelope();

         System.out.println("REQUEST:");
         System.out.println(reqenv.toString());

         //Now create the connection
         SOAPConnectionFactory SOAPConnFactory = 
                           SOAPConnectionFactory.newInstance();
         SOAPConnection connection = 
                           SOAPConnFactory.createConnection();
         
         SOAPMessage reply = connection.call(message, 
                   "http://localhost:8080/axis2/services/MyService");

         SOAPPart SOAPpart = reply.getSOAPPart();
         SOAPEnvelope replyenv = SOAPpart.getEnvelope();

         System.out.println("\nRESPONSE:");
         System.out.println(replyenv.toString());

         connection.close();
     
     } catch (Exception e){
         System.out.println(e.getMessage());
     }
  }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请注意，您要直接创建 <code>SOAPEnvelope</code>、<code>SOAPBody</code> 等内容。可以向消息体添加 <code>echo</code> 和 <code>category</code> 等元素。将从其中创建连接，进行调用，同样也能遍历 SOAP 消息的结构来获取实际的内容。如果要运行此客户机，应该看到与清单 16 中所示类似的响应。</p>
		<br />
		<a name="N104CA">
				<b>清单 16. 当时的客户机</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
REQUEST:
&lt;SOAPenv:Envelope xmlns:SOAPenv=
       "http://schemas.xmlSOAP.org/SOAP/envelope/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;SOAPenv:Body&gt;
  &lt;req:echo xmlns:req=
         "http://localhost:8080/axis2/services/MyService/"&gt;
     &lt;req:category&gt;classifieds&lt;/req:category&gt;
  &lt;/req:echo&gt;
 &lt;/SOAPenv:Body&gt;
&lt;/SOAPenv:Envelope&gt;

RESPONSE:
&lt;SOAPenv:Envelope xmlns:SOAPenv=
      "http://schemas.xmlSOAP.org/SOAP/envelope/" xmlns:wsa=
      "http://schemas.xmlSOAP.org/ws/2004/08/addressing"&gt;
 &lt;SOAPenv:Header&gt;
  &lt;wsa:ReplyTo&gt;
   &lt;wsa:Address&gt;
http://schemas.xmlSOAP.org/ws/2004/08/addressing/role/anonymous
   &lt;/wsa:Address&gt;
  &lt;/wsa:ReplyTo&gt;
  &lt;wsa:From&gt;
   &lt;wsa:Address&gt;
http://localhost:8080/axis2/services/MyService&lt;/wsa:Address&gt;
  &lt;/wsa:From&gt;
  &lt;wsa:MessageID&gt;ECE5B3F187F29D28BC11433905662036&lt;/wsa:MessageID&gt;
 &lt;/SOAPenv:Header&gt;
 &lt;SOAPenv:Body&gt;
  &lt;req:echo xmlns:req=
         "http://localhost:8080/axis2/services/MyService/"&gt;
     &lt;req:category&gt;classifieds&lt;/req:category&gt;
  &lt;/req:echo&gt;
 &lt;/SOAPenv:Body&gt;
&lt;/SOAPenv:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>echo</code> 服务所进行的所有工作实际就是对其所接收到的请求进行应答，通过这一点可以很好地了解旧式处理方法与新式处理方法间的差别。接下来让我们看看二者的差异。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104D7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">新方式</font>
								</strong>
						</span>
				</a>
		</p>
		<p>现在越来越趋向于对程序员隐藏使用基于 XML 的 Web 服务消息的复杂性。为此进行了大量的工作，其中大部分的目标都是希望尽可能让 Web 服务编程与任何其他体系结构的编程工作一样进行。</p>
		<p>在 Axis2 中，实际上并不仅限于此。Axis2 引入了一种全新的方式来使用表示 SOAP 消息的 XML（尽管表面看来与使用文档对象模型类似）。AxIs 对象模型（Axis Object Model，AXIOM）进行了一系列更改，但我暂时将仅提一下其对消息的信息集的关注，消息集是元素和属性中包含的实际信息，而不是通常看到的序列化版本。不过，更为重要的是，Axis2 将为您处理 SOAP 信封，从而可以将精力放在构建有效负载上（或者，如果是实际的服务，则是分析有效负载和创建响应）。接下来让我们看看如何进行此工作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104E3">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建请求</font>
								</strong>
						</span>
				</a>
		</p>
		<p>要开始创建客户机，请确保 Axis2 lib 目录中的所有 *.jar 文件——指 Standard 分发版，而不是 War 分发版——都在您的 CLASSPATH 上，并创建名为 <code>ClassifiedClient</code> 的新类。创建有效负载，如清单 17 中所示。</p>
		<br />
		<a name="N104F4">
				<b>17. 有效负载</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.om.OMElement;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import java.io.StringWriter;
import org.apache.axis2.om.OMAbstractFactory;
import org.apache.axis2.SOAP.SOAPFactory;
import org.apache.axis2.om.OMFactory;
import org.apache.axis2.om.OMNamespace;

public class ClassifiedClient {

    public static OMElement getEchoOMElement() {
        SOAPFactory fac = OMAbstractFactory.getSOAP12Factory();
        OMNamespace omNs = fac.createOMNamespace(
                "http://daily-moon.com/cms", "cms");
        OMElement method = fac.createOMElement("echo", omNs);
        OMElement value = fac.createOMElement("category", omNs);
        value.addChild(fac.createText(value, "classifieds"));
        method.addChild(value);

        return method;
    }

    public static void main(String[] args) {
        try {
            <span class="boldcode"><strong>OMElement payload = ClassifiedClient.getEchoOMElement();</strong></span>
        } catch (Exception e) { //(XMLStreamException e) {
            System.out.println(e.toString());
        }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>首先，创建工厂和命名空间，并使用其创建各个元素。在本例中，您将创建与前面示例完全相同的元素，因为将再次使用此客户机访问 <code>echo</code> 函数。（稍后将对其进行更改，以访问真正的服务。）</p>
		<p>接下来，将创建请求。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1050A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">创建请求</font>
								</strong>
						</span>
				</a>
		</p>
		<p>下一步将创建实际的请求。同样，这方面也体现出技术随时间的发展。这里不会直接将请求发送到 URL，而要设置“端点引用”，如清单 18 中所示。</p>
		<br />
		<a name="N10517">
				<b>清单 18. 请求中的端点引用</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
public class ClassifiedClient {
    private static EndpointReference targetEPR = new
        EndpointReference(
           "http://localhost:8080/axis2/services/MyService");

    public static OMElement getEchoOMElement() {
...
    }

    public static void main(String[] args) {
        try {
            OMElement payload = ClassifiedClient.getEchoOMElement();
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

        } catch (Exception e) { //(XMLStreamException e) {
            System.out.println(e.toString());
        }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>对 WS-Addressing 的全面讨论不在本教程的范畴之内，但完全可以说端点引用包含消息将定向到的 URL，还可以有选择地包含其他信息，如应答地址和其他资源属性等。</p>
		<p>首先，为请求创建 Options，以便为请求设置 EPR 和其他信息（如打算使用的传输协议）。完成了这些后，就可以实际发送请求了。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10529">
						<span class="smalltitle">
								<strong>
										<font face="Arial">发送请求</font>
								</strong>
						</span>
				</a>
		</p>
		<p>完成了设置后，就可以发送请求了。对于 Axis 的 0.94 版，首选的方式是通过 <code>ServiceClient</code> 类发送消息，如清单 19 中所示。</p>
		<br />
		<a name="N1053A">
				<b>清单 19. 发送请求</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
...
    public static void main(String[] args) {
        try {
            OMElement payload = ClassifiedClient.getEchoOMElement();
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
            OMElement result = sender.sendReceive(payload);

        } catch (Exception e) { //(XMLStreamException e) {
            System.out.println(e.toString());
        }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>将创建 <code>ServiceClient</code> 对象，并为其设置前面创建的 <code>Options</code>。然后就可以直接发送消息了。由于希望得到响应，因此将使用 <code>sendReceive()</code> 方法（该方法用于 in/out 类型的消息）。将在本教程的<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section7.html"><font color="#996699">单向服务</font></a>部分讨论单向消息的信息。<code>sendReceive()</code> 方法将在客户机接收到实际响应时将其返回。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1055A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">输出结果</font>
								</strong>
						</span>
				</a>
		</p>
		<p>实际上，<code>sendReceive()</code> 并不会返回整个响应，而仅返回有效负载。如果将结果输出到命令行，应该清楚地看到清单 20 中的内容。</p>
		<br />
		<a name="N1056B">
				<b>清单 20. sendReceive 输出</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    

...
            sender.setOptions(options);
            OMElement result = sender.sendReceive(payload);

            System.out.println(result.toString());

        } catch (Exception e) { //(XMLStreamException e) {
            System.out.println(e.toString());
        }
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>运行此客户机将获得清单 21 中所示的响应。</p>
		<br />
		<a name="N10578">
				<b>清单 21. sendReceive 响应</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;cms:echo xmlns:cms="http://daily-moon.com/cms"&gt;&lt;cms:catego
ry&gt;classifieds&lt;/cms:category&gt;&lt;/cms:echo&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>当然，接收到此数据后，可以使用其进行任何工作。接下来，我们将构建实际的 <code>getNumberofArticles()</code> 服务。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section5.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 18:35 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解 Web 服务规范: 第 1 部分：SOAP  （1）  http://ibm.csdn.net/ISN_J.aspx?action=JMP&amp;pointid=1319</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90774.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 29 Dec 2006 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90774.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90774.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90774.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle">什么是 Web 服务？</span>
		</p>
		<p>首先，让我们从总体上了解一下什么是 Web 服务，以及它们为何对软件开发重要。</p>
		<p>
				<a name="N101AF">
						<span class="smalltitle">
								<strong>
										<font face="Arial">究竟为什么重要呢？</font>
								</strong>
						</span>
				</a>
		</p>
		<p>如果您没有听说过有关面向服务的体系结构 (SOA) 和 Web 服务的大量信息，您就不会阅读本文，那么问题就应该是，为什么此内容这样重要？答案是，此内容之所以重要，是因为这是应用程序彼此进行通信的方式的典型变化。SOAs 已经存在很长很长时间了。SOA 最初主要由中间件应用程序组成，至少进行连接的两端都属于同一种类型的中间件。另一方面，Web 服务由一组标准组成，用于在不需要特定类型的中间件、编程语言甚至操作系统的前提下让各种不同的系统进行通信。接下来，让我们了解一下其发展的历程。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101B8">
						<span class="smalltitle">
								<strong>
										<font face="Arial">传统应用程序</font>
								</strong>
						</span>
				</a>
		</p>
		<p>首先从计算机发明开始，当时给人感觉非常不错。计算机能执行奇迹般的任务，可实现很多手动工作的自动化，包括复杂的计算、财务工作等等很多其他任务。</p>
		<p>但传统应用程序是“竖井”(Silo) 型的。人力资源应用程序无法与财务应用程序真正通信，而后者又无法和分布应用程序进行真正的通信。所有这些应用程序都有独立的领域，在独立的计算机上运行，尽管很有用，但并不能很好地在彼此间共享数据。当时可以选择对批处理流程进行连接，以将数据从一个系统移动到另一个系统，但这并不适合进行实时集成。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101C4">
						<span class="smalltitle">
								<strong>
										<font face="Arial">分布式计算</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在我们的进化链中的第二步是分布式计算。分布式计算允许不同的应用程序彼此进行通信（即使位于不同的计算机上也是如此）。CORBA、MTS 和 Enterprise Java Bean (EJB) 等技术提供了包含各种类别的注册中心的系统，因此应用程序可以找到其希望与之进行交互的组件，然后像调用本地的组件一样调用这些组件。</p>
		<p>这些系统由可同时满足这两个要求的中间件（或更具体一些，面向消息的中间件）提供支持。现在能以特定的方式构建应用程序，即使位于不同的地理位置，也能访问其他系统上的资源。</p>
		<p>但仍然有一个问题。虽然系统可以自由地与系统内的任何对象进行通信，但仍然是一个封闭的系统。至少，客户机应用程序必须与服务器应用程序使用相同的技术。另外，通常并不会将系统设计为从创建其的个体组织外进行访问。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101D3">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Web 服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>此进化链中下一个几乎不可避免的链接点就是 Web 服务。“Web 服务”基于 XML 和 HTTP（大多数情况下），对很多人具有不同的含义，但在此处，我们要将 Web 服务作为系统间基于 SOAP 的消息交换进行讨论。</p>
		<p>这些消息由 XML 组成（XML 是一个基于文本的开放标准），可由来自任何应用程序（任何设计为接收此类消息的应用程序）的任何人进行访问。这就扩展了应用程序的范围，从而包含任何可通过网络对其进行访问的任何人。（如果这让您开始考虑安全问题，不要紧，您将在本系列的第 4 部分了解如何处理这方面的问题。）</p>
		<p>基于 SOAP 的 Web 服务将要发送与清单 1 中所示类似的 XML 消息。</p>
		<br />
		<a name="N101E6">
				<b>清单 1. 基于 SOAP 的 Web 服务</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;SOAPenv:Envelope 
       xmlns:SOAPenv="http://schemas.xmlSOAP.org/SOAP/envelope/" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;SOAPenv:Body&gt;
  &lt;req:getNumberOfArticles xmlns:req="http://daily-moon.com/CMS/"&gt;
     &lt;req:category&gt;classifieds&lt;/req:category&gt;
  &lt;/req:getNumberOfArticles&gt;
 &lt;/SOAPenv:Body&gt;
&lt;/SOAPenv:Envelope&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这些消息将从一个系统进入另一个系统（通常通过 HTTP）。接收系统对消息进行解释，进行应该进行从处理，然后发送另一个 SOAP 消息作为响应。</p>
		<p>这个系统很简单，正因为如此，有很多企业级计算方面的内容都尚未涉及。幸运的是，其中的很多方面已被纳入考虑范畴，且具有自己的相关规范来确定此事务应如何进行，以包含传统的面向消息的中间件的很多安全和其他方面的内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="otherwebservices">
						<span class="smalltitle">
								<strong>
										<font face="Arial">其他类型的 Web 服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>如果我没有说明 SOAP 并不是唯一的处理 Web 服务的方法，那就有些失职了。有很多其他基于 XML 的方法用于在系统间发送信息，其中一些适用于企业环境，而另一些则不适合此用途。例如，Amazon 是为公众提供对其系统的 Web 服务访问的第一批基于 Web 服务的公司之一。Amazon 包含了一个基于 SOAP 的服务，但也提供了一个基于 Representational State Transfer (REST) 的服务。</p>
		<p>REST 是一种 Web 服务类型，其中，用户直接访问 URL，相应的响应是与清单 2 中所示类似的简单 XML 文档。</p>
		<br />
		<a name="N10202">
				<b>清单 2. REST 响应</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;currentArticles&gt;
   &lt;category&gt;classifieds&lt;/category&gt;
   &lt;subcategory&gt;forsale&lt;/subcategory&gt;
   &lt;article id="888204"&gt;
       &lt;articleHeadline&gt;&lt;/articleHeadline&gt;
       &lt;articleText&gt;30 ft ladder, only used once.  Willing to let
go for half it's worth. Has slight dent near the middle.  
Harder than a human head. $150 OBO.&lt;/articleText&gt;
    &lt;/article&gt;
   &lt;article id="888242"&gt;
       &lt;articleHeadline&gt;&lt;/articleHeadline&gt;
       &lt;articleText&gt;Vintage 1963 T-Bird.  Less than 300 miles.  
Driven by my daughter until I took it away.  Serious inquires only.
555-3264 after 7 PM.&lt;/articleText&gt;
    &lt;/article&gt;
&lt;/currentArticles&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这些消息并没有特定的格式。可以为任何数据。</p>
		<p>另一种 Web 服务类型要使用 XML-RPC 之类的标准。在这种情况下，命令将通过与清单 3 中所示类似的 XML 发送到系统。 </p>
		<br />
		<a name="N10212">
				<b>清单 3. XML-RPC</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
&lt;?xml version="1.0"?&gt;
&lt;methodCall&gt;
   &lt;methodName&gt;CMS.getNumberOfArticles&lt;/methodName&gt;
   &lt;params&gt;
      &lt;param&gt;
         &lt;value&gt;&lt;string&gt;classifieds&lt;/string&gt;&lt;/value&gt;
      &lt;/param&gt;
      &lt;param&gt;
         &lt;value&gt;&lt;string&gt;forsale&lt;/string&gt;&lt;/value&gt;
      &lt;/param&gt;
   &lt;/params&gt;
&lt;/methodCall&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其响应将采用类似的格式。</p>
		<p>在学习使用 SOAP 的过程中，您可以会打心底里认为 REST 和 XML-RPC 比基于 SOAP 的系统要简单得多。的确如此。在某些情况下 REST 和 XML-RPC 比 SOAP 系统简单。不过，我们讨论的不是在网站上显示天气的简单应用程序。我们此处讨论的是企业级应用程序，而企业级的应用程序需要企业级的属性，如安全、互操作性等等。这些功能在有关基于 SOAP 的 Web 服务的其他规范中进行了定义，因而，从长期来看，SOAP 更适合用于企业级应用程序。</p>
		<p>让我们了解一下这些规范。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10221">
						<span class="smalltitle">
								<strong>
										<font face="Arial">基本 Web 服务规范</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Web 服务规范通常归为两类：基本 Web 服务规范和扩展 Web 服务规范。基本规范有：</p>
		<ul>
				<li>
						<b>SOAP</b>：SOAP 规范是所有基于 SOAP 的 Web 服务的基础，详细说明了实际消息的格式。其中还详细说明了应用程序应如何对待消息的特定方面（如“Header”中的元素），从而可以创建特定类型的应用程序，使其中的消息在达到最终的目的地前在多个中间层之间进行传递。本教程将涵盖 SOAP 规范的内容。 
</li>
				<li>
						<b>WDSL</b>：Web 服务描述语言是详细说明描述基于 SOAP 的 Web 服务的标准方式的规范，包括消息应采用的形式以及应将其发送到何处。其中还详细说明了此类消息的响应。当与相应的工具结合使用时，WSDL 允许以编程方式创建对 Web 服务的调用，甚至不用知道所查找的 Web 服务是什么；应用程序可以从 WSDL 文件中提取这些详细信息，并提供要使用的编程接口。我们将在本系列的第 2 部分讨论 WSDL。 
</li>
				<li>
						<b>UDDI</b>：统一描述、发现和集成 (Universal Description, Discovery and Integration) 是一项从最初提出后发生了一系列变化的标准。其最初的目的是为了给各个公司提供在全球注册中心中注册服务并在此注册中心中搜索可能想使用的服务的机制。不过，由于很多公司对于将其系统对外开放的问题上都相当保守，这个目标并没有完全实现。但是，很多公司已将 UDDI 作为内部的服务及服务信息注册中心使用，本系列第 3 部分将对其使用进行详细论述。 </li>
		</ul>
		<p>以上是一些基础知识。另外差不多还有数十种扩展标准，可进一步扩展基于 SOAP 的服务的用途。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10242">
						<span class="smalltitle">
								<strong>
										<font face="Arial">扩展 Web 服务规范</font>
								</strong>
						</span>
				</a>
		</p>
		<p>总共有数十种 WS-* 规范，其中几种对企业尤为有用。即：</p>
		<ul>
				<li>
						<b>WS-Security</b>：此规范处理加密和数字签名，允许创建特定类型的应用程序，以防止窃听消息，且能实现不可否认功能。本系列的第 4 部分将讨论 WS-Security。 
</li>
				<li>
						<b>WS-Policy</b>：此规范对 WS-Security 进行了扩展，允许更具体地说明谁可以采用何种方式使用服务。本系列的第 5 部分将讨论 WS-Policy。 
</li>
				<li>
						<b>WS-I</b>：尽管 Web 服务应设计成具有互操作性，但在实际中，各个规范对不同实现的解释的灵活性常常足以导致出现问题。WS-I 提供了一组可用于防止出现各种问题的标准和实践，并提供了标准化测试来检查问题。WS-I 是本系列的第 6 部分将要讨论的主题。 
</li>
				<li>
						<b>WS-BPEL</b>：单个服务很好处理，但应用程序在大多数情况下则较难处理。企业级计算要求至少将多个服务组合为一个完整的系统，而 WS-BPEL 提供了用于指定创建此类系统所必需的交互（如分支和并发处理）。本系列的第 7 部分将讨论 WS-BPEL。 </li>
		</ul>
		<p>在 Web 服务中扮演重要角色的其他规范将不在本系列中讨论，其中包括 <code>WS-ReliableMessaging</code>（允许确定检索一个且仅一个消息副本）、Web 服务资源框架 (WSRF)（允许使用在无状态环境中非常重要的状态）和 Web 服务分布式管理 (WSDM)（讨论 Web 服务的管理和使用问题）。可以在本教程的<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/resources.html"><font color="#5c81a7">参考资料</font></a>中获得有关这些规范及其他规范的更多信息。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10271">
						<span class="smalltitle">
								<strong>
										<font face="Arial">将要完成的工作</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在本教程中，您将了解 <i>Daily Moon</i> 报社的 Classifieds Department 如何将其自己的系统与内容管理系统使用的基于 Web 服务的接口进行集成。将创建一个应用程序，以创建基于 SOAP 的消息，将其发送到服务，然后检索响应。完成了此工作后，您将了解如何创建服务来响应请求并发送自己的响应。将通过创建 Java 应用程序（使用或不使用应用服务器）来完成此工作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section2.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<br />
		<br />
		<p>
				<span class="atitle">设置</span>
		</p>
		<p>现在已经了解了所涉及的基本原理，接下来让我们看看如何实际创建应用程序。首先要使所需软件就绪。</p>
		<p>
				<a name="N10289">
						<span class="smalltitle">
								<strong>
										<font face="Arial">设置 Apache Geronimo</font>
								</strong>
						</span>
				</a>
		</p>
		<p>将需要的第一个软件是 Web 应用服务器。为什么需要 Web 应用服务器呢？因为您会发现，没有 Web 应用服务器很难提供 Web 服务。Web 应用服务器将侦听请求，将这些请求转换为实际服务可以理解的内容，然后进行任何必要的处理。</p>
		<p>此过程中几乎可以使用任何 Web 服务器，但在大多数情况下都将使用能简化此过程的软件（通常要求使用某种类型的实际应用服务器）。具体来说，本教程假定您将使用 Java 应用服务器。（实际上，将使用 J2EE 应用服务器。） </p>
		<p>对于 J2EE 服务器，有很多选择；在本例中将使用 Apache Geronimo。Geronimo 是作为 IBM WebSphere Application Server Community Edition 基础的开放源代码应用服务器。Geronimo 很小，非常易于安装和管理。它还能与其他 Apache 项目（如稍后将安装的 Axis2）一起良好地工作。 </p>
		<p>请下载相关软件（请参阅<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/index.html"><font color="#996699">先决条件</font></a>）并将文件提取到目标目录中。您会发现所提取的文件中包含自身的目录，因此可以直接对其进行解包，并可将其移动到任何位置。任何目录都是可接受的，但要避免名称中包含空格的目录，如“Program Files”、“Documents and Settings”或其子目录。例如，本教程的测试安装使用的是 e:\geronimo-1.0。</p>
		<p>就是这里。已经在其中安装了 Geronimo。这不是很简单么？</p>
		<p>要启动此服务器，请打开命令提示符窗口，并执行以下命令：</p>
		<b>cd &lt;GERONIMO_HOME&gt;</b>
		<br />
		<b>java -jar server.jar</b>
		<p>要确保服务器正在运行，请打开浏览器，并指向清单 4 中所示的 URL：</p>
		<br />
		<a name="N102B4">
				<b>清单 4. 服务器 URL</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">                    
http://localhost:8080  
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>应该看到与图 1 中所示类似的页面。</p>
		<br />
		<a name="N102BF">
				<b>图 1. 服务器正在运行</b>
		</a>
		<br />
		<img height="375" alt="服务器正在运行" src="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/fig01.jpg" width="500" />
		<br />
		<p>现在让我们开始安装 Web 服务软件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102CE">
						<span class="smalltitle">
								<strong>
										<font face="Arial">安装 Apache Axis2</font>
								</strong>
						</span>
				</a>
		</p>
		<p>完全可能从普通 HTTP 服务器提供 Web 服务。不过，这样并不明智。处理 SOAP 消息需要进行很多工作，但没有必要完全从头进行所有工作。Apache Axis 项目几年前就对此任务进行了简化，创建了可方便地创建和处理 Web 服务的环境。该软件包含了多个应用程序，可帮助从普通项目创建 Web 服务，从 Web 服务创建 Java 对象，并对二者进行处理。Apache 小组已推出了 Axis 的新版本 Axis2，该版本继承了 Axis 上的所有已有功能，并通过更改体系结构实现了更大的灵活性，从而将其推向了一个新的高度。这很重要，因为 Web 服务规范随时都在增加。Axis2 的构造允许它更方便与 WSS4J、Apache 的 WS-Security 实现等项目集成。由于我们将在以后使用这些项目，因此请现在安装 Axis2（有关下载信息，请参阅<a href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/index.html#prereq"><font color="#5c81a7">先决条件</font></a>）。</p>
		<p>请确保同时下载 Binary Distribution 和 War Distribution。前者将帮助构建客户机，而后者用于帮助构建服务。</p>
		<p>要将 Axis2 安装到 Web 服务器中，请将 axis2.war 文件复制到 Geronimo 的 deploy 目录。（您将需要确保已经至少启动过 Geronimo 一次，才能保证存在此目录。）Geronimo 将自动检测其是否存在，因此不必手动部署任何内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102E1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">验证 Axis 的安装</font>
								</strong>
						</span>
				</a>
		</p>
		<p>要确保已经恰当安装了所有内容，请将浏览器指向 <code>http://localhost:8080/axis2/index.jsp</code> 并单击 Validate。</p>
		<p>应该看到与图 2 中所示类似的页面。</p>
		<br />
		<a name="N102F3">
				<b>图 2. Axis 安装成功</b>
		</a>
		<br />
		<img height="375" alt="Axis 安装成功" src="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/fig02.jpg" width="500" />
		<br />
		<p>在继续本教程的其他内容前，请确保成功安装了 Axis。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="installingasampleservice">
						<span class="smalltitle">
								<strong>
										<font face="Arial">安装示例服务</font>
								</strong>
						</span>
				</a>
		</p>
		<p>将要编写的第一个应用程序是客户机，因此将需要其可访问的服务。幸运的是，Axis2 分发版提供了若干此类服务。首先，将按照以下所示安装 <code>MyService</code> 服务：</p>
		<ol>
				<li>通过将浏览器指向 http://localhost:8080/axis2/Login.jsp 并登录，从而通过身份验证。缺省用户名和密码分别为 <code>admin</code> 和 <code>Axis2</code>。 
</li>
				<li>单击 <b>Upload service&gt;Browse</b>。 
</li>
				<li>导航到 MyService.aar 文件。可以在标准 Axis2 分发版的 samples\userguide 目录下找到该文件。单击 <b>OK</b>。 
</li>
				<li>单击 <b>Upload</b>。 </li>
		</ol>
		<p>应该看到一个通知，指示服务已添加（请参阅图 3）。在缺省情况下，Axis2 包含“热部署”功能，因此不必进行任何操作来激活。</p>
		<br />
		<a name="N10334">
				<b>如 3. MyService.aar 已上载</b>
		</a>
		<br />
		<img height="350" alt="MyService.aar 上载" src="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/fig03.jpg" width="500" />
		<br />
		<p>现在，让我们了解一下将要构建的内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="https://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/webservices/ws-understand-web-services1/section3.html#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/90774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-29 18:25 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/29/90774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 Axis2 开发 Web 服务，第 1 部分: 通过 Axis2 运行时部署和使用简单 Web 服务</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90293.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 27 Dec 2006 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90293.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90293.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过 Axis2 开发 Web 服务，第 1 部分: 通过 Axis2 运行时部署和使用简单 Web 服务																																																																																																																	...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90293.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-27 14:24 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Web Services以及Axis2技术(客户端和服务器端实现) </title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90285.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 27 Dec 2006 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90285.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90285.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90285.html</trackback:ping><description><![CDATA[
		<strong>
				<font color="#006400" size="5">Web Services以及Axis2技术之二<br /><br /></font>
		</strong>    <font color="#ff1493">本篇是继关于Axis2发布Web Service之后的又一随笔，此篇的主要任务是讲述使用Axis2开发客户端和服务器端的具体实现。相信大家在看本篇的时候已经具备了一定的Web Service开发基础，因此我主要是以例子的方式来说明，文字会相对较少。同时，我会在最后提供几个优秀的网址给大家。<br /></font><br />   <strong> 例一（简单的字符串传送服务实现）<br /></strong><br /><strong>客户端</strong>：<br /><strong><font color="#a52a2a">com.udm.iudmservice.IUDMServiceStub stub = new com.udm.iudmservice.IUDMServiceStub(); <br />com.udm.iudmservice.types.GetUserAllRegServices param234 =  (com.udm.iudmservice.types.GetUserAllRegServices) getTestObject (com.udm.iudmservice.types.GetUserAllRegServices.class);<br />GetUserAllRegServicesResponse resp = stub.getUserAllRegServices(param234);<br />OMElement ret = resp.get_return()[0];<br />System.out.println(ret.getText());                               //此为测试语句<br /></font>服务器端：</strong><br /><font color="#a52a2a"><strong>GetUserAllRegServicesResponse res = new GetUserAllRegServicesResponse();<br />OMElement resp = fac.createOMElement("Return", omNs);<br />resp.setText("返回的结果!");<br />System.out.println("返回结果为:" + resp.getText());  //此为测试语句<br />res.set_return(new OMElement[] { resp });<br /></strong></font><br />    <strong>例二（文件传送的具体实现）</strong><br /><br /><strong>客户端：<br /></strong><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.om.OMAbstractFactory;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.om.OMElement;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.om.OMFactory;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.om.OMNamespace;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.om.OMText;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.soap.SOAP11Constants;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axiom.soap.SOAP12Constants;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axis2.Constants;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axis2.addressing.EndpointReference;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axis2.client.Options;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import org.apache.axis2.client.ServiceClient;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import javax.activation.DataHandler;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import javax.activation.FileDataSource;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import javax.xml.namespace.QName;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import java.io.File;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>import java.io.InputStream;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>public class FileTransferClient {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   private static EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8080/axis2/services/interop");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   public static boolean upload(String mailboxnum, short greetingType, File file, String fileType) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     try {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      OMElement data = buildUploadEnvelope(mailboxnum, greetingType, file, fileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      Options options = buildOptions();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      ServiceClient sender = new ServiceClient();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      sender.setOptions(options);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      System.out.println(data);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      OMElement ome = sender.sendReceive(data);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      System.out.println(ome);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      String b = ome.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      return Boolean.parseBoolean(b);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     catch(Exception e) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     return false;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   public static InputStream download(String mailboxnum, short greetingType, String FileType) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     try {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       OMElement data = buildDownloadEnvelope(mailboxnum, greetingType, FileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       Options options = buildOptions();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       ServiceClient sender = new ServiceClient();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       sender.setOptions(options);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       System.out.println(data);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       OMElement ome = sender.sendReceive(data);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       System.out.println(ome);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       OMText binaryNode = (OMText) ome.getFirstOMChild();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       DataHandler actualDH = (DataHandler) binaryNode.getDataHandler();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>       return actualDH.getInputStream();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      catch(Exception e) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     return null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>  </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   private static OMElement buildUploadEnvelope(String mailboxnum, short greetingType, File file, String FileType) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     DataHandler expectedDH;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMFactory fac = OMAbstractFactory.getOMFactory();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMNamespace omNs = fac.createOMNamespace("http://example.org/mtom/data", "x");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement data = fac.createOMElement("upload", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement fileContent = fac.createOMElement("fileContent", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     FileDataSource dataSource = new FileDataSource(file);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     expectedDH = new DataHandler(dataSource);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMText textData = fac.createOMText(expectedDH, true);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     fileContent.addChild(textData);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement mboxnum = fac.createOMElement("mailboxnum", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     mboxnum.setText(mailboxnum);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement gtType = fac.createOMElement("greetingType", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     gtType.setText(greetingType+"");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement fileType=fac.createOMElement("fileType", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     fileType.setText(FileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(mboxnum);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(gtType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(fileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(fileContent);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     return data;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   private static OMElement buildDownloadEnvelope(String mailboxnum, short greetingType, String FileType) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMFactory fac = OMAbstractFactory.getOMFactory();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMNamespace omNs = fac.createOMNamespace("http://example.org/mtom/data", "x");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement data = fac.createOMElement("download", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement mboxnum = fac.createOMElement("mailboxnum", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     mboxnum.setText(mailboxnum);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement gtType = fac.createOMElement("greetingType", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     gtType.setText(greetingType+"");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     OMElement fileType=fac.createOMElement("fileType", omNs);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     fileType.setText(FileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(mboxnum);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(gtType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     data.addChild(fileType);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     return data;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   private static Options buildOptions() {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     Options options = new Options();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     options.setTo(targetEPR);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     // enabling MTOM in the client side</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     options.setTransportInProtocol(Constants.TRANSPORT_HTTP);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     return options;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }<br /></strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   public static void main(String agrs[]) {    //此为测试主函数</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     String file = "C:/deploy.wsdd";</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     short gt = 1;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     String mn = "20060405";</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     String ft="wsdd";</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     boolean rtv = upload(mn,gt,new File(file),ft);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     System.out.println(rtv);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>     InputStream is = download(mn,gt,ft);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#800080"><strong>   }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><strong><font color="#800080"><span style="FONT-SIZE: 9pt">}</span><br /></font>服务器端</strong>：<br /><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.attachments.utils.IOUtils;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.om.OMAbstractFactory;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.om.OMElement;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.om.OMFactory;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.om.OMNamespace;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axiom.om.OMText;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import org.apache.axis2.AxisFault;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import java.io.FileOutputStream;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import java.io.*;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import java.util.Iterator;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import javax.activation.DataHandler;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>import javax.activation.FileDataSource;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>public class interopService {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong> public static final String TMP_PATH = "c:/tmp";</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong> public OMElement upload(OMElement element) throws Exception {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _fileContent = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _mailboxnum = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _greetingType = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _fileType = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    System.out.println(element);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    for (Iterator _iterator = element.getChildElements(); _iterator.hasNext();) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      OMElement _ele = (OMElement) _iterator.next();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("fileContent")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _fileContent = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("mailboxnum")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _mailboxnum = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("greetingType")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _greetingType = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("fileType")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _fileType = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    if (_fileContent == null || _mailboxnum == null || _greetingType== null || _fileType==null) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      throw new AxisFault("Either Image or FileName is null");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMText binaryNode = (OMText) _fileContent.getFirstOMChild();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String mboxNum = _mailboxnum.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String greetingType = _greetingType.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String fileType = _fileType.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong></strong></font></span> </div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String greetingstoreDir = TMP_PATH+"/"+mboxNum;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    File dir = new File(greetingstoreDir);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    if(!dir.exists()) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      dir.mkdir();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String filePath = greetingstoreDir+"/"+greetingType+"."+fileType;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    File greetingFile = new File(filePath);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    if(greetingFile.exists()) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      greetingFile.delete();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      greetingFile = new File(filePath);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    // Extracting the data and saving</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    DataHandler actualDH;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    actualDH = (DataHandler) binaryNode.getDataHandler();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>     </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    FileOutputStream imageOutStream = new FileOutputStream(greetingFile);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    InputStream is = actualDH.getInputStream();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    imageOutStream.write(IOUtils.getStreamAsByteArray(is));</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    // setting response</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMFactory fac = OMAbstractFactory.getOMFactory();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMNamespace ns = fac.createOMNamespace("http://example.org/mtom/data", "x");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement ele = fac.createOMElement("response", ns);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    ele.setText("true");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    return ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong> }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong> public OMElement download(OMElement element) throws Exception {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    System.out.println(element);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _mailboxnum = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _greetingType = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement _fileType = null;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    for (Iterator _iterator = element.getChildElements(); _iterator.hasNext();) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      OMElement _ele = (OMElement) _iterator.next();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("mailboxnum")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _mailboxnum = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("greetingType")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _greetingType = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      if (_ele.getLocalName().equalsIgnoreCase("fileType")) {</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>        _fileType = _ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>      }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String mboxNum = _mailboxnum.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String greetingType = _greetingType.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String fileType = _fileType.getText();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    String filePath = TMP_PATH+"/"+mboxNum+"/"+greetingType+"."+fileType;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    FileDataSource dataSource = new FileDataSource(filePath);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    DataHandler expectedDH = new DataHandler(dataSource);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMFactory fac = OMAbstractFactory.getOMFactory();</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    </strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMNamespace ns = fac.createOMNamespace("http://example.org/mtom/data", "x");</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMText textData = fac.createOMText(expectedDH, true);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    OMElement ele = fac.createOMElement("response", ns);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    ele.addChild(textData);</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>    return ele;</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong> }</strong></font></span></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 9pt"><font color="#0000ff"><strong>}<br /></strong></font><font size="3"><strong>Services.xml配置文件：</strong><br /><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;service</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">name=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"MTOMService"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;description&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black"><strong>        This is a sample Web Service with two operations,echo and ping.</strong></span></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/description&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;parameter</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">name=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"ServiceClass"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">locked=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"false"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&gt;</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">sample.mtom.interop.service.interopService</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/parameter&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;operation</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">name=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"upload"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">        </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;actionMapping&gt;</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">urn:upload</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/actionMapping&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">        </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;messageReceiver</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">class=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">/&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/operation&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">      </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;operation</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">name=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"download"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">        </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;actionMapping&gt;</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">urn:download</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/actionMapping&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">        </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;messageReceiver</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">class=</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy">"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"</span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">/&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><strong><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black">    </span><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1">&lt;/operation&gt;</span></strong></div><div style="MARGIN: 0in 0in 0pt"><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1"><strong>&lt;/service&gt;</strong></span></div><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1"></span></font></span></div><span style="FONT-SIZE: 9pt"><font size="3"><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1"></span></font></span></div><p><span style="FONT-SIZE: 9pt"><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1"><font color="#000000" size="3">两个学习网址<span style="FONT-SIZE: 10pt; COLOR: black"><a href="javascript:ol('https://www6.software.ibm.com/developerworks/cn/education/opensource/os-ag-onbank1/index.html');"><span style="FONT-SIZE: 12pt"><font face="Courier New" color="#000080"></font></span></a><font face="Times New Roman" color="#666666" size="2"><a href="http://www-128.ibm.com/developerworks/cn/">http://www-128.ibm.com/developerworks/cn/</a></font></span></font></span>（IBM的开发网中国站）<br />                                <a href="http://www.apache.org/"><font color="#666666">http://www.apache.org/</font></a> (Apache公司的官方网站)<br /><br /><span style="FONT-SIZE: 9pt"><span style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #0000e1"><font color="#000000" size="3">    <font color="#ee82ee" size="4"><strong>最后：祝福大家在程序的天空里越飞越高！！！<br /></strong></font><br /><br /></font></span></span></span></p><img src ="http://www.blogjava.net/wangxinsh55/aggbug/90285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-27 13:42 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本人收集的一些关于WEB SERVICES 的优秀网址跟大家分享 </title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90284.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 27 Dec 2006 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90284.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/90284.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90284.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/90284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/90284.html</trackback:ping><description><![CDATA[developerWorks 中国网站 Web 服务专区： <br /><a href="http://www-900.ibm.com/developerWorks/cn/webservices/index.shtml"><font color="#666666">http://www-900.ibm.com/developerWorks/cn/webservices/index.shtml</font></a><br />Java Web Services 的中文教程 <br /><a href="http://gceclub.sun.com.cn/NASApp/sme/controller/bottomlearning?cat_id=010103"><font color="#666666">http://gceclub.sun.com.cn/NASApp/sme/controller/bottomlearning?cat_id=010103</font></a><a href="http://www.ws-i.org/"><br /><br /><font color="#666666">http://www.ws-i.org/</font></a><br /><a href="http://www-106.ibm.com/developerworks/webservices/"><font color="#666666">http://www-106.ibm.com/developerworks/webservices/</font></a><br /><a href="http://www.w3.org/2002/ws/"><font color="#666666">http://www.w3.org/2002/ws/</font></a><br /><a href="http://www.webservices.org/"><font color="#666666">http://www.webservices.org/</font></a><br /><a href="http://www.webservicesarchitect.com/"><font color="#666666">http://www.webservicesarchitect.com/</font></a><br /><a href="http://msdn.microsoft.com/webservices"><font color="#666666">http://msdn.microsoft.com/webservices</font></a><br /><a href="http://www.soapware.org/"><font color="#666666">http://www.soapware.org</font></a><br /><a href="http://www.soaprpc.com/"><font color="#666666">http://www.soaprpc.com</font></a><br /><a href="http://java.sun.com/webservices"><font color="#666666">http://java.sun.com/webservices</font></a><br /><a href="http://www.xmethods.com/"><font color="#666666">http://www.xmethods.com/</font></a><br /><a href="http://hosting.msugs.ch/eyesoft/index.htm"><font color="#666666">http://hosting.msugs.ch/eyesoft/index.htm</font></a><br /><a href="http://www.webservices.org/"><font color="#666666">http://www.webservices.org/</font></a><br /><a href="http://www.salcentral.com/salnet/webserviceswsdl.asp"><font color="#666666">http://www.salcentral.com/salnet/webserviceswsdl.asp</font></a><br /><a href="http://www.learnxmlws.com/"><font color="#666666">http://www.learnxmlws.com/</font></a><br /><a href="http://searchwebservices.techtarget.com/"><font color="#666666">http://searchwebservices.techtarget.com/</font></a><br /><a href="http://forum.uddi-china.org/"><font color="#666666">http://forum.uddi-china.org/</font></a><br /><a href="http://www.soapwebservices.com/"><font color="#666666">http://www.soapwebservices.com/</font></a><br /><a href="http://soapagent.com/"><font color="#666666">http://soapagent.com/</font></a><br /><a href="http://www.soapclient.com/"><font color="#666666">http://www.soapclient.com/</font></a><br /><a href="http://www.soapware.org/"><font color="#666666">http://www.soapware.org/</font></a><br /><br />(如果还有好的网站也请大家补充) <img src ="http://www.blogjava.net/wangxinsh55/aggbug/90284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-27 13:40 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/27/90284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2体系结构中文手册</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/12/22/89562.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 22 Dec 2006 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/12/22/89562.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/89562.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/12/22/89562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/89562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/89562.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言								结构都是它本身所能产生效率的结果。任何一个成功结构都是基于它期望的需求。我们通过期望用				Axis2				做什么来开始我们的				Axis2				之旅。								用										Axis2								做什么								在				SOAP				的术语里，一个				We...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/12/22/89562.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/89562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-12-22 17:42 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/12/22/89562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS服务间传递JavaBean及其安全解决 </title><link>http://www.blogjava.net/wangxinsh55/archive/2006/11/02/78660.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 02 Nov 2006 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/11/02/78660.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/78660.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/11/02/78660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/78660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/78660.html</trackback:ping><description><![CDATA[
		<p>在AXIS服务间传递JavaBean及其安全解决<br /> 这是AXIS学习笔记的最后一篇。在前面我们讨论了最简单的HelloWorld服务，客户端并没有向服务器端<br /> 传递参数，现在我们来传传JavaBean。<strong>当然，也可以传递你自己定义的JAVA类，但那样你必须自己创建<br /> 专门的XML序列化器和反序列化器</strong>；<strong>而对JavaBean，AXIS提供了现成的序列化器。（有人说：懒惰是程序员最大的美德，我喜欢，所以我就传传JavaBean）<br /></strong> <br /> 一、服务器端<br />  1、CLASS类两个Order.class,OrderTest.class，位于%TOMCAT_HOME%\webapps\axis\WEB-INF\classes下<br />     这两个类都直接给出源码，不再说明<br />    <b> Order.java</b><br />     public class Order {<br />        private String id;<br />        private String name;<br />        public void setId(String id){<br />           this.id=id;<br />        }<br />        public String getId(){<br />           return id;<br />        }<br />        public void setName(String name){<br />            this.name=name;<br />        }<br />        public String getName(){<br />            return name;<br />        }<br />      }<br />      <br />    <b>OrderTest.java</b><br />    public class OrderTest {<br />      public Order returnOrder(Order order){<br />        Order newOrder=new Order();<br />        if(order.getId().equals("1"))<br />           newOrder.setName("ronghao");<br />        else newOrder.setName("haorong");<br />        return newOrder;<br />      }<br />    }<br />    <br />  2、修改服务器端配置文件server-config.wsdd<br />   在server-config.wsdd中相应位置添加以下代码<br />  &lt;service name="Order" provider="java:RPC"&gt;<br />    &lt;parameter name="allowedMethods" value="returnOrder"/&gt;<br />    &lt;parameter name="className" value="OrderTest"/&gt;<br />    &lt;beanMapping languageSpecificType="java:Order" qname="ns1:Order" <br />         xmlns:ns1="urn:BeanService"/&gt;<br />  &lt;/service&gt;<br />  可以看到和前面的发布服务代码相比仅多了一行代码<br />    &lt;beanMapping languageSpecificType="java:Order" qname="ns1:Order" <br />         xmlns:ns1="urn:BeanService"/&gt;<br />   languageSpecificType属性指定JavaBean类文件位置,例如：<br />   languageSpecificType="java:com.ronghao.axis.Order"<br />   qname属性指定JavaBean类的名字<br />   其他是固定的。<br />   <br /> 二、客户端<br />   客户端类文件一个OrderClient.class，代码如下（变化的部分加注释）：<br />   public class OrderClient<br />{<br /><br />    public static void main(String args[])<br />        throws Exception<br />    {<br />        String endpoint = "http://localhost:8080/axis/services/Order";  //服务所在位置<br />        Order order=new Order();   //JavaBean<br />        order.setId("1");<br />        Service service = new Service();<br />        Call call = (Call)service.createCall();<br />        //注册JavaBean，注意和server-config.wsdd中的配置代码比较<br />        QName qn = new QName("urn:BeanService", "Order");<br />        call.registerTypeMapping(Order.class, qn, new BeanSerializerFactory(Order.class, qn), <br />                                new BeanDeserializerFactory(Order.class, qn));<br />        String name="no!";<br />        try<br />        {<br />            call.setTargetEndpointAddress(new URL(endpoint));<br />            //调用的服务器端方法<br />            call.setOperationName(new QName("Order", "returnOrder"));<br />            //设定传入的参数，这里qn即Order.class<br />            call.addParameter("arg1", qn, ParameterMode.IN);<br />            //设定返回的参数是Order.class<br />            call.setReturnType(qn, Order.class);<br />            Order result = (Order)call.invoke(new Object[] {<br />                order<br />            });<br />            if(result != null)<br />                name = result.getName();<br />        }<br />        catch(Exception e)<br />        {<br />            System.err.println(e);<br />        }<br />        System.out.println(name);<br />    }<br />}<br />  OK！运行一下，就可以看到返回了"ronghao"。<br />  <br />  和上一篇文章一样，我们不容许在网络中传递XML是明文，于是需要加密和验证。这里我们继续采用上次所讲的框架。（已打包成ws-axis.jar)<br />  <br /> 一、修改服务器端配置文件server-config.wsdd（和上一文章一模一样！不再罗嗦）<br />  在server-config.wsdd中相应位置添加以下代码<br />         &lt;requestFlow&gt;<br />           &lt;handler type="soapmonitor"/&gt;<br />           &lt;handler type="java:com.ronghao.WSAxis.WSServerRequestHandler"&gt;<br />              &lt;parameter name="keyStoreFile" value="f:\server.keystore"/&gt;<br />              &lt;parameter name="trustStoreFile" value="f:\server.truststore"/&gt;<br />              &lt;parameter name="keyStorePassword" value="changeit"/&gt;<br />              &lt;parameter name="keyAlias" value="Server"/&gt;<br />              &lt;parameter name="keyEntryPassword" value="changeit"/&gt;<br />              &lt;parameter name="trustStorePassword" value="changeit"/&gt;<br />              &lt;parameter name="certAlias" value="clientkey"/&gt;<br />           &lt;/handler&gt;<br />        &lt;/requestFlow&gt;<br />        &lt;responseFlow&gt;<br />           &lt;handler type="soapmonitor"/&gt;<br />           &lt;handler type="java:com.ronghao.WSAxis.WSServerResponseHandler"&gt;<br />              &lt;parameter name="keyStoreFile" value="f:\server.keystore"/&gt;<br />              &lt;parameter name="trustStoreFile"  value="f:\server.truststore"/&gt;<br />              &lt;parameter name="keyStorePassword" value="changeit"/&gt;<br />              &lt;parameter name="keyAlias" value="Server"/&gt;<br />              &lt;parameter name="keyEntryPassword" value="changeit"/&gt;<br />              &lt;parameter name="trustStorePassword" value="changeit"/&gt;<br />              &lt;parameter name="certAlias" value="clientkey"/&gt;<br />           &lt;/handler&gt;<br />        &lt;/responseFlow&gt;<br />        <br /> 二、客户端（区别就在这里，注意！！）<br />  首先在这里要说一下，客户端代码编写困扰了我很长一段时间（整整一天），因为它并不象我想象的那么简单，当然解决起来还是挺简单的：）问题的解决经历了三个阶段<br />  <br />  第一阶段：<br />   在这个阶段我想当然的在OrderClient.class中加入了如下代码：<br />            WSClientHandler handler=new WSClientRequestHandler();//注意新加的HANDLER<br />            handler.setInitialization("f:/client.keystore","changeit","Client","changeit",<br />                "f:/client.truststore","changeit","serverkey");//初始化<br />            WSClientHandler handlee=new WSClientResponseHandler();//注意新加的HANDLER<br />            handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",<br />                "f:/client.truststore","changeit","serverkey");//初始化<br />            call.setClientHandlers(handler,handlee);//添加Handler<br />   这个方法也是我在上一文章里介绍的，结果抛出以下异常：<br />   faultString: org.xml.sax.SAXException: Deserializing parameter<br />    &amp;apos;newProfileReturn&amp;apos;:  could not find deserializer for type<br />   {urn:BeanService Order}SerializableProfile<br />   也就是说不能正常解析XML文件，于是理所当然的郁闷了，觉得代码中肯定漏设了CALL的一个属性，于是查看AXIS的源代码，没有结果！转机出现在下面一行代码，在不断的抛出异常中我修改了代码<br />   将call.setClientHandlers(handler,handlee);改为<br />     call.setClientHandlers(null,null);<br />   结果程序还是抛出同样的异常，于是意识到这可能是AXIS的一个BUG，为证明这一点，我将下面的Handler初始化代码删除<br />            WSClientHandler handler=new WSClientRequestHandler();//注意新加的HANDLER<br />            handler.setInitialization("f:/client.keystore","changeit","Client","changeit",<br />                "f:/client.truststore","changeit","serverkey");//初始化<br />            WSClientHandler handlee=new WSClientResponseHandler();//注意新加的HANDLER<br />            handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",<br />                "f:/client.truststore","changeit","serverkey");//初始化<br />   结果还是抛出同样的异常，果然是BUG！得到这个结论后去了apache AXIS主页，在问题列表中见到了完全一样问题的提交，但没有解答（晕！）<br />   最后得到了结论：call的setClientHandlers()方法只有当call处理简单的数据类型，如String,int等等才能正常使用！<br />   （当然，如果你对这个问题有不同的见解，欢迎和我联系。或许我错了，但程序不运行是真的：））<br />   <br />  第二阶段：<br />    开始在google上找问题的解决方法，这也是我的习惯：）。找了一个类似问题的讨论，地址如下：<br />    http://marc.theaimsgroup.com/?l=axis-user&amp;m=111259980822735&amp;w=2<br />    他们的解决方法是Handler继承于javax.xml.rpc.handler.Handler，然后在程序里动态注册而在我的ws-axis.jar里Handler继承于org.apache.axis.handlers.BasicHandler。当然，<br />    javax.xml.rpc.handler.Handler是org.apache.axis.handlers.BasicHandler的老爸，但在程序里老爸和儿子之间却不能很好的兼容，这也许就是所谓的代沟？？无奈中重新写了Handler,但在运行中却抛出异常，提示message在被invoke的时候已被更改。我靠，Handler的作用就是来更改message的啊！这是什么世道！<br />    我知道很多程序采用的就是这种方法，但我好象怎么修改都抛出上述异常。<br />    <br />  第三阶段<br />     既然在程序里动态注册Handler行不通，于是决定写个单独的配置文件来注册Handler。如果这种方法不幸失败就返回第二阶段。好马为什么不吃回头草？？<br />  1、ws-axis.jar中修改WSClientHandler.class,修改后如下，我想你一看就明白为何修改<br />  <br />public  class WSClientHandler extends BasicHandler{<br />  protected String keyStoreFile ;<br />  protected  String keyStoreType ="JKS";<br />  protected String keyStorePassword ;<br />  protected String keyAlias ;<br />  protected String keyEntryPassword ;<br />  protected String trustStoreFile ;<br />  protected String trustStoreType = "JKS";<br />  protected String trustStorePassword ;<br />  protected String certAlias ;<br /><br />  public void init() {<br />    keyStoreFile = (String)getOption("keyStoreFile");<br />    if(( keyStoreFile== null) )<br />      System.err.println("Please keyStoreFile configured for the Handler!");<br />    trustStoreFile = (String)getOption("trustStoreFile");<br />     if((  trustStoreFile== null) )<br />    System.err.println("Please trustStoreFile configured for the Handler!");<br />    keyStorePassword = (String)getOption("keyStorePassword");<br />     if(( keyStorePassword== null) )<br />    System.err.println("Please keyStorePassword configured for the Handler!");<br />    keyAlias = (String)getOption("keyAlias");<br />     if(( keyAlias== null) )<br />    System.err.println("Please keyAlias configured for the Handler!");<br />    keyEntryPassword = (String)getOption("keyEntryPassword");<br />     if(( keyEntryPassword== null) )<br />    System.err.println("Please keyEntryPassword configured for the Handler!");<br />    trustStorePassword = (String)getOption("trustStorePassword");<br />     if(( trustStorePassword== null) )<br />    System.err.println("Please trustStorePassword configured for the Handler!");<br />    certAlias = (String)getOption("certAlias");<br />    if ((certAlias==null))<br />        System.err.println("Please certAlias configured for the Handler!");<br />    if ((getOption("keyStoreType")) != null)<br />       keyStoreType = (String)getOption("keyStoreType");<br />    if ((getOption("trustStoreType")) != null)<br />       trustStoreType = (String)getOption("trustStoreType");<br />    }<br />  public void invoke(MessageContext messageContext) throws AxisFault {<br />    //do nothing now!<br />  }<br />  public void onFault(MessageContext msgContext) {<br />    System.out.println("处理错误，这里忽略！");<br />        }<br />}<br />    <br />  2、写客户端的配置代码client-config.wsdd,如下：<br />   &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />   &lt;deployment name="defaultClientConfig"<br />      xmlns="http://xml.apache.org/axis/wsdd/"<br />      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;<br />   &lt;transport name="http"<br />       pivot="java:org.apache.axis.transport.http.HTTPSender"/&gt;<br />   &lt;transport name="local"<br />       pivot="java:org.apache.axis.transport.local.LocalSender"/&gt;<br />   &lt;transport name="java"<br />       pivot="java:org.apache.axis.transport.java.JavaSender"/&gt;<br /><br />&lt;globalConfiguration&gt;<br />  &lt;requestFlow&gt;<br />   &lt;handler type="java:com.ronghao.WSAxis.WSClientRequestHandler"&gt;<br />    &lt;parameter name="keyStoreFile" value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.keystore"/&gt;<br />    &lt;parameter name="keyEntryPassword" value="changeit"/&gt;<br />    &lt;parameter name="certAlias" value="serverkey"/&gt;<br />    &lt;parameter name="trustStorePassword" value="changeit"/&gt;<br />    &lt;parameter name="trustStoreFile" value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.truststore"/&gt;<br />    &lt;parameter name="keyAlias" value="Client"/&gt;<br />    &lt;parameter name="keyStorePassword" value="changeit"/&gt;<br />   &lt;/handler&gt;<br />  &lt;/requestFlow&gt;<br />  &lt;responseFlow&gt;<br />   &lt;handler type="java:com.ronghao.WSAxis.WSClientResponseHandler"&gt;<br />    &lt;parameter name="keyStoreFile" value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.keystore"/&gt;<br />    &lt;parameter name="keyEntryPassword" value="changeit"/&gt;<br />    &lt;parameter name="certAlias" value="serverkey"/&gt;<br />    &lt;parameter name="trustStorePassword" value="changeit"/&gt;<br />    &lt;parameter name="trustStoreFile" value="D:\Tomcat5.5\webapps\axis\WEB-INF\client.truststore"/&gt;<br />    &lt;parameter name="keyAlias" value="Client"/&gt;<br />    &lt;parameter name="keyStorePassword" value="changeit"/&gt;<br />   &lt;/handler&gt;<br />  &lt;/responseFlow&gt;<br />&lt;/globalConfiguration&gt;<br />&lt;/deployment&gt;<br /> 同样不再解释，不明白可以参考我的上一篇文章<br />  <br />  3、修改OrderClient.class<br />   在OrderClient.class中加入了如下代码：<br />    EngineConfiguration conf =<br />           new FileProvider("F:\\Tomcat\\webapps\\axis\\WEB-INF\\client-config.wsdd");//位置<br />     Service service = new Service(conf);<br />   当然记得导入<br />   import org.apache.axis.EngineConfiguration;<br />   import org.apache.axis.configuration.FileProvider;<br />   <br /> 运行一下，返回"ronghao"，靠，搞定！<br /> 注意：这次我把OrderClient.class的调用放到了一个JSP文件中而不是jbuilder中，因为有client-config.wsdd，所以你必须有完整的WEB程序发布到TOMCAT中，否则会报找不到<br />相应文件。<br /><br /></p>
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=471571</p>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/78660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-11-02 13:39 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/11/02/78660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 如何在Eclipse中自动生成WebService代理类</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61851.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61851.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61851.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61851.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61851.html</trackback:ping><description><![CDATA[       刚接触Java就要做WebService,由于第一次使用Eclipse,对这个环境比较陌生,找不到生成代理类的文章,于是将自己的心得写出来.
<p>         其实用Eclipse生成WebService代理比较简单,由于我的WebService是用.net写出来的,而在Java中要用到.所以少了一个方便的工具.在Eclipse中,新建一个项目,在项目中再新建一个扩展名为.wsdl的文件,文件名任意.右键选择*.wsdl这个文件,会有一项"WebService",然后选择"Test with WebService Expolor",会在Eclipse中打一个浏览器,在浏览器中选择"WSDL Main",并右边输入WebService的地址,注意,一定要包含(?wsdl),比如<a href="http://192.168.0.136:8080/Winstar.Console/CommonService/group.asmx?wsdl">http://192.168.0.136:8080/Winstar.Console/CommonService/group.asmx?wsdl</a>这样才是正确的地址,输入完后单击"GO".这时浏览器的左边会出现刚刚输入的WebService地址,选中这个地址,在浏览器的右边会出现"<a href="http://localhost:54881/wsexplorer/wsdl/actions/SelectWSDLPropertiesToolActionJSP.jsp?nodeId=5&amp;toolId=3" target="perspective_workarea">Launch Web Service Wizard</a>"这个选项,选择后会出现"Select a wizard to launch:",再选择"Web Service Client"并单击"GO",就会弹出一个新的窗口,在Configuration中选择"Client project:WebService project",在新弹出的窗口中的Client project这个下拉列表中选择一个已经存在的工程,确定即可.其它的都不用设置,直接点击完成.就会在选择的工程的src下生成一个名为org.tempuri的包,里面包含了Eclipse生成的代理类.如果WebService的类型为int ,boolean ,string这样的简单类型的话,WebService可以说是通用,但如果包含了复杂类型的话就麻烦一点了,我做的就是将.net的WebService调到java里面用,而WebService返回的又是XmlNode这样类型的数据,因为java里面没在XmlNode,但好在有这个包axis-bin-1_4,里面有个org.apache.axis.message.MessageElement[]类型.</p><br /><img src ="http://www.blogjava.net/wangxinsh55/aggbug/61851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:43 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用myeclipse开发webservice网址</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61849.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:30:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61849.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61849.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61849.html</trackback:ping><description><![CDATA[
		<a href="http://www.myeclipseide.com/ContentExpress-display-ceid-49.html">http://www.myeclipseide.com/ContentExpress-display-ceid-49.html</a>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/61849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:30 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Axis部署Web服务时的常见问题及其解决方法(转)</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61836.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61836.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61836.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61836.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<a href="http://www-900.ibm.com/developerWorks/cn/webservices/ws-axisfaq/index.shtml#author1">
								<font color="#002c99">刘红涛</font>
						</a> (<a href="mailto:redwaveht@hotmail.com"><font color="#002c99">redwaveht@hotmail.com</font></a>)<br /><br />2003 年 11 月</p>
				<blockquote>本文详细介绍了在Linux环境下以Apache Axis+ Resin作为Web服务平台部署Web服务时的常见问题及解决方法。衷心希望本文对Web服务的开发人员或对Web服务感兴趣的读者能起到一定的帮助作用。</blockquote>
				<p>
						<a name="1">
								<span class="atitle2">1 引言</span>
						</a>
						<br />随着Web服务技术的发展和成熟，其方便性和易用性已逐渐被人们所接受，越来越多的合作伙伴之间开始利用Web服务来实现合作方之间的数据接口。使用Apache Axis和Linux平台是一种低成本的Web服务解决方案，但Apache Axis文档的FAQ对开发者来说内容还不够丰富，本文作者将自己使用Axis时遇到的问题和解决方法整理成文，奉献给Web服务的开发人员和对此感兴趣的读者朋友，旨在帮助大家节约一些宝贵的时间。有关Web服务的基础知识，读者可以阅读参考文献中推荐的文档。作者未在文中介绍Apache和Resin的安装方法，读者可以参考相关网站的说明文档。 </p>
				<p>作者使用的软件环境如下。 </p>
				<p>操作系统：Red Hat Linux 7.2 </p>
				<p>Web服务器: Apache 1.3.27 </p>
				<p>应用服务器：Resin 2.1.8 ( <a href="http://www.caucho.com/"><font color="#002c99">http://www.caucho.com/</font></a> ) </p>
				<p>SOAP服务器：Apache Axis 1.1 </p>
				<p>XML解析器：Xerces 2.5.0，Xalan 2.5.1 </p>
				<p>JDK版本：JDK 1.4.1 </p>
				<p>
						<a name="2">
								<span class="atitle2">2 使用Axis时的常见问题及其解决方法</span>
						</a>
				</p>
				<p>2.1 Axis运行需要哪些jar文件 </p>
				<p>对Axis解包后，将axis-1_1/webapps/axis/WEB-INF/lib/目录下的jar文件复制到/usr/local/apache/htdocs/WEB-INF/lib目录下(Web应用程序的目录)。应包括以下jar文件。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
axis-ant.jar
axis.jar
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
log4j-1.2.8.jar
name.txt
saaj.jar
wsdl4j.jar
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>如果需要使用axis提供的测试页面，还要将axis-1_1/webapps/axis/目录下的文件复制到/usr/local/apache/htdocs/axis/目录下。应包括以下文件。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
EchoHeaders.jws
fingerprint.jsp
happyaxis.jsp
index.html
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<span class="atitle3">2.2 应该使用哪一种XML解析器</span>
				</p>
				<p>XML解析器选用不当，经常会导致使用Apache Axis时出现一些莫名其妙的问题。 </p>
				<p>由于Apache Axis 并未对Resin内置的xml解析器进行过测试，因此推荐读者使用已通过测试的Xerces xml解析器。可以从 <a href="http://xml.apache.org/xalan-j/index.html"><font color="#002c99">http://xml.apache.org/xalan-j/index.html</font></a> 处下载Xalan的Java版XSLT处理器，其中包含了Xerces的Java版XML解析器，不需要再单独下载xml解析器。 </p>
				<p>Xalan 2.5.1解包后，将bin/目录下的xercesImpl.jar、xml-apis.jar和xalan.jar复制到resin安装目录的lib/目录下，例如/usr/local/resin/lib。 </p>
				<p>编辑/etc/目录下的profile文件，找到设置CLASSPATH环境变量的位置，在其后加入下面的内容(B shell)。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
XMLPARSER=$RESIN_HOME/lib/xalan.jar:$RESIN_HOME/lib/xercesImpl.jar:$RESIN_HOME/lib/xml-apis.jar
export CLASSPATH=$XMLPARSER:$CLASSPATH
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.2.1 注意事项<br />如果CLASSPATH中包含其它的XML解析器设置，应将其从CLASSPATH环境变量的设置中去掉，以免发生冲突。 </p>
				<p>
						<span class="atitle3">2.3 如何在Resin中使用Xerces的XML解析器</span>
				</p>
				<p>通过修改resin.conf将resin的XmlParser置换为Xerces的XmlParser。在resin.conf对应的Web应用程序配置中加入以下设置。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;system-property javax.xml.transform.TransformerFactory=<br />            "org.apache.xalan.processor.TransformerFactoryImpl"/&gt;
&lt;system-property javax.xml.parsers.DocumentBuilderFactory=<br />            "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/&gt;
&lt;system-property javax.xml.parsers.SAXParserFactory=<br />            "org.apache.xerces.jaxp.SAXParserFactoryImpl"/&gt;
&lt;system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>配置完成后重新启动Resin。</p>
				<p>
						<span class="atitle3">2.4 如何排除XML解析器出现的异常</span>
				</p>
				<p>2.4.1 问题描述</p>
				<p>使用http://test.com/axis查看已部署的服务时出现Axis内部错，显示有关WSDD配置的异常信息。如果把WEB-INF目录下的server-config.wsdd删除，再查看就正常了，但只能看到AdminService和Version两个系统缺省的服务，后来部署的服务都看不到了。 </p>
				<p>2.4.2 原因分析</p>
				<p>Axis会在WEB应用程序的WEB-INF/目录下自动生成一个名字为server-config.wsdd的xml文件，其中记录了已部署的WEB服务。每部署一个新的WEB服务时，Axis都会将新服务的描述信息加入到server-config.wsdd中。 </p>
				<p>故障站点使用的XmlParser是resin内置的XmlParser，Axis并未对其对进行过兼容性测试，查看WEB服务信息时需要从server-config.wsdd(这是一个xml文件)取得已部署的WEB服务描述信息，当server-config.wsdd的内容较复杂时，resin内置的XmlParser因某种原因出现异常，导致Axis内部错误。Server-config.wsdd中记录的Web服务描述信息较少时不会出现异常。 </p>
				<p>2.4.3 解决方法 </p>
				<p>修改resin.conf，将resin的XmlParser置换为Xerces的XmlParser。置换方法参见2.3节。</p>
				<p>2.4.4 小结 </p>
				<p>如果Axis报告的错误中有关于xml解析器的错误，建议读者参照本小节描述的方法更换应用服务器的xml解析器，将会有助于问题的解决。 </p>
				<p>
						<span class="atitle3">2.5 如何将Axis集成到Resin或其它应用服务器</span>
				</p>
				<p>Axis是以Servlet的方式运行的，而Resin的作用相当于Servlets容器(Container)，因此只要配置得当，就可以使Axis在Resin环境中运行，这一点也适用于Resin以外的其它应用服务器。在Resin中配置Axis的方法如下。 </p>
				<p>将axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置项复制到resin.conf中对应的Web应用程序配置中。通常应包括以下内容。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
	&lt;!-- Axis Web-Service Configuration Start --&gt;
		&lt;servlet&gt;
		  &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		  &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;
		  &lt;servlet-class&gt;
		      org.apache.axis.transport.http.AxisServlet
		  &lt;/servlet-class&gt;
		&lt;/servlet&gt;

		&lt;servlet&gt;
		  &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
		  &lt;display-name&gt;Axis Admin Servlet&lt;/display-name&gt;
		  &lt;servlet-class&gt;
		      org.apache.axis.transport.http.AdminServlet
		  &lt;/servlet-class&gt;
		  &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
		&lt;/servlet&gt;

		&lt;servlet&gt;
		  &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
		  &lt;display-name&gt;SOAPMonitorService&lt;/display-name&gt;
		  &lt;servlet-class&gt;
		      org.apache.axis.monitor.SOAPMonitorService
		  &lt;/servlet-class&gt;
		  &lt;init-param&gt;
		    &lt;param-name&gt;SOAPMonitorPort&lt;/param-name&gt;
		    &lt;param-value&gt;5001&lt;/param-value&gt;
		  &lt;/init-param&gt;
		  &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
		&lt;/servlet&gt;

		&lt;servlet-mapping&gt;
		  &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		  &lt;url-pattern&gt;/axis/servlet/AxisServlet&lt;/url-pattern&gt;
		&lt;/servlet-mapping&gt;

		&lt;servlet-mapping&gt;
		  &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		  &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
		&lt;/servlet-mapping&gt;

		&lt;servlet-mapping&gt;
		  &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		  &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
		&lt;/servlet-mapping&gt;

		&lt;servlet-mapping&gt;
		  &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
		  &lt;url-pattern&gt;/SOAPMonitor&lt;/url-pattern&gt;
		&lt;/servlet-mapping&gt;

		&lt;!-- uncomment this if you want the admin servlet --&gt;
	&lt;!--	
		 &lt;servlet-mapping&gt;
		   &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
		   &lt;url-pattern&gt;/axis/servlet/AdminServlet&lt;/url-pattern&gt;
		 &lt;/servlet-mapping&gt;
	--&gt;	
		&lt;!-- currently the W3C havent settled on a media type for WSDL;
		  http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
		  for now we go with the basic 'it's XML' response --&gt;
		&lt;mime-mapping&gt;
		  &lt;extension&gt;wsdl&lt;/extension&gt;
		   &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
		&lt;/mime-mapping&gt;

		&lt;mime-mapping&gt;
		  &lt;extension&gt;xsd&lt;/extension&gt;
		  &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
		&lt;/mime-mapping&gt;

	  &lt;!-- Axis Web-Service Configuration End --&gt;	
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<span class="atitle3">2.6 Axis提供了哪些开发工具</span>
				</p>
				<p>Apache Axis提供了WSDL2Java和Java2WSDL两个开发工具。 </p>
				<p>WSDL2Java利用已知的WSDL文件生成服务端和客户端代码。该WSDL文件可以是由合作伙伴提供的，也可以是利用Java2WSDL生成的。Java2WSDL根据已有的Java类文件生成WSDL文件，Java类文件可以是接口类文件，并不需要实现细节。 </p>
				<p>此外Axis还提供了SoapMonitorApplet和TCPMon工具，可用于监测Web服务。 </p>
				<p>
						<span class="atitle3">2.7 如何生成Web服务的服务端和客户端代码</span>
				</p>
				<p>2.7.1 生成或取得WSDL文件</p>
				<p>Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成，例如下面的接口文件SoftwarePrice.java。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
package samples.userguide.example6;
/**
 * Interface describing a web service to set and get software prices.
 **/
public interface SoftwarePrice {
    public void setWidgetPrice(String softWareName, String price);
    public String getWidgetPrice(String softWareName);
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>编译SoftwarePrice.java。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
javac SoftwarePrice.java
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>将SoftwarePrice.class复制到正确的package路径下。 </p>
				<p>执行下面的命令: </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl <br />      -l"http://test.com:80/services/SoftwarePrice" <br />      -n "urn:SoftwarePrice" -p"samples.userguide.example6" "urn:Example6" <br />         samples.userguide.example6.SoftwarePrice
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>各参数的含义如下。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
-o：指定输出的WSDL文件的文件名。<br />
-l：指定服务的位置。<br />
-n：WSDL文件的目标名字空间。<br />
-p：指定从package到名字空间的映射，这里可以有多个映射。<br /></code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>最后面的类文件包含了Web服务的接口。 </p>
				<p>该命令执行后，将生成sp.wsdl文件。 </p>
				<p>如果按CLASSPATH的设置找不到指定的类文件，Axis将报告异常，如下所示。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
        at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
        at java.security.AccessController.doPrivileged(Native Method)
		……
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>如果出现上面的问题，请检查是否已将有关类文件复制到正确的位置或CLASSPATH设置是否正确。 </p>
				<p>生成WSDL文件以后，就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了。 </p>
				<p>2.7.1.1 注意事项 </p>
				<p>WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者，开发者只要按照既定的WSDL文件生成客户端或服务端代码就可以了。 </p>
				<p>2.7.2 生成客户端或服务端代码 </p>
				<p>WSDL2Java工具用于从WSDL文件生成客户端存根（stub）代码，服务端框架（skeleton）代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码，因此该工具极大地减轻了开发人员的编码负担。WSDL2Java的使用举例如下。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true MyService.wsdl
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>执行上述命令后将生成下列文件。 </p>
				<p>
				</p>
				<table cellspacing="0" bordercolordark="#000000" cellpadding="5" width="90%" align="center" bordercolorlight="#ffffff" border="1">
						<tbody>
								<tr>
										<td width="20%">No.</td>
										<td width="40%">文件</td>
										<td width="40%">用途</td>
								</tr>
								<tr>
										<td>1.</td>
										<td>deploy.wsdd</td>
										<td>MyService服务的部署描述文件</td>
								</tr>
								<tr>
										<td>2.</td>
										<td>MyService.java</td>
										<td>MyService服务的接口文件</td>
								</tr>
								<tr>
										<td>3.</td>
										<td>MyServiceService.java</td>
										<td>获得MyService服务的接口文件</td>
								</tr>
								<tr>
										<td>4.</td>
										<td>MyServiceServiceLocator.java</td>
										<td>实现MyServiceService接口</td>
								</tr>
								<tr>
										<td>5.</td>
										<td>MyServiceSoapBindingImpl.java</td>
										<td>实现MyService接口，应向其中补充业务逻辑</td>
								</tr>
								<tr>
										<td>6.</td>
										<td>MyServiceSoapBindingSkeleton.java</td>
										<td>MyService服务的服务端框架代码,实现MyService, org.apache.axis.wsdl.Skeleton接口</td>
								</tr>
								<tr>
										<td>7.</td>
										<td>MyServiceSoapBindingStub.java</td>
										<td>MyService服务的客户端存根代码,实现MyService接口</td>
								</tr>
								<tr>
										<td>8.</td>
										<td>undeploy.wsdd</td>
										<td>注销MyService服务的部署描述文件</td>
								</tr>
						</tbody>
				</table>
				<p>2.7.3 编写Web服务客户端代码</p>
				<p>Web服务的客户端程序完成对Web服务的调用，其程序结构如下。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空间;
public class TestClient {
    public static void main (String[] args) throws Exception
    {
	com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = <br />                                     new  SPInterfaceForVNetLocator();//获得一个locator对象
	locator.setMaintainSession(true);
	com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = <br />                                     locator.getSPInterfaceForVNetSoap();//获得服务对象
	com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
	//初始化Web服务中定义的数据类型
         try {
	   feedbackRes =  service.generalLedgerFeedback();//调用Web服务的方法并取得返回值
	   System.out.println("FeedbackResult :");
	   if(feedbackRes != null)
	   {
	        System.out.println("SPID: " +feedbackRes.getSPID());
	        System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
	        System.out.println("result: " +feedbackRes.getResult());
	   }else
	   {
	   System.out.println("feedbackRes is null!");
	}
        } catch (java.rmi.RemoteException re) {
        //throw new junit.framework.AssertionFailedError("Remote Exception caught: "+re );
 	re.printStackTrace();
     }
}//End of main()
}//End of TestClient class
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>测试客户端程序是非常简单的，将客户端程序编译后，执行"java TestClient"即可。</p>
				<p>
						<span class="atitle3">2.8 如何编写服务端代码</span>
				</p>
				<p>向MyServiceSoapBindingImpl.java添加相关的业务逻辑代码后，将WSDL2Java生成的源程序编译，打包成jar文件，复制到/usr/local/apache/htdocs/WEB-INF/lib/目录下。 </p>
				<p>
						<span class="atitle3">2.9 如何发布Web服务</span>
				</p>
				<p>有了deploy.wsdd文件并准备好类文件后，就可以发布MyService服务了。Axis在安装后自动发布了AdminService，利用它可以发布新的Web服务。方法如下。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient <br />                                 -lhttp://localhost:80/services/AdminService deploy.wsdd
上面的命令执行后，有如下提示。
Processing file deploy.wsdd
&lt;Admin&gt;Done processing&lt;/Admin&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<span class="atitle3">2.10 执行WSDL2Java时报告" 类型被引用但未定义"</span>
				</p>
				<p>2.10.1 问题描述</p>
				<p>执行WSDL2Java时报告下面的异常：</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java.io.IOException: Type {http://schemas.xmlsoap.org/wsdl/} <br />                                    ArrayOfFailedRecord is referenced but not defined.
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.10.2 原因分析</p>
				<p>出现上述情况可能的原因有：</p>
				<p>类型未定义就被引用。</p>
				<p>使用了错误的名字空间。 </p>
				<p>WSDL文件中存在输入错误。 </p>
				<p>2.10.3 解决方法</p>
				<p>经过仔细检查发现wsdl文件中的</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;s:element minOccurs="0" maxOccurs="1" name="FailedRecords" <br />                                                         type="s0:ArrayOfFailedRecord" /&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>的type=" s0:ArrayOfFailedRecord"中的s0:前面有一个空格，将空格删除后问题解决了。</p>
				<p>2.10.4 小结</p>
				<p>WSDL文件中出现的编辑错误有可能导致执行WSDL2Java时出现"类型被引用但未定义"错误。</p>
				<p>
						<span class="atitle3">2.11 server-config.wsdd的作用是什么</span>
				</p>
				<p>server-config.wsdd记录了axis已发布的Web服务的描述信息。</p>
				<p>2.12 发布Web服务时报告"Exception:: (404)Not Found"</p>
				<p>2.12.1 问题描述</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
执行java org.apache.axis.client.AdminClient <br />        -lhttp://localhost:80/services/AdminService deploy.wsdd命令发布WEB服务时报告如下内容。
Processing file deploy.wsdd
Exception:: (404)Not Found
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>Apache的access_log显示如下。</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
127.0.0.1 - - [17/Sep/2003:15:56:33 +0800] "POST /services/AdminService HTTP/1.0" 404 293
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.12.2 原因分析</p>
				<p>出现这个问题的比较简单的原因可能是端口不对，或URL路径不对(例如路径中多写了目录)，Axis的SoapMonitor服务按指定的端口或URL找不到AdminService，需要检查正确的端口号和URL路径。 </p>
				<p>比较深层次的原因就复杂得多了。</p>
				<p>本文作者遇到的是下面的情况。 </p>
				<p>AdminService是一个已发布的WEB服务。 </p>
				<p>AdminClient使用soap协议同AdminService通信，需要按指定的端口和URL定位AdminService，而原来使用的resin.conf中，有两个web-app配置项，配置A的摘要如下所示。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;host id=' '&gt;
      &lt;app-dir&gt;/usr/local/apache/htdocs/&lt;/app-dir&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>配置B的摘要如下所示。</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;host id='test.com'&gt;
      &lt;app-dir&gt;/usr/local/apache/htdocs/esales/&lt;/app-dir&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>Axis的有关配置在配置B中。</p>
				<p>Httpd.conf中的DocumentRoot是/usr/local/apache/htdocs/。</p>
				<p>使用java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd发布WEB服务时，需要按http协议解析url: //localhost:80/services/AdminService。由于htdocs/目录下并没有services/目录(services是Axis在resin.conf中的servlet-mapping)，因此应用服务器按resin.conf中的配置去定位AdminService ，因为url的主机名为localhost，因此resin不会到&lt;host id='test.com'&gt;(配置B)中去定位url，而是到配置A中去定位，在配置A中并没有Axis的配置，找不到与AdminService相关的url，因此报告了前面描述的异常情况。 </p>
				<p>2.12.3 解决方法</p>
				<p>知道了原因后，按如下方法就可以解决了。</p>
				<p>将配置B中全部关于Axis的配置移到配置A中，注意相应地要改变/etc/profile中的CLASSPATH变量的值。 </p>
				<p>保存resin.conf后，重新登录服务器(使新的CLASSPATH生效)，重新启动resin。再次发布WEB服务。 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient <br />                           -lhttp://localhost:80/services/AdminService deploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>屏幕显示如下。 
</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
Processing file deploy.wsdd
&lt;Admin&gt;Done processing&lt;/Admin&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>WEB服务终于发布成功了。 </p>
				<p>在发布成功的情况下apache的access_log中会看到如下的log： </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
tail -f access_log|grep vice  
127.0.0.1 - - [17/Sep/2003:16:05:00 +0800] <br />                             "POST /services/AdminService HTTP/1.0" 200 296 "-" "Axis/1.1"
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.12.4 小结</p>
				<p>本小节描述的问题可能是读者遇到的出现最多的异常，但原因并不是唯一的。遇到该问题时，建议读者冷静分析出现问题的可能原因，多实验几种解决方法，最终一定可以成功！ </p>
				<p>
						<span class="atitle3">2.13 如何监测SOAP请求和响应流</span>
				</p>
				<p>2.13.1 引言 </p>
				<p>发布了Web服务以后，如何观察请求和响应数据呢？记录运行日志是一种传统且有效的方法，但对于调试程序来讲还不够方便和直观。值得欣慰的是，Axis为我们提供了在客户端观察SOAP请求和响应流数据的工具SoapMonitor，经过适当配置后，可以实时地观察到Web服务的SOAP请求和响应数据。SoapMonitor是一个Java Applet程序，通过浏览器下载到客户端运行。下面就介绍SoapMonitor的配置和使用方法。 </p>
				<p>2.13.2 准备SOAPMonitor 小应用程序</p>
				<p>在Axis 1.1中，没有为我们编译SOAPMonitor.java程序，但我们可以在axis-1_1/webapps/axis/目录下找到名字为SOAPMonitorApplet.java的源程序文件，自己进行编译。该程序编译后，会生成如下的类文件： </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
SOAPMonitorApplet.class
SOAPMonitorApplet$ServiceFilterPanel.class
SOAPMonitorApplet$SOAPMonitorData.class
SOAPMonitorApplet$SOAPMonitorFilter.class
SOAPMonitorApplet$SOAPMonitorPage.class
SOAPMonitorApplet$SOAPMonitorTableModel.class
SOAPMonitorApplet$SOAPMonitorTextArea.class
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>读者需要把上述类文件复制到自己的Web应用程序目录下，本例中是/usr/local/apache/htdocs/目录。 </p>
				<p>在浏览器地址样中输入SOAPMonitor的地址，例如 <a href="http://test.com/SOAPMonitor"><font color="#002c99">http://test.com/SOAPMonitor</font></a> ，浏览器会提示用户正在下载Applet程序，下载完毕后，读者可以在浏览器窗口中看到如图4-1所示的用户界面。如果上述类文件的位置不正确，浏览器会报告"找不到类"的错误。此时应检查是否已将上述类文件复制到正确的目录下。 </p>
				<p align="center">
						<img src="http://www-900.ibm.com/developerWorks/cn/webservices/ws-axisfaq/image01.gif" border="0" />
				</p>
				<p align="center">
						<b>图 2-1 SOAPMonitor的界面</b>
				</p>
				<p>2.13.3 发布SOAPMonitor服务</p>
				<p>图2-1所示的SOAPMonitor界面出现后，并不意味着就可以观察到Web服务的SOAP请求流与响应流了，首先需要发布SOAPMonitorService。该Web服务是由Axis提供的，但需要由用户自己进行发布，方法如下。 </p>
				<p>获得SOAPMonitor服务的WSDD文件deploy.wsdd，内容如下(也可到 <a href="http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html"><font color="#002c99">http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html</font></a> 复制该文件)： </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt; 
  
  &lt;handler name="soapmonitor" 
      type="java:org.apache.axis.handlers.SOAPMonitorHandler"&gt; 
    &lt;parameter name="wsdlURL" 
      value="/axis/SOAPMonitorService-impl.wsdl"/&gt; 
    &lt;parameter name="namespace" 
      value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/&gt; 
    &lt;parameter name="serviceName" value="SOAPMonitorService"/&gt; 
    &lt;parameter name="portName" value="Demo"/&gt; 
  &lt;/handler&gt; 
  
  &lt;service name="SOAPMonitorService" provider="java:RPC"&gt; 
    &lt;parameter name="allowedMethods" value="publishMessage"/&gt; 
    &lt;parameter name="className" 
      value="/blog/org.apache.axis.monitor.SOAPMonitorService"/&gt; 
    &lt;parameter name="scope" value="Application"/&gt; 
  &lt;/service&gt; 
&lt;/deployment&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>发布SOAPMonitor服务：</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient <br />                                   -lhttp://localhost:80/services/AdminService deploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.13.4 修改deploy.wsdd</p>
				<p>发布SOAPMonitor服务后，还要对被监测的Web服务进行配置。方法是先注销该Web服务，然后修改该服务对应的WSDD文件，在其中增加请求流和响应流的配置，否则是观测不到SOAP请求和响应流的。 </p>
				<p>注销Web服务的方法如下。 </p>
				<p>进入该Web服务的undeploy.wsdd文件所在的目录，执行 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
Java org.apache.axis.client.AdminClient <br />                              -lhttp://localhost:80/services/AdminService undeploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>修改WSDD文件的方法如下。 </p>
				<p>以Axis提供的MyService为例，对MyService的WSDD文件做如下修改。 </p>
				<p>修改前: </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
... 
 &lt;service name="MyService" provider="java:RPC"&gt; 
  &lt;parameter name="className" value="/blog/samples.userguide.example3.MyService"/&gt; 
  &lt;parameter name="allowedMethods" value="*"/&gt; 
  ... 
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>修改后: (有下划线的行是新加入的内容)</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
... 
 &lt;service name="MyService" provider="java:RPC"&gt; 
    &lt;requestFlow&gt; 
        &lt;handler type="soapmonitor"/&gt; 
    &lt;/requestFlow&gt; 
    &lt;responseFlow&gt; 
        &lt;handler type="soapmonitor"/&gt; 
    &lt;/responseFlow&gt; 
  &lt;parameter name="className" value="/blog/samples.userguide.example3.MyService"/&gt; 
  &lt;parameter name="allowedMethods" value="*"/&gt; 
  ... 
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>修改WSDD文件后，重新发布MyService服务：</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient <br />                                 -lhttp://localhost:80/services/AdminService deploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2.13.5 启动SOAPMonitor小应用程序</p>
				<p>按2.13.2节介绍的方法启动SOAPMonitor小应用程序。</p>
				<p>使用客户端程序测试MyService服务： </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
#  java samples.userguide.example3.Client <br />                                       -lhttp://vnet.sohu.com/services/MyService "test"
结果为：You typed : test
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>注意，一定要先启动SOAPMonitor小应用程序，后调用Web服务才能观察到SOAP请求和响应流。</p>
				<p>2.13.6 观察SOAP请求和响应流</p>
				<p>
				</p>
				<p>这时在SoapMonitorApplet的窗口中可以观察到SOAP和请求和响应消息，如图2-2所示。 </p>
				<p align="center">
						<img src="http://www-900.ibm.com/developerWorks/cn/webservices/ws-axisfaq/image02.gif" border="0" />
				</p>
				<p align="center">
						<b>图2-2 MyService的Soap请求和响应流</b>
				</p>
				<p>
						<span class="atitle3">2.14 使用客户端程序测试Web服务时报告"Exception:: (404)Not Found"</span>
				</p>
				<p>2.14.1 问题描述</p>
				<p>WEB服务接口编写完成并发布后，客户端测试程序收不到WEB服务的返回结果，Apache或Resin的log中也看不到访问记录。但测试程序返回结果为0(成功)，在没有部署该WEB服务的情况下，也是这个结果，因此怀疑调用的是WSDL文件的提供者自己测试用的WEB服务接口，可能与另一方提供的WSDL文件有关。 </p>
				<p>2.14.2 原因分析</p>
				<p>合作伙伴调用WEB服务就能够成功，从WEB服务主机自己的客户端调用就接收不到数据，估计与合作伙伴提供的WSDL文件有关，该WSDL文件影响了WSDL2Java生成的客户端stub代码。检查stub代码，发现其soapAction都指向了合作伙伴的测试地址。 </p>
				<p>2.14.3 解决方法</p>
				<p>修改stub代码中的soapAction，改为sp(Service Provider)自己的WEB服务URL。重新编译程序并发布Web服务，问题解决。 </p>
				<p>_call.setSOAPActionURI("sp自己的Web服务地址"); </p>
				<p>2.14.4 小结</p>
				<p>本小节描述的问题出现于Web服务提供方按合作伙伴统一提供的WSDL文件生成客户端代码的情况。遇到这类问题，读者可直接检查WSDL2Java自动生成的代码的有关部分。 </p>
				<p>在WSDL文件中可以看到与下列内容相似的设置。</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
&lt;wsdl:service name="SPInterfaceForVNet"&gt;
 &lt;wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap"&gt;
  &lt;wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" /&gt; 
  &lt;/wsdl:port&gt;
  &lt;/wsdl:service&gt;
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其中<?XML:NAMESPACE PREFIX = WSDLSOAP /?><wsdlsoap:address location="http://test.com/services/SPInterfaceSoap"></wsdlsoap:address>即为已发布的WEB服务的URL，供客户端调用。 </p>
				<p>
						<span class="atitle3">2.15 如何列出已发布的Web服务</span>
				</p>
				<p>使用下面的命令： </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/  list
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>实际上该命令的输出就是server-config.wsdd文件的内容。 </p>
				<p>
						<span class="atitle3">2.16 发布Web服务时报告"调用目标异常"</span>
				</p>
				<p>2.16.1 问题描述 </p>
				<p>在部署WEB服务时报告：java.lang.reflect.InvocationTargetException异常。 </p>
				<p>2.16.2 原因分析 </p>
				<p>在WSDL文件中自定义的名字空间与Axis的services名字空间冲突。 </p>
				<p>2.16.3 解决方法 </p>
				<p>修改WSDL文件，将services改为别的名字。 </p>
				<p>
						<span class="atitle3">2.17 WSDL文件中的targetNamespace的作用是什么</span>
				</p>
				<p>TargetNamespace指明目标名字空间，用于验证xml文档。 </p>
				<p>在WSDL文件中，&lt;definitions&gt;中的targetNamespace与&lt;types&gt;中的targetNamespace应保持一致。 </p>
				<p>
						<span class="atitle3">2.18 Web服务部署成功但检测不到</span>
				</p>
				<p>2.19 客户端程序找不到可用的Web服务</p>
				<p>2.19.1 问题描述</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
执行 
java org.apache.axis.client.AdminClient <br />                                 -lhttp://localhost:80/services/AdminService deploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>时显示&lt;Admin&gt;Done processing&lt;/Admin&gt;，却检查不到新的服务，在WEB-INF/目录下的server-config.wsdd文件中也看不到相应的配置项。 </p>
				<p>2.19.2 原因分析</p>
				<p>新的WEB服务的类文件没有重新编译并复制到正确的位置。 </p>
				<p>2.19.3 解决方法</p>
				<p>WEB服务的类文件可以打包为jar文件。在CLASSPATH环境变量中正确设置jar文件的路径。例如：</p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
jar cvf  SPInterfaceSoap.jar com/zx/service/v1_0/*.class
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>将SPInterfaceSoap.jar复制到WEB-INF/lib/目录下，重新发布WEB服务。 </p>
				<p>
						<span class="atitle3">2.20 如何排除原因不明的错误</span>
				</p>
				<p>有时，在对WEB服务执行客户端测试时会出现慕名其妙的错误。为保证环境是正确的，可以按下面的步骤排除原因不明的错误。 </p>
				<p>1. Undeploy被测试的服务 </p>
				<p>
				</p>
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code>
java org.apache.axis.client.AdminClient <br />                                 -lhttp://localhost:80/services/AdminService undeploy.wsdd
</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<p>2. 重新启动resin: /usr/local/resin/bin/httpd.sh restart(如果是其它的应用服务器，请按相应的方法重新启动) </p>
				<p>3. 重新发布WEB服务 </p>
				<p>4. 进行测试 </p>
				<p>
						<a name="3">
								<span class="atitle2">3 小结</span>
						</a>
						<br />目前有很多可以使用的应用服务器和Web服务平台软件，本文仅以Apache Axis和Resin为例介绍了在部署Web服务的过程中可能遇到的问题及其解决方法，其中并未讨论Web服务的安全性问题。对于如何高效地开发和部署Web服务以及如何确保Web服务的安全性，还希望对此感兴趣的读者共同参与讨论，对于文中存在的错误和不足之处也希望读者朋友们能够不吝批评指正。 </p>
		</div>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/61836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:09 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现安全的AXIS Web服务，第2部分(转)</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61835.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61835.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61835.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61835.html</trackback:ping><description><![CDATA[
		<div class="postText">高级软件工程师<br />2004 年 8 月 
<blockquote>本文将首先简单介绍Web 服务安全性相关技术和开发工具，然后介绍了使用WSSecurity工具SOAP消息进行签名和验证的方法；接下来深入讨论了使用现成的WS-Security工具，结合Handler模型开发一个axis下实现WS-Security的通用应用框架。</blockquote><p>本文是J2EE Web服务开发系列文章的第十三篇，本文将首先简单介绍Web 服务安全性相关技术和开发工具，然后介绍了使用WSSecurity工具SOAP消息进行签名和验证的方法；接下来深入讨论了使用现成的WS-Security工具，结合Handler模型开发一个axis下实现WS-Security的通用应用框架。</p><p>阅读本文前您需要以下的知识和工具：</p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><li>Apache axis1.1，并且会初步使用； 
</li><li>Tomcat 5.0.16以上, 并且会初步使用； 
</li><li>SOAP消息（SOAP Message）编程知识； 
</li><li>Java安全编程基础知识； 
</li><li>JAX-RPC编程基础知识； 
</li><li>Servlet的开发经验； 
</li><li>Sun提供的JAX-RPC参考实现（jaxrpc-impl.jar，在J2EESDK1.4或者JWSDP1.4中可找到）； 
</li><li>一个JSSE安全提供者（如ISNetworks）； 
</li><li>Trust Services Integration Kit，可在http://www.xmltrustcenter.org上获得。 </li></ul><p>本文的参考资料见 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis2/#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><font color="#002c99">参考资料</font></a>。 </p><p>本文的全部代码在这里 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis2/src.rar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><font color="#002c99">下载</font></a>。 </p><p><a name="N10075"><span class="atitle2">Web 服务安全性相关技术和开发工具</span></a><br />Web 服务安全性规范是一套可以帮助 Web 服务开发者保证 SOAP 消息交换的安全的机制。WS-Security 特别描述了对现有的 SOAP 消息传递的增强，从而通过对 SOAP 消息应用消息完整性、消息机密性和单消息认证提供了保护级别。这些基本机制可以通过各种方式联合，以适应构建使用多种加密技术的多种安全性模型。</p><p>围绕Web服务的安全，有很多相关的技术，比如WS-Security，WS-Trace等，另外，还有以下相关技术：</p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><li>XML Digital Signature（XML数字签名） 
</li><li>XML Encryption （XML加密） 
</li><li>XKMS (XML Key Management Specification) 
</li><li>XACML (eXtensible Access Control Markup Language) 
</li><li>SAML (Secure Assertion Markup Language) 
</li><li>ebXML Message Service Security 
</li><li>Identity Management &amp; Liberty Project </li></ul><p>由于本文是一个实例性文章，故不对WS-Security做详细的探讨，你可以在develperWorks Web 服务安全专题找到许多相关资料（见参考资料）。</p><p>Trust Services Integration Kit提供了一个WS-Security实现。你可以从http://www.xmltrustcenter.org获得相关库文件，分别是wssecurity.jar和tsik.jar。wssecurity.jar中包含一个WSSecurity类，可以使用它来对XML进行数字签名和验证，加密与解密。</p><p>下面我们使用WS-Security来对SOAP消息进行数字签名，然后再进行验证。</p><p><a name="N100A2"><span class="atitle2">SOAP消息的签名和验证</span></a><br /></p><p><a name="N100A8"><span class="atitle3">使用WSSecurity对SOAP消息数字签名</span></a><br />在对SOAP消息进行签名前，首先生成一个keystore。keystore包含了进行数字签名所需要的身份信息。通过以下批处理脚本来创建keystore：</p><a name="N100B1"><b>例程1 创建keystore（server.keystore）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
set SERVER_DN="CN=hellking-Server, OU=huayuan, O=huayuan, L=BEIJINGC, S=BEIJING, C=CN"
set KS_PASS=-storepass changeit
set KS_TYPE=-storetype JKS
set KEYINFO=-keyalg RSA
#生成服务器端keystore。
keytool -genkey -dname %SERVER_DN% %KS_PASS% %KS_TYPE% -keystore 
server.keystore %KEYINFO% -keypass changeit
</code></pre></td></tr></tbody></table><p>SignAndVerifySoap类中包含了一个对XML进行签名的方法，它就是sign（），这个方法将对SOAP消息进行签名，然后输出和WS-Security兼容的SOAP消息。下面我们看具体代码。</p><a name="N100BE"><b>例程2 对SOAP消息签名</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
	package com.hellking.study.webservice;
import com.verisign.messaging.WSSecurity;
...
public class SignAndVerifySoap {
	
	final String KEY_STORE = "server.keystore";
    final String SOTE_PASS = "changeit";
    final String KEY_ALIAS="mykey";
    final String TARGET_FILE="signed.xml";//签名后的SOAP消息
    final String SOURE_FILE="source.xml";//签名前的SOAP消息
    final String KEY_TYPE="JKS";
	
	/**
	 *对xml进行签名
	 */
	public void sign()
	{	

		try
		{
			System.out.println("开始对SOAP消息进行签名，使用的密匙库：" + KEY_STORE + "\n");
		
		// 获得私有key和相关证书，请参考JAVA安全编程相关书籍
		FileInputStream fileInputStream = new FileInputStream(KEY_STORE);
		System.out.println(java.security.KeyStore.getDefaultType());
		java.security.KeyStore store = java.security.KeyStore.getInstance(KEY_TYPE);
		store.load(fileInputStream, SOTE_PASS.toCharArray());
		PrivateKey key = (PrivateKey)store.getKey(KEY_ALIAS, SOTE_PASS.toCharArray());
		X509Certificate certification = (X509Certificate)store.getCertificate(KEY_ALIAS);

		// 读取XML源文件到文档中
		Document source = readFile(SOURE_FILE);
		SigningKey signingKey = SigningKeyFactory.makeSigningKey(key);
		KeyInfo keyInfo = new KeyInfo();
		keyInfo.setCertificate(certification);

		WSSecurity wsSecurity = new WSSecurity();

		wsSecurity.setPreferredNamespace("http://schemas.xmlsoap.org/ws/2003/06/secext");
		//对SOAP消息进行签名
		wsSecurity.sign(source, signingKey, keyInfo);
		// 保存签名后的SOAP消息	
		writeFile(source, new FileOutputStream(TARGET_FILE));
		System.out.println("把签名后的文件写入： " + TARGET_FILE + "，请查看结果！");
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}		
	}
	</code></pre></td></tr></tbody></table><p>在执行此程序前，请把wssecurity.jar、source.xml和tsik.jar设置到类路径环境变量中。签名前的SOAP为：</p><a name="N100CB"><b>例程3 签名前的SOAP消息（source.xml）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;soapenv:Body&gt;
  &lt;ns1:getTax soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://hellking.webservices.com/"&gt;
   &lt;op1 xsi:type="xsd:double"&gt;5000.0&lt;/op1&gt;
  &lt;/ns1:getTax&gt;
 &lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;
</code></pre></td></tr></tbody></table><p>签名后的SOAP消息如例程4所示。</p><a name="N100D8"><b>例程4 签名后的SOAP消息（signed.xml）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;soapenv:Header&gt;
&lt;wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2003/06/secext"&gt;
&lt;wsse:BinarySecurityToken EncodingType="wsse:Base64Binary" 
ValueType="wsse:X509v3" wsu:Id="wsse-ee805a80-cd95-11d8-9cf9-fd6213c0f8be" 
xmlns:wsu="http://schemas.xmlsoap.org/ws/2003/06/utility"&gt;MIICUjCCAbsCBEDB0GIwDQYJKoZIhvcNAQE…VkTkPw==
&lt;/wsse:BinarySecurityToken&gt;
&lt;ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"&gt;
&lt;ds:SignedInfo&gt;
&lt;ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/&gt;
&lt;ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/&gt;
&lt;ds:Reference URI="#wsse-ee5308f0-cd95-11d8-9cf9-fd6213c0f8be"&gt;
&lt;ds:Transforms&gt;&lt;ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/&gt;
&lt;/ds:Transforms&gt;&lt;ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/&gt;
&lt;ds:DigestValue&gt;ZjRVnI2g7kcX0h9r4JtiltpYQPA=&lt;/ds:DigestValue&gt;&lt;/ds:Reference&gt;
&lt;ds:Reference URI="#wsse-ee4e4e00-cd95-11d8-9cf9-fd6213c0f8be"&gt;
&lt;ds:Transforms&gt;&lt;ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/&gt;
&lt;/ds:Transforms&gt;&lt;ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/&gt;
&lt;ds:DigestValue&gt;moZ0d+8mH1kfNw0VEK39V0Td9EM=&lt;/ds:DigestValue&gt;
&lt;/ds:Reference&gt;
&lt;/ds:SignedInfo&gt;
&lt;ds:SignatureValue&gt;fPpYrf0uNP8W2XVVIQNc3OQt2Wn90M/0uJ0dDZTNRR0NxBBBX36wSXt7NfI5Fmh4ru44Wk34EGI7mqMAE5O0
/wtIlFRJt3zAvA6k3nhgcYj6tn/9kZwwxh1RkFTfTX9xdQ6Xn+P6m+YBm1YEEcTWkJd7XcxdyDEns2kYOhONx1U=
&lt;/ds:SignatureValue&gt;
&lt;ds:KeyInfo&gt;&lt;wsse:SecurityTokenReference&gt;
&lt;wsse:Reference URI="#wsse-ee805a80-cd95-11d8-9cf9-fd6213c0f8be"/&gt;
&lt;/wsse:SecurityTokenReference&gt;
&lt;/ds:KeyInfo&gt;
&lt;/ds:Signature&gt;&lt;/wsse:Security&gt;
&lt;wsu:Timestamp xmlns:wsu="http://schemas.xmlsoap.org/ws/2003/06/utility"&gt;
&lt;wsu:Created wsu:Id="wsse-ee4e4e00-cd95-11d8-9cf9-fd6213c0f8be"&gt;2004-07-04T08:41:23Z&lt;/wsu:Created&gt;
&lt;/wsu:Timestamp&gt;&lt;/soapenv:Header&gt;
&lt;soapenv:Body wsu:Id="wsse-ee5308f0-cd95-11d8-9cf9-fd6213c0f8be" 
	xmlns:wsu="http://schemas.xmlsoap.org/ws/2003/06/utility"&gt;
  &lt;ns1:getTax soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
  	xmlns:ns1="http://hellking.webservices.com/"&gt;
   &lt;op1 xsi:type="xsd:double"&gt;5000.0&lt;/op1&gt;
  &lt;/ns1:getTax&gt;
 &lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;
</code></pre></td></tr></tbody></table><p>签名后的SOAP消息中，头部包含了签名信息以及验证SOAP消息所需要的key。&lt;SignedInfo&gt; &lt;/SignedInfo&gt; 描述了已签署的消息内容。&lt;SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/&gt; 指出了签名算法（Signature Method Algorithm）。这个算法被用来将规范算法的输出转换成签名值（Signature Value）。Key Info 元素包含的部分就是数字证书本身。</p><p><a name="N100E5"><span class="atitle3">对签名的SOAP消息进行验证</span></a><br />对SOAP消息进行验证就是使用keystore的信息生成TrustVerifier对象，然后调用WSSecurity的verify方法进行验证。</p><a name="N100EE"><b>例程5 验证签名后的SOAP消息</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
	/**
	 *验证已经签名的SOAP消息
	 */
	public void verify()
	{
		try
		{
			System.out.println("开始检验SOAP消息，使用的密匙库：" + KEY_STORE + "\n");
		
		// 获得私有key和相关证书，请参考JAVA安全编程相关书籍
		FileInputStream fileInputStream = new FileInputStream(KEY_STORE);

		java.security.KeyStore store = java.security.KeyStore.getInstance(KEY_TYPE);
		store.load(fileInputStream, SOTE_PASS.toCharArray());
	
		// 读取XML源文件到文档中
		Document source = readFile(TARGET_FILE);
		org.xmltrustcenter.verifier.TrustVerifier verifier =
            new org.xmltrustcenter.verifier.X509TrustVerifier(store);

		WSSecurity wsSecurity = new WSSecurity();

        com.verisign.messaging.MessageValidity[] resa =
     wsSecurity.verify(source,verifier,null,null);
       System.out.println("检验结果：");
	   for (int len = 0; len &lt; resa.length; len++){
      System.out.println("result[" + len + "] = " + (resa[len].isValid()?"验证通过":"验证不通过"));
    }
    }

    catch(Exception e)
	{
		e.printStackTrace();
	}
}
</code></pre></td></tr></tbody></table><p>执行SignAndVerifySoap的verify方法，可以看到类似以下的结果。</p><p><a name="N100FD"><b>图1 对SOAP消息进行验证</b></a><br /><img height="272" alt="图1 对SOAP消息进行验证" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis2/1.gif" width="505" border="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" /></p><p><a name="N1010D"><span class="atitle2">在AXIS下实现WS-Security的应用框架</span></a><br />待开发的应用开发框架基于Handler实现，将达到以下目标：此框架基于JAX-RPC环境下实现WS-Security应用，它可以部署到任何需要实现WS-Security的axis环境下的Web服务应用中，同时具体的应用程序不做任何编码修改。</p><p>由于此基于Handler实现，我们有必要回顾一下Handler的一些基础知识。</p><p>SOAP消息Handler能够访问代表RPC请求或者响应的SOAP消息。在JAX-RPC技术中，SOAP消息Handler可以部署在服务端，也可以在客户端使用。</p><p>SOAP消息Handler非常像Servlet技术中的Filter，它们共同的特点是请求发送到目标前，Handler/Filter可以截取这些请求，并对请求做一些处理，从而达到一些辅助的功能。多个Handler可以组成一个Handler链，链上的每个Handler都完成某个特定的任务。比如有的Handler进行权限验证，有的Handler进行日志处理等。关于Handler更详细的介绍，请参考本系列文章《 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-handler/index.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><font color="#002c99">J2EE Web服务开发系列之六: 使用Handler来增强Web服务的功能</font></a>》。 </p><p><a name="N10123"><span class="atitle3">实现原理</span></a><br />图2是此例子具体实现原理图。</p><p><a name="N1012E"><b>图2 Handler结合WSSecurity实现Web服务安全的工作原理</b></a><br /><img height="433" alt="图2 Handler结合WSSecurity实现Web服务安全的工作原理" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis2/2.gif" width="662" border="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" /></p><p>处理流程如下：</p><p>1、 客户端（WSSClient）发出调用Web服务请求；</p><p>2、 客户端Handler（WSSecurityClientHandler）截获请求的SOAP消息；</p><p>3、 客户端Handler对截获的SOAP消息进行数字签名（使用client.keystore作为签名依据）；</p><p>4、 客户端Handler对签名后的SOAP消息进行加密（使用RSA算法加密）；</p><p>5、 被加密的SOAP消息通过互联网传送到目标Web服务端口；</p><p>6、 服务器端Handler（WSSecurityServerHandler）截获加密的SOAP消息；</p><p>7、 服务器端Handler对加密的SOAP消息进行解密；</p><p>8、 服务器端Handler对SOAP消息进行身份验证（server.truststore包含了所信任的身份信息），如果验证不通过，将抛出异常；</p><p>9、 服务器端Handler删除被解密后的SOAP消息中与WS-Security相关的元素；</p><p>10、 解密后的原始SOAP消息被发送到目标Web服务端口（如TaxService）；</p>11、 目标Web服务对Web服务请求进行处理，然后返回响应的SOAP消息； 
<p>12、 服务器端Handler截获响应的SOAP消息；</p><p>13、 服务器端Handler对截获的SOAP消息进行数字签名（使用server.keystore作为签名依据）；</p><p>14、 服务器端Handler对签名后的SOAP消息进行加密（使用RSA算法加密）；</p><p>15、 被加密的SOAP消息通过互联网传送到目客户端；</p><p>16、 客户端Handler截获加密的SOAP消息；</p><p>17、 客户端Handler对加密的SOAP消息进行解密；</p><p>18、 客户端Handler对SOAP消息进行身份验证（client.truststore包含了所信任的身份信息），如果验证不通过，将抛出异常；</p><p>19、 客户端Handler删除被解密后的SOAP消息中与WS-Security相关的元素；</p><p>20、 被解密后的SOAP消息发送到目标客户端，客户端输出调用结果。</p><p>从上面可以看出，在一个SOAP调用回合中，要对SOAP消息进行四次处理。基本上都是"签名'加密'解密'验证"的过程。</p><p><a name="N1017D"><span class="atitle3">创建相关密匙库</span></a><br />客户端和服务端都有相关的密匙库，其中：</p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/"><li>client.keystore：客户端自身的身份信息； 
</li><li>client.truststore：客户端所信任的身份信息，在此例中也就是包含了服务器的身份信息； 
</li><li>server.keystore：服务器自身的身份信息； 
</li><li>server.truststore：服务器所信任的身份信息（即客户端身份信息）。 </li></ul><p>你可以使用以下的批处理脚本创建上面四个密匙库。</p><a name="N10198"><b>例程6 创建相关密匙库（gen-cer-store.bat）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
set SERVER_DN="CN=hellking-Server, OU=huayuan, O=huayuan, L=BEIJINGC, S=BEIJING, C=CN"
set CLIENT_DN="CN=hellking-Client, OU=tsinghua, O=tsinghua, L=BEIJING, S=BEIJING, C=CN"
set KS_PASS=-storepass changeit
set KEYINFO=-keyalg RSA
#生成server.keystore。
keytool -genkey -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass changeit
#从server.keystore导出数字证书。
keytool -export -file test_axis.cer %KS_PASS% -keystore server.keystore
#从服务器的数字证书导出到客户端信任的truststore中。
keytool -import -file test_axis.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt

#生成client.keystore。
keytool -genkey -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass changeit
#从client.keystore导出数字证书。
keytool -export -file test_axis.cer %KS_PASS% -keystore client.keystore
#从客户端的数字证书导出到服务器信任的truststore中。
keytool -import -file test_axis.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt

#end
</code></pre></td></tr></tbody></table><p><a name="N101A2"><span class="atitle3">签名、加密、解密、身份验证的实现</span></a><br />对SOAP消息的签名、加密、解密、身份验证都放在一个名为WSSHelper的类中进行。</p><a name="N101AB"><b>例程7 签名、加密、解密、身份验证功能的实现――WSSHelper.java</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.hellking.study.webservice;
import com.verisign.messaging.WSSecurity;
...
public class WSSHelper {
	static String PROVIDER="ISNetworks";//JSSE安全提供者。	
   //添加JSSE安全提供者，你也可以使用其它安全提供者。只要支持DESede算法。
	static
	{
	java.security.Security.addProvider(new com.isnetworks.provider.jce.ISNetworksProvider());
    }
    /**
     *对XML文档进行数字签名。
     */
	public static void sign(Document doc, String keystore, String storetype,
						String storepass, String alias, String keypass) throws Exception {
		FileInputStream fileInputStream = new FileInputStream(keystore);
		java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
		keyStore.load(fileInputStream, storepass.toCharArray());
		PrivateKey key = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());
		X509Certificate cert = (X509Certificate)keyStore.getCertificate(alias);

		SigningKey sk = SigningKeyFactory.makeSigningKey(key);
		KeyInfo ki = new KeyInfo();
		ki.setCertificate(cert);

		WSSecurity wSSecurity = new WSSecurity();
		wSSecurity.sign(doc, sk, ki);//签名。
	}
    /**
     *对XML文档进行身份验证。
     */
	public static boolean verify(Document doc, String keystore, String storetype,
						String storepass) throws Exception {
		FileInputStream fileInputStream = new FileInputStream(keystore);
		java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
		keyStore.load(fileInputStream, storepass.toCharArray());

		TrustVerifier verifier = new X509TrustVerifier(keyStore);

		WSSecurity wSSecurity = new WSSecurity();
		MessageValidity[] resa = wSSecurity.verify(doc, verifier, null,null);
		if (resa.length &gt; 0)
			return resa[0].isValid();
		return false;
	}
   /**
    *对XML文档进行加密。必须有JSSE提供者才能加密。
    */
	public static void encrypt(Document doc, String keystore, String storetype,
						String storepass, String alias) throws Exception {
		try
		{
				
		FileInputStream fileInputStream = new FileInputStream(keystore);
		java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
		keyStore.load(fileInputStream, storepass.toCharArray());
		X509Certificate cert = (X509Certificate)keyStore.getCertificate(alias);
		
		PublicKey pubk = cert.getPublicKey();
		KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede",PROVIDER);		
		keyGenerator.init(168, new SecureRandom());
		SecretKey key = keyGenerator.generateKey();
		KeyInfo ki = new KeyInfo();
		ki.setCertificate(cert);

		WSSecurity wSSecurity = new WSSecurity();
		//加密。
		wSSecurity.encrypt(doc, key, AlgorithmType.TRIPLEDES, pubk, AlgorithmType.RSA1_5, ki);
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	}
    /**
     *对文档进行解密。
     */
	public static void decrypt(Document doc, String keystore, String storetype,
						String storepass, String alias, String keypass) throws Exception {
		FileInputStream fileInputStream = new FileInputStream(keystore);
		java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
		keyStore.load(fileInputStream, storepass.toCharArray());
		PrivateKey prvk2 = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());

		WSSecurity wSSecurity = new WSSecurity();
		//解密。
		wSSecurity.decrypt(doc, prvk2, null);
		WsUtils.removeEncryptedKey(doc);//从 WS-Security Header中删除 EncryptedKey 元素
	}

	public static void removeWSSElements(Document doc) throws Exception {
		WsUtils.removeWSSElements(doc);// 删除WSS相关的元素。
	}		
}
</code></pre></td></tr></tbody></table><p>WSSHelper类中使用了ISNetworks安全提供者，ISNetworks实现了RSA加密、解密算法。当然，你也可以使用其它的安全提供者，并且可以使用不同的加密算法。可以从网络上下载ISNetworks相关包。</p><p>WSSHelper中包含了一个WsUtils类，它的功能就是从加密后的SOAP消息中删除一些WS-Security元素，删除这些元素后的SOAP消息才能被最终的客户端或者Web服务端处理。</p><p><a name="N101BB"><span class="atitle3">服务器端Handler开发</span></a><br />当请求到达后，服务端Handler调用handleRequest方法，执行如下过程：对请求SOAP消息解密'身份验证'删除WSS元素'把Document转换成SOAP消息。 Web服务端点对请求做出响应后，将调用handleResponse方法，执行如下过程：对响应的SOAP消息进行数字签名'加密'把Document转换成SOAP消息。</p><a name="N101C4"><b>例程8 服务器端Handler（WSSecurityServerHandler.java）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.hellking.study.webservice;
...

//服务器端Handler
public class WSSecurityServerHandler implements Handler 
{
	 	//密匙库相关信息
private String keyStoreFile = null;
		private String keyStoreType = "JKS";
		。。。
		
		public WSSecurityServerHandler()
		{
			System.out.println("服务端Handler：构造方法");
		}
	    /**
	     *处理请求
	     *流程：解密--&gt;身份验证--&gt;删除WSS元素'把Document转换成SOAP消息。
	     */	     
	    public boolean handleRequest(MessageContext messageContext) {
	 	
	        	System.out.println("开始处理请求。。。");
    	if (messageContext instanceof SOAPMessageContext){
			try {
	SOAPMessageContext soapMessageContext = (SOAPMessageContext)messageContext;
				SOAPMessage soapMessage = soapMessageContext.getMessage();
				soapMessage.writeTo(System.out);
	Document doc = MessageConveter.convertSoapMessageToDocument(soapMessage);
                    //解密
				WSSHelper.decrypt(doc, keyStoreFile, keyStoreType,
						keyStorePassword, keyAlias, keyEntryPassword);
                     //身份验证
				WSSHelper.verify(doc, trustStoreFile, trustStoreType, trustStorePassword);
				//删除WSS元素
WSSHelper.removeWSSElements(doc);

				soapMessage = MessageConveter.convertDocumentToSOAPMessage(doc);
				soapMessageContext.setMessage(soapMessage);
			} catch (Exception e){

				System.err.println("在处理请求时发生了异常： " + e);
				e.printStackTrace();
				return false;
			}
		} else {
			System.out.println("MessageContext是以下类的实例： " + messageContext.getClass());
		}
		 System.out.println("处理请求完毕！");
        return true;
    }
    
    /**
     *处理响应
     *流程：数字签名--&gt;加密--&gt;把Document转换成SOAP消息。
     */
     public boolean handleResponse(MessageContext messageContext) {
        	System.out.println("开始处理Web服务响应。。。");
        if (messageContext instanceof SOAPMessageContext){
			try {
		SOAPMessageContext soapMessageContext = (SOAPMessageContext)messageContext;
				SOAPMessage soapMessage = soapMessageContext.getMessage();
		Document doc = MessageConveter.convertSoapMessageToDocument(soapMessage);
				WSSHelper.sign(doc, keyStoreFile, keyStoreType,
						keyStorePassword, keyAlias, keyEntryPassword);
				WSSHelper.encrypt(doc, trustStoreFile, trustStoreType,
						trustStorePassword, certAlias);

				soapMessage = MessageConveter.convertDocumentToSOAPMessage(doc);
				soapMessageContext.setMessage(soapMessage);
			} catch (Exception e){
				System.err.println("在处理响应时发生以下错误： " + e);
				e.printStackTrace();
				return false;
			}
		}
	
		System.out.println("处理响应完毕！");
        return true;
    }
    /**
     *初始化，主要是初始化一些相关参数。
     */
     public void init(HandlerInfo config) {
		System.out.println("WSSecurityServerHandler初始化");
		Object param = "";
		Map configs = config.getHandlerConfig();
		keyStoreFile = (String)configs.get("keyStoreFile");
		trustStoreFile = (String)configs.get("trustStoreFile");
		…//其它参数初始化	
    }
	…
}
</code></pre></td></tr></tbody></table><p><a name="N101CE"><span class="atitle3">客户端Handler开发</span></a><br />客户端Handler可以是任何JAX-RPC兼容的Handler处理器。比如AXIS Handler实现或者SUN 提供的JAX-RPC Handler参考实现。这里使用后者来作为客户端Handler处理器。</p><p>客户端Handler和服务器端Handler原理一样，但处理过程完全相反。</p><a name="N101DA"><b>例程9 客户端Handler（WSSecurityClientHandler.java）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.hellking.study.webservice;
…

//客户端Handler
public class WSSecurityClientHandler implements Handler 
{       
       //密匙库相关信息   
	    ...
		
	    /**
	     *处理请求
	     *流程：数字签名--&gt;加密--&gt;把Document转换成SOAP消息。
	     */	     
	    public boolean handleRequest(MessageContext messageContext) {
	 	
	        	System.out.println("开始处理请求。。。");
           …
		       	WSSHelper.sign(doc, keyStoreFile, keyStoreType,
				keyStorePassword, keyAlias, keyEntryPassword);
			    WSSHelper.encrypt(doc, trustStoreFile, trustStoreType,
trustStorePassword, certAlias);
				soapMessage = MessageConveter.convertDocumentToSOAPMessage(doc);
				soapMessageContext.setMessage(soapMessage);
			…
		 System.out.println("处理请求完毕！");
        return true;
    }
    
    /**
     *处理响应
     *流程：解密--&gt;身份验证--&gt;删除WSS元素'把Document转换成SOAP消息。
     */
     public boolean handleResponse(MessageContext messageContext) {

        	System.out.println("开始处理Web服务响应。。。");
       …
			    WSSHelper.decrypt(doc, keyStoreFile, keyStoreType,
						keyStorePassword, keyAlias, keyEntryPassword);				
				
				WSSHelper.verify(doc, trustStoreFile, trustStoreType, trustStorePassword);
				WSSHelper.removeWSSElements(doc);

				
				soapMessage = MessageConveter.convertDocumentToSOAPMessage(doc);
								System.out.println("the final message is:");
								soapMessage.writeTo(System.out);
				soapMessageContext.setMessage(soapMessage);
			…		
			System.out.println("处理响应完毕！");
        return true;
    }
    /**
     *初始化，主要是初始化一些相关参数。
     */
     public void init(HandlerInfo config) {
		…
    }
	…
}
</code></pre></td></tr></tbody></table><p><a name="N101E4"><span class="atitle3">部署服务器端Handler</span></a><br />为了使用Handler，需要在Web服务部署描述符中指定使用此Handler。Handler包含的初始化参数也在此描述，如例程10所示。</p><a name="N101ED"><b>例程10 服务器端Handler部署代码</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
  &lt;service name="PersonalTaxServicePort" provider="java:RPC"&gt;
  &lt;parameter name="allowedMethods" value="*"/&gt;
  &lt;parameter name="className" value="/blog/com.hellking.study.webservice.PersonalTaxService"/&gt;
  &lt;parameter name="wsdlTargetNamespace" value="http://hellking.webservices.com/"/&gt;
  &lt;parameter name="wsdlServiceElement" value="PersonalTaxService"/&gt;
  &lt;parameter name="wsdlServicePort" value="PersonalTaxServicePort"/&gt;
  &lt;parameter name="wsdlPortType" value="PersonalTaxService"/&gt;
  &lt;requestFlow&gt;
   &lt;handler type="java:org.apache.axis.handlers.JAXRPCHandler"&gt;
    &lt;parameter name="scope" value="session"/&gt;
    &lt;parameter name="className"
            value="/blog/com.hellking.study.webservice.WSSecurityServerHandler"/&gt;
    &lt;parameter name="keyStoreFile"
            value="/blog/K:\\jakarta-tomcat-5.0.16\\server.keystore"/&gt;
    &lt;parameter name="trustStoreFile"
            value="/blog/K:\\jakarta-tomcat-5.0.16\\server.truststore"/&gt;
    &lt;parameter name="certAlias" value="clientkey"/&gt;
   &lt;/handler&gt;
  &lt;/requestFlow&gt;
  &lt;responseFlow&gt;
   &lt;handler type="java:org.apache.axis.handlers.JAXRPCHandler"&gt;
    &lt;parameter name="scope" value="session"/&gt;
    &lt;parameter name="className"
            value="/blog/com.hellking.study.webservice.WSSecurityServerHandler"/&gt;
    &lt;parameter name="keyStoreFile"
            value="/blog/K:\\jakarta-tomcat-5.0.16\\server.keystore"/&gt;

    &lt;parameter name="trustStoreFile"
            value="/blog/K:\\jakarta-tomcat-5.0.16\\server.truststore"/&gt;
    &lt;parameter name="certAlias" value="clientkey"/&gt;
   &lt;/handler&gt;
  &lt;/responseFlow&gt;
  &lt;/service&gt;
  </code></pre></td></tr></tbody></table><p>requestFlow表示Web服务PersonalTaxServicePort的请求处理Handler链。这里只有一个Handler，就是WSSecurityServerHandler。当Web服务请求到达PersonalTaxServicePort时，WSSecurityServerHandler的handleRequest方法将被自动调用。</p><p>注意：部署时，请改变Handler相关参数以和目标的Web服务一致，比如trustStoreFile的路径等。</p><p><a name="N101FD"><span class="atitle3">调用测试</span></a><br />这里采用代理的方式来调用Web服务，先编写一个Web服务接口。</p><a name="N10206"><b>例程11 TaxServiceInterface</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.hellking.study.webservice;
…
/**
 *个人所得税Web服务。
 */
public interface TaxServiceInterface extends Remote
{
	public double getTax(double salary)throws java.rmi.RemoteException;
}
</code></pre></td></tr></tbody></table><p>WSSClient客户端程序是通过代理的方式来访问Web服务的。由于要使用Handler，所以在访问前通过registerHandlers（）方法注册了WSSecurityClientHandler，并且初始化了WSSecurityClientHandler的相关参数。当然，JAX-RPC"参考实现"还支持在Web服务客户端配置文件中描述Handler信息，这样就不需要在客户端代码中对Handler进行注册了，你可以参考相关文档。</p><a name="N10213"><b>例程12 测试客户端程序（WSSClient）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.hellking.study.webservice;

...
/**
 *调用需要验证的Web服务
 */
public class WSSClient
{
	static	final double salary=5000;
    public static void main(String [] args)
    {
        try {
        	//服务端的url，需要根据情况更改。            
            String endpointURL = "http://localhost:8080/axis/services/PersonalTaxServicePort";
            String wsdlURL=endpointURL+"?wsdl";
            java.net.URL targetURL= new java.net.url(/blog/wsdlURL);
            String nameSpaceUri = "http://hellking.webservices.com/";
            String svcName = "PersonalTaxService";		
		    String portName = "PersonalTaxServicePort";

            ServiceFactory svcFactory = ServiceFactory.newInstance();

            Service svc = svcFactory.createService(targetURL, new QName(nameSpaceUri, svcName));
            //cfg表示客户端的配置信息。
            java.util.HashMap cfg = new java.util.HashMap();
			
			cfg.put("keyStoreFile", "client.keystore");			
			cfg.put("trustStoreFile", "client.truststore");			
			cfg.put("certAlias", "changeit");
			
		    Class hdlrClass = com.hellking.study.webservice.WSSecurityClientHandler.class;
			
			java.util.List list = svc.getHandlerRegistry().
			
			               getHandlerChain(new QName(nameSpaceUri, portName));
			
			list.add(new javax.xml.rpc.handler.HandlerInfo(hdlrClass, cfg, null));
			
		     registerHandlers (svc);
			
			 TaxServiceInterface myProxy = 
               ( TaxServiceInterface) svc.getPort(new QName(nameSpaceUri, portName), 
                 TaxServiceInterface.class);       
              double ret=myProxy.getTax(5000);
			System.out.println("使用HTTP协议来作为Web服务的传输协议！");			
            System.out.println("已经成功调用。请参看服务端的输出!");
            System.out.println("输入工资"+salary+"元，应交个人所得税："+ret);
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    //注册Handler
    private static void registerHandlers ( Service service ) 
		throws javax.xml.rpc.ServiceException {
		
		java.util.HashMap cfg = new java.util.HashMap();
			
			cfg.put("keyStoreFile", "client.keystore");			
			cfg.put("trustStoreFile", "client.truststore");			
			cfg.put("certAlias", "changeit");
			
		/*
		* 封装客户端Handler到HandlerInfo 中，然后添加到Handler链中。
		*/ 
	javax.xml.rpc.handler.HandlerInfo info = new javax.xml.rpc.handler.HandlerInfo
	(com.hellking.study.webservice.WSSecurityClientHandler.class, cfg, null );
		java.util.ArrayList handlerList = new java.util.ArrayList();
		handlerList.add(info);
		
		/*
		* 获得Handler注册
		*/
		javax.xml.rpc.handler.HandlerRegistry handlerRegistry = service.getHandlerRegistry();
		
		/*
		* 把Handler添加到所有的port中。
		*/
		java.util.Iterator portIterator = service.getPorts();
		while ( portIterator.hasNext()) {
			Object obj=portIterator.next();
		QName portName = (QName) obj;
		handlerRegistry.setHandlerChain(portName, handlerList);
		}
    }
    
}
</code></pre></td></tr></tbody></table><p>注意：由于客户端使用了SUN公司提供的"JAX-RPC参考实现"，所以必须把jaxrpc-impl.jar包设置在CLASSPATH环境变量中，并且不要把axis.jar设置在客户端CLASSPATH环境变量，否则会出现ClassCastException异常。这是因为axis也是JAX-RPC的实现，如果它在CLASSPATH环境变量中，当调用：</p><p>ServiceFactory svcFactory = ServiceFactory.newInstance()方法时，就可能初始化一个axis的ServiceFactory 实现。</p><p>本文源代码中client目录下wss-client.bat文件包含了执行WSSClient脚本，修改了部分环境变量参数后，才能执行。</p><p><a name="N10226"><span class="atitle2">总结</span></a><br />本文和上一篇文章介绍了几种不同实现Web服务安全的方法，你可以根据具体应用对安全的要求级别采用不同的方式。对于安全级别要求不高的应用，可以采用在Web服务器上使用基本认证、使用Axis的Handler或者使用Servlet过滤器来实现访问控制；对于安全要求高的应用，可以采用本篇介绍开发的"axis下实现WS-Security的通用应用框架"来实现安全性。</p></div>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/61835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:08 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现安全的AXIS Web服务</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61834.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61834.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61834.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61834.html</trackback:ping><description><![CDATA[高级软件工程师<br /><p>2004 年 8 月 01 日</p><blockquote>本文首先简单介绍Web服务安全性基本概念，然后介绍在axis Web服务开发工具下处理安全性问题的一些常用方法；接下来以安全性实现方法为线索，介绍了怎么在Web应用的基础上配置Web服务的访问控制、怎么使用axis的Handler和Servlet的过滤器进行访问控制，最后讨论怎么在tomcat下配置SSL 以实现Web服务的安全传输。</blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><p>axis是流行的Web服务开发工具，如何在axis下开发安全的Web服务，这是摆在每个开发者面前的问题。本文是J2EE Web服务开发系列文章的第十二篇，将首先简单介绍Web服务安全性基本概念，然后介绍在axis Web服务开发工具下处理安全性问题的一些常用方法；接下来以安全性实现方法为线索，介绍了怎么在Web应用的基础上配置Web服务的访问控制、怎么使用axis的Handler和Servlet的过滤器进行访问控制，最后讨论怎么在tomcat下配置SSL 以实现Web服务的安全传输。本文下一篇将介绍怎么在axis中实现WS-Security。</p><p>阅读本文前您需要以下的知识和工具：</p><ul><li>Apache axis1.1，并且会初步使用； 
</li><li>Tomcat 4.0以上, 并且会初步使用； 
</li><li>Servlet的开发经验； 
</li><li>SOAP消息（SOAP Message）编程知识； 
</li><li>JAX-RPC编程基础知识； 
</li><li>Java安全编程基础知识。 </li></ul><p>本文的参考资料见 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#resources"><font color="#996699">参考资料</font></a>。 </p><p>本文的全部代码在这里 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/src.rar"><font color="#5c81a7">下载</font></a>。 </p><p><a name="N10067"><span class="atitle"><font size="4">Web服务安全概述</font></span></a></p><p>安全的Web服务是Web服务成功的必要保证。但众所周知的是，Web服务使用XML来进行数据交换，而XML在默认情况下是明文编码的；同时，大部分Web服务使用HTTP协议作为传输协议，同样，HTTP也是使用明文方式来传输数据的。这就造成了在不加密的传输协议上传输不加密的信息，从而使信息传输的保密性受到威胁。作为企业级的应用，以上的方式不能满足安全性基本要求：</p><ol><li>数据在因特网上传播时不应该被第三方看到； 
</li><li>双方必须能够确定消息的来源； 
</li><li>双方必须能够确定被传送的数据没有被篡改。 </li></ol><p>通过使用SSL协议可以解决第一个问题："不应该被第三方看到"；使用数字签名和数字证书可以解决后面两个问题。当使用数字证书方法时，Web 服务请求者必须有一个由可信认证中心签署的数字证书。请求者使用这个证书来表明它们的身份，并对 SOAP 消息进行数字签名。对方系统接收到消息后，就可对消息做时间戳记并进行日志记录。此时，数字签名会得到验证。验证过程将确保消息来自发送方，并且还要验证消息内容在传输过程中没有被篡改。</p><p>IBM、Microsoft 和 Verisign 于2002年十二月份联合发布了一个关于 Web 服务安全性（Web Services Security，WS-Security）的规范，该规范描述如何向 SOAP 消息附加签名和加密报头；另外，它还描述如何向消息附加安全性令牌（包括二进制安全性令牌，如 X.509 证书），提供了一套帮助 Web 服务开发者保护 SOAP 消息交换的机制。</p><p>根据应用的对安全要求的级别不同，可以采用不同的方式来实现安全性，以下是目前最常用的一些实现方式（从低到高排列）：</p><ul><li>J2EE Web应用默认的访问控制（数据是明文的）； 
</li><li>使用axis的Handler进行访问控制（数据是明文的）； 
</li><li>使用Servlet过滤器（Filter）进行访问控制（数据是明文的）； 
</li><li>使用SSL/HTTPS协议来传输（加密的数据传输协议）； 
</li><li>使用WS-Security规范对信息进行加密与身份认证（数据被加密传输）。 </li></ul><p>前三种方式对于安全级别要求不高的应用是可行的，它能够使用Web应用访问认证机制来进行权限验证，从而保护对资源的访问。但需要注意的是，虽然它们进行了身份验证，但信息的传递还是以明文的方式进行的，不能保证信息在传输过程中不被窃取。SSL是一个安全的传输协议，使用它传输Web服务能保证信息不被第三方窃取。但它有个缺点就是对系统资源消耗大。采用最后一种方式，信息被签名后再加密，然后把加密后的信息网络上传播，这样，即使第三方获得加密后的传输信息，也不能解密。对于安全级别要求高的系统，应该采用WS-Security规范来作为Web服务安全性解决方案。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1009A"><span class="atitle"><font size="4">开发、部署示例Web服务</font></span></a></p><p>作为一个实例性的教程，我们有必要先开发一个简单的Web服务作为示例。关于如何在Axis下开发并部署一个简单的Web服务你可以参考下面这篇文章： <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-jax-rpc/part1/index.shtml"><font color="#996699">用JAX-RPC开发Web服务：Servlet作为Web服务端点</font></a>。 </p><p>下面的例子提供的是一个提供个人所得税计算的Web服务。客户端传入工资的金额，Web服务将计算个人所得税金额。</p><br /><a name="N100AA"><b>例程 1 个人所得税Web服务</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package com.hellking.study.webservice;
public class PersonalTaxService
{
	final double base=1200;//所得税上缴基数。	
	public  double getTax(double salary)
    {
    	double tax_salary=salary-1200;    	
    	double tax=0.0d;//计算后的所得税。    	
    	if(0&gt;tax_salary)                             tax=0;
    	else if(0&lt;tax_salary&amp;&amp;tax_salary &lt;=500)      tax=tax_salary*0.05-0;
    	else if(500&lt;tax_salary&amp;&amp;tax_salary&lt;=2000)    tax=tax_salary*0.10-25;
     …    	   	
    	return tax;
    } 
}
</font></code></pre></td></tr></tbody></table><br /><p>编译后，你只要在Axis的部署配置文件（AXIS_HOME\Web-INF\server-config.wsdd）的适当位置增加以下部署代码，Web服务就可以部署成功。</p><br /><a name="N100B7"><b>例程2 部署示例Web服务</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">    &lt;service name="PersonalTaxService" provider="java:RPC"&gt;
  &lt;parameter name="allowedMethods" value="*"/&gt;
  &lt;parameter name="className" value="/blog/com.hellking.study.webservice.PersonalTaxService"/&gt;
  &lt;/service&gt;
  </font></code></pre></td></tr></tbody></table><br /><p>部署后的Web服务URL为： http://localhost:8080/axis/services/PersonalTaxService?wsdl （请先部署好这个Web服务再进行下面的学习。）</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100C4"><span class="atitle"><font size="4">从Web应用的基本认证说起</font></span></a></p><p>不管客户端通过什么API来调用Web服务，它总是先构造SOAP消息，然后通过HTTP POST方法把消息发送到Web服务的URL（注1：当然，Web服务也可以通过其它基于文本的协议传输，但是由于非常少见，在这里不讨论）。而我们知道，不管axis部署在哪种服务器上（Tomat还是Websphere），它总是以Servlet方式来运行的。所以最简单实现Web服务安全的方式就是通过在web应用的配置文件（web.xml）来实现访问控制。</p><p>J2EE web应用中有多种认证方式：BASIC（基本认证方法）、FORM（基于表单）、DIGEST（消息摘要）和CLIENT-CERT（数字证书）。关于J2EE Web应用的其它认证方式的配置请参考其它资料，在此不再介绍。</p><p>下面以Tomcat使用服务器为例，使用Web应用模型中基本认证方法来配置Web服务的安全访问。</p><p>Web应用的基本认证是建立在J2EE角色和用户的基础之上，首先在Tomcat角色配置文件中增加一个角色和一个帐号。</p><br /><a name="N100D6"><b>例程3 在tomcat-users.xml中增加角色（Tomcat_Home\conf\tomcat-users.xml）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;tomcat-users&gt;
…  
&lt;role rolename="department-manager"/&gt;
  &lt;user username="hellking" password="simplewebservices" roles="department-manager"/&gt; 
…
&lt;/tomcat-users&gt;
</font></code></pre></td></tr></tbody></table><br /><p>上面配置代码在tomcat配置文件中添加了一个department-manager角色，并且在此角色中添加了一个名为hellking的用户。要使tomcat-users.xml中配置的角色和用户生效，需要配置tomcat使用UserDatabaseRealm。打开Tomcat_Home\conf\server.xml配置文件，在GlobalNamingResources中添加以下描述：</p><br /><a name="N100E3"><b>例程4 在tomcat中添加UserDatabaseRealm</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">  &lt;GlobalNamingResources&gt;
...
  &lt;Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"&gt;
    &lt;/Resource&gt;
    &lt;ResourceParams name="UserDatabase"&gt;
      &lt;parameter&gt;
        &lt;name&gt;factory&lt;/name&gt;
        &lt;value&gt;org.apache.catalina.users.MemoryUserDatabaseFactory&lt;/value&gt;
      &lt;/parameter&gt;
      &lt;parameter&gt;
        &lt;name&gt;pathname&lt;/name&gt;
        &lt;value&gt;conf/tomcat-users.xml&lt;/value&gt;
      &lt;/parameter&gt;
    &lt;/ResourceParams&gt;
  &lt;/GlobalNamingResources&gt;
  </font></code></pre></td></tr></tbody></table><br /><p>然后再web应用的部署描述符中指定Web服务资源的访问控制，如下所示：</p><br /><a name="N100F0"><b>例程5 配置对Servlet的访问控制（AXIS_HOME\WEB-INF\web.xml）</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;security-constraint&gt;
  &lt;web-resource-collection&gt;
    &lt;web-resource-name&gt;Tax Web service &lt;/web-resource-name&gt;
    &lt;url-pattern&gt;/services/PersonalTaxService&lt;/url-pattern&gt;
  &lt;/web-resource-collection&gt;
  &lt;auth-constraint&gt;
    &lt;role-name&gt;department-manager&lt;/role-name&gt;
  &lt;/auth-constraint&gt;
&lt;/security-constraint&gt;
&lt;login-config&gt;
  &lt;auth-method&gt;BASIC&lt;/auth-method&gt;
  &lt;realm-name&gt;Axis Basic Authentication Area&lt;/realm-name&gt;
&lt;/login-config&gt;
&lt;security-role&gt;
  &lt;role-name&gt;department-manager&lt;/role-name&gt;
&lt;/security-role&gt;
</font></code></pre></td></tr></tbody></table><br /><p>url-pattern指定了需要通过角色验证的URL样式，在这里是"/services/PersonalTaxService"；role-name是能够访问制定URL的角色，这里是department-manager。以上配置的意思是只有角色类型是"department-manager"的用户才能访问URL样式为"/services/PersonalTaxService"Web服务。</p><p>下面我们看怎么在axis客户端代码中axis客户端，如例程6所示。</p><br /><a name="N10100"><b>例程6 axis客户端代码</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package com.hellking.study.webservice;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
。。。

/**
 *调用需要验证的Web服务
 */
public class AuthClient
{
	static	final double salary=5000;
    public static void main(String [] args)
    {
        try {
        	//服务端的url，需要根据情况更改。            
            String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService?wsdl";//
// Web服务端点地址            
            Service  service = new Service();
            Call     call    = (Call) service.createCall();
            call.setTargetEndpointAddress( new java.net.url(/blog/endpointURL) );
            call.setOperationName( new QName("PersonalTaxService", "getTax") );//设置操作的名称。
            //由于需要认证，故需要设置调用的用户名和密码。
            call.getMessageContext().setUsername("hellking");//设置用户名。
            call.getMessageContext().setPassword("simplewebservices");//设置密码
            call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );//参数的类型
		   call.setReturnType( XMLType.XSD_DOUBLE );//返回的数据类型
            Double ret = (Double) call.invoke( new Object [] { new Double(salary) });//执行调用
		  System.out.println("使用HTTP协议来作为Web服务的传输协议！");			
            System.out.println("已经成功调用。请参看服务端的输出!");
            System.out.println("输入工资"+salary+"元，应交个人所得税："+ret);
     。。。
    }
}
</font></code></pre></td></tr></tbody></table><br /><p>可以看出，通过使用call.getMessageContext().setUsername("hellking")来设置调用的用户名，通过setPassword来设置调用的密码。通过上面的代码可以看出，除了为Call对象设置的用户名和密码外，其它的代码和不使用访问控制时一样。</p><p>下面我们看看它的运行结果：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">使用HTTP协议来作为Web服务的传输协议！
已经成功调用。请参看服务端的输出!
输入工资5000.0元，应交个人所得税：445.0
</font></code></pre></td></tr></tbody></table><br /><p>从输出可以看到，客户端成功通过了验证，并且返回了正确的结果。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10117"><span class="atitle"><font size="4">使用axis的Handler进行访问控制</font></span></a></p><p>axis为Web服务的访问控制提供了相关的配置描述符，并且提供了一个访问控制的简单Handler（关于Handler的详细介绍见" <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-handler/index.shtml"><font color="#5c81a7">J2EE Web服务开发系列之六: 使用Handler来增强Web服务的功能</font></a>"）。默认情况下，你只要在配置描述符中添加用户，然后在Web服务器的部署描述符中自动允许的角色即可。 </p><p>首先在axis的配置文件users.lst（位于WEB-INF目录下）中添加一个用户，如"axisuser pass"，表示用户名为axisuser，密码为pass。然后把案例的Web服务重新部署，在server-config.wsdd中添加例程7所示的部署代码。</p><br /><a name="N10127"><b>例程7 重新部署PersonalTaxService</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">  &lt;service name="PersonalTaxService2" provider="java:RPC"&gt;
  &lt;parameter name="allowedMethods" value="*"/&gt;
    &lt;parameter name="className" value="/blog/com.hellking.study.webservice.PersonalTaxService"/&gt;
      &lt;parameter name="allowedRoles" value="axisuser"/&gt;
    &lt;requestFlow&gt;
    &lt;handler name="authen"
 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;
    &lt;/requestFlow&gt;
  &lt;/service&gt;
  </font></code></pre></td></tr></tbody></table><br /><p>在这个部署描述符中，指定PersonalTaxService2服务只能被axisuser访问，要想使访问控制生效，还必须把SimpleAuthenticationHandler添加到请求Handler链中。</p><p>你只要修改AuthClient代码的服务端点URL和访问用户名、密码，就可以测试新的Web服务了，如例程8所示。</p><br /><a name="N10137"><b>例程8 HandlerAuthClient</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">public class HandlerAuthClient
{
。。。  
String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService2?wsdl";
      。。。
   call.getMessageContext().setUsername("axisuser");//axis中的用户名。
   call.getMessageContext().setPassword("pass");//密码
。。。
</font></code></pre></td></tr></tbody></table><br /><p>执行HandlerAuthClient，能够顺利访问Web服务；如果修改用户名或者密码，那么就不能访问，这说明Axis的Handler对Web服务的访问权限进行了有效的控制。</p><p>使用Servlet过滤器（Filter）进行访问控制 Axis的Web服务端本质上是以Servlet方式在运行，所有我们完全可以在Web应用上部署一个Servlet过滤器，通过此过滤器来达到访问控制的效果。</p><p>Web应用中的过滤器截取从客户端进来的请求，然后进行一系列处理，最后把请求发送到目标Servlet。过滤器的工作原理如下图所示。</p><br /><a name="N1014C"><b>图1 过滤器工作原理</b></a><br /><img height="452" alt="图1 过滤器工作原理" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/1.gif" width="671" border="0" /><br /><p>过滤器可以说是外部进入Web服务器的第一道关，它能决定请求是否继续向前转发，也能对请求中的信息进行处理。如果过滤器用于对Web服务进行访问控制，那么它能根据客户端信息决定目标的服务是否能调用成功。</p><p>将要开发的过滤器将根据客户端IP地址进行过滤，如果客户端的IP地址在限制范围中，那么就不能访问目标的Web服务。过滤器部分代码如下。</p><br /><a name="N10162"><b>例程9 用过滤器限制Web服务的访问权限</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package com.hellking.study.webservice;

import javax.servlet.FilterChain;
。。。
public class WebServicesFilter implements Filter
{
     //没有权限访问的IP地址
	static final String[] deniedIPList=new String[]{
		               "123.201",
		               "192.168",
		               "25.46",
		               "124.0.0.1"
		            };	
	 public boolean isIPDenied(String ipAddr)
     {
     	…
     }
	
	//过滤处理的方法
	public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
		throws IOException,ServletException
	{
		 HttpServletRequest hreq = (HttpServletRequest)req;
         HttpServletResponse hres = (HttpServletResponse)res;
         //HttpSession session = hreq.getSession();
         String clientIp=req.getRemoteAddr();
         System.out.println("开始过滤。。。");
         if(isIPDenied(clientIp))
		 {
		 	 //验证不成功，让用户登录。
		 	throw new ServletException("无权限访问此Web服务！");
		  }		
		 else
			 {
			 	//验证成功，继续处理
			   chain.doFilter(req,res);		 	

			 }	 
		 	
	}	
	…
}
</font></code></pre></td></tr></tbody></table><br /><p>WebServicesFilter 过滤器限制了deniedIPList中指定的所有客户端。编写了过滤器后，需要在Web应用的部署描述符中指定使用此过滤器，并且把过滤器映射到目标URL上。当然，你也可以开发其它过滤器进行访问控制，比如Web服务客户端登录时，把登录信息保存在HTTP会话中，当客户端访问受限的资源时，读取HTTP会话中客户端信息以决定客户端是否有权限访问目标资源。</p><p>除了编写Servlet过滤器实现类外，还需要在web.xml中对它进行配置，并且把过滤器映射到要过滤的目标URI上。以下是过滤器的部署描述符。</p><br /><a name="N10172"><b>例程10 部署过滤器</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">    &lt;filter&gt;
        &lt;filter-name&gt;WebServicesFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;com.hellking.study.webservice.WebServicesFilter&lt;/filter-class&gt;
    &lt;/filter&gt;    
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;WebServicesFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    </font></code></pre></td></tr></tbody></table><br /><p>url-pattern指定了过滤器要过滤的范围。"/services/*"表示以"/services"开始的URL将全部被过滤，这正是AxisServlet默认的URL。通过上面的配置，只要客户端调用axis Web服务，就会被WebServicesFilter过滤器过滤。如果客户端IP地址在过滤器的deniedIPList中，那么就不能访问目标服务。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1017F"><span class="atitle"><font size="4">使用SSL作为Web服务的传输协议</font></span></a></p><p>Web服务也可以使用SSL作为传输协议。虽然JAX-RPC并没有强制规定是否使用SSL协议，但在tomcat下使用HTTPS协议。</p><p><a name="N10188"><span class="smalltitle"><strong><font size="3">相关知识：</font></strong></span></a></p><p>SSL由两个共同工作的协议组成："SSL 记录协议"（SSL Record Protocol）和"SSL 握手协议"（SSL Handshake Protocol）。SSL 记录协议建立在可靠的传输协议（如TCP）之上，为高层协议提供数据封装、压缩、加密等基本功能的支持；SSL 握手协议建立在SSL记录协议之上，用于在实际的数据传输开始前，通信双方进行身份认证、协商加密算法、交换加密密钥等。</p><p>SSL握手协议包含两个阶段，第一个阶段用于建立私密性通信信道，第二个阶段用于客户认证。第一阶段是通信的初始化阶段，在此阶段，首先SSL要求服务器向浏览器出示证书；然后浏览器中的SSL软件发给服务器一个随机产生的传输密钥，此密钥由已验证过的公钥加密，随机产生的传输密钥是核心机密，只有客户的浏览器和此公司的Web服务器知道这个数字序列。第二阶段的主要任务是对客户进行认证，此时服务器已经被认证了。服务器方向客户发出认证请求消息。客户收到服务器方的认证请求消息后，发出自己的证书，并且监听对方回送的认证结果。而当服务器收到客户的证书后，给客户回送认证成功消息，否则返回错误消息。到此为止，握手协议全部结束。</p><p>要使用SSL协议，服务器至少有一个私有密匙和一个用于验证身份的证书。私有密匙在密匙交换算法中用到，证书将发送到客户端，以通知服务器端的身份。如果SSL服务器要验证客户端的身份，那么客户端必须也有自己的密匙库（包含私有密匙和证书）。JSSE中引入了信任库（truststore）的概念，它是用来保存证书的数据库。客户端或者服务器通过信任库来验证对方的身份。</p><p>在使用SSL前，必须确保系统安装了JSSE。JDK1.4版本默认以及安装了JSSE。如果没有安装，把下载安装好的jar文件拷贝到%JAVA_HOME%\ jre\lib\ext目录下。这样，就安装好了JSSE的运行环境。</p><p>下面我们使用JDK自带的工具创建密匙库和信任库。</p><p>1）通过使用一下的命令来创建服务器端的密匙库。</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">        keytool -genkey -alias hellking -keystore server.keystore -keyalg RSA
输入keystore密码：  changeit
您的名字与姓氏是什么？
  [Unknown]：  hellking-Server
您的组织单位名称是什么？
  [Unknown]：  huayuan
您的组织名称是什么？
  [Unknown]：  huayuan
您所在的城市或区域名称是什么？
  [Unknown]：  beijing
您所在的州或省份名称是什么？
  [Unknown]：  beijing
该单位的两字母国家代码是什么
  [Unknown]：  cn
CN=chen ya qiang, OU=huayuan, O=huayuan, L=beijing, ST=beijing, C=cn 正确吗？
  [否]：  y

输入&lt;hellking&gt;的主密码
        （如果和 keystore 密码相同，按回车）：
        </font></code></pre></td></tr></tbody></table><br /><p>以上命令执行完成后，将获得一个名为server.keystore的密匙库。</p><p>2)生成客户端的信任库。首先输出RSA证书：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">keytool -export -file test_axis.cer -storepass changeit -keystore server.keystore
</font></code></pre></td></tr></tbody></table><br /><p>然后把RSA证书输入到一个新的信任库文件中。这个信任库被客户端使用，被用来验证服务器端的身份。</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">keytool -import -file test_axis.cer -storepass changeit -keystore client.truststore -alias serverkey -noprompt
</font></code></pre></td></tr></tbody></table><br /><p>3）创建客户端密匙库。重复步骤1，创建客户端的密匙库。也可以使用以下命令来完成：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">keytool -genkey -dname " CN=hellking-Client, OU=tsinghua, O=tsinghua, L=BEIJING, S=BEIJING, C=CN"
-storepass changeit -keystore client.keystore -keyalg RSA -keypass changeit
</font></code></pre></td></tr></tbody></table><br /><p>4）生成服务器端的信任库。</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">keytool -export -file test_axis.cer -storepass changeit -keystore client.keystore
keytool -import -file test_axis.cer -storepass changeit -keystore server.truststore -alias clientkey -noprompt
</font></code></pre></td></tr></tbody></table><br /><p>生成了密匙库和信任库，我们把服务器端的密匙库（server.keystore）和信任库（server.truststore）拷贝到Tomcat的某个目录。</p><p>下面需要更改Tomcat的配置文件（server.xml），增加一下部署描述符：</p><br /><a name="N101C9"><b>例程11 为Tomcat配置SSL协议。</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">                  &lt;Connector port="8443" 
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" debug="0" scheme="https" secure="true"
               clientAuth="true" keystoreFile="K:\jakarta-tomcat-5.0.16\server.keystore" keystorePass="changeit"
                 truststoreFile="K:\jakarta-tomcat-5.0.16\server.truststore" truststorePass="changeit"
               sslProtocol="TLS" /&gt;
               </font></code></pre></td></tr></tbody></table><br /><p>clientAuth参数制定服务器是否要验证客户端证书，如果指定为true，那么客户端必须拥护服务器端可信任的证书后服务器才能响应客户端；如果指定为false，那么服务器不需要验证客户端的证书。</p><p>在此，我们又把PersonalTaxService部署一次，在server-config.wsdd中添加如下部署代码。</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;service name="PersonalTaxService3" provider="java:RPC"&gt;
  &lt;parameter name="allowedMethods" value="*"/&gt;
  &lt;parameter name="className" value="/blog/com.hellking.study.webservice.PersonalTaxService"/&gt;
  &lt;/service&gt;
</font></code></pre></td></tr></tbody></table><br /><p>最后我们需要修改客户端调用程序，如例程12所示。</p><br /><a name="N101E0"><b>例程12 SSL客户端调用程序</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package com.hellking.study.webservice;
….
public class SSLAuthClient
{
	static	final double salary=5000;
    public static void main(String [] args)
    {
        try {
        	//服务端的url，注意使用了SSL协议后，前缀是https。 
           String endpointURL = "https://localhost:8443/axis/services/PersonalTaxService3?wsdl";
           ….
            //由于使用了证书数字证书，所以不使用用户名和密码验证。
//call.getMessageContext().setUsername("hellking");。
            //call.getMessageContext().setPassword("simplewebservices");
           ….
            Double ret = (Double) call.invoke( new Object [] { new Double(salary) });
			System.out.println("使用SSL协议来作为Web服务的传输协议！");		
             System.out.println("已经成功调用。请参看服务端的输出!");
             System.out.println("输入工资"+salary+"元，应交个人所得税："+ret);
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
}
</font></code></pre></td></tr></tbody></table><br /><p>最后使用一下的命令来执行客户端程序：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">set AXIS_LIB=K:\jakarta-tomcat-5.0.16\webapps\axis\WEB-INF\lib
SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j.jar.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%
\saaj.jar;%AXIS_LIB%\commons-discovery.jar;%AXIS_LIB%\commons-logging.jar
java -Djavax.net.ssl.keyStore=client.keystore \
-Djavax.net.ssl.keyStorePassword=changeit \
-Djavax.net.ssl.trustStore=client.truststore \
com.hellking.study.webservice.SSLAuthClient
</font></code></pre></td></tr></tbody></table><br /><p>参数解释：通过-Djavax.net.ssl.keyStore来指定客户端密匙库，-Djavax.net.ssl.trustStore来指定客户端信任库。</p><p>最后的输出结果如下：</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">使用SSL协议来作为Web服务的传输协议！
已经成功调用。请参看服务端的输出!
输入工资5000.0元，应交个人所得税：445.0
</font></code></pre></td></tr></tbody></table><br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><font face="Lucida Console"><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></font></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><font face="Lucida Console"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /></font><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><font face="Lucida Console"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></font></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101FB"><span class="atitle"><font size="4">总结、下一步</font></span></a></p><p>使用Web应用模型中基本认证方法来配置Web服务的安全访问以及使用axis的Handler、Servlet的过滤器来进行访问控制，它们都是一些轻量级控制Web服务安全解决方案，因为都是把未加密的信息在网络上传播。使用了SSL作为传输协议后，信息在网络上是加密传输的，但对资源消耗多，并且对客户端要求严格（必须支持SSL），不能满足Web服务访问的便利性。下一部分将介绍怎么在安全性要求高的环境下在axis开发工具里实现WS-Security。</p><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/src.rar"><font color="#5c81a7">下载样例代码在此。</font></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="resources"><span class="atitle"><font size="4">参考资料 </font></span></a></p><ul><li><a href="http://www.xmltrustcenter.org/"><font color="#5c81a7">VeriSign Trust Services Integration Kit</font></a><br /><br /></li><li><a href="http://www-128.ibm.com/developerworks/cn/security/se-tcssl/index.shtml"><font color="#5c81a7">配置Tomcat 4使用SSL</font></a><br /><br /></li><li><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-jax-rpc/part1/index.shtml"><font color="#996699">用JAX-RPC开发Web服务：Servlet作为Web服务端点</font></a><br /><br /></li><li><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-theme/ws-security.shtml"><font color="#5c81a7">Web 服务安全专题</font></a><br /><br /></li><li><a href="http://ws.apache.org/axis/"><font color="#996699">Apache axis User's Guides：http://ws.apache.org/axis/</font></a><br /><br /></li><li><a href="http://java.sun.com/webservices"><font color="#5c81a7">JAX-RPC API</font></a><br /><br /></li><li><a href="http://www.netscape.com/eng/ssl3/"><font color="#5c81a7">SSL3.0规范</font></a><br /><br /></li><li><a href="http://java.sun.com/products/jdk/1.2/docs/tooldocs/solaris/keytool.html"><font color="#5c81a7">Keytool－ Key and Certificate Management Tool</font></a><br /><br /></li><li><a href="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/ssl-howto.html"><font color="#5c81a7">The Tomcat 5 Servlet/JSP Container SSL Configuration HOW-TO</font></a><br /><br /></li><li><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-handler/index.shtml"><font color="#5c81a7">J2EE Web服务开发系列之六: 使用Handler来增强Web服务的功能</font></a><br /></li></ul><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-secaxis1/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="author"><span class="atitle"><font size="4">关于作者</font></span></a></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td colspan="3"><font size="4"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></font></td></tr><tr valign="top" align="left"><td><p><font size="4"></font></p></td><td><font size="4"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></font></td><td width="100%"><p>陈亚强：北京华园天一科技有限公司高级软件工程师，擅长J2EE技术，曾参与多个J2EE项目的设计和开发，对Web服务有很大的兴趣并且有一定的项目经验。热爱学习，喜欢新技术，曾参与多本图书的写作。好交朋友，您可以通过 <a href="mailto:cyqcims@mail.tsinghua.edu.cn"><font color="#5c81a7">cyqcims@mail.tsinghua.edu.cn</font></a>和他联系。</p></td></tr></tbody></table><img src ="http://www.blogjava.net/wangxinsh55/aggbug/61834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:07 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SOAP开发java web服务--Axis开发方案</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61832.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61832.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61832.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61832.html</trackback:ping><description><![CDATA[
		<div class="postText">本文的预定读者首先要对j2ee有所了解，熟悉xml，tomcat等基本内容，本文主要是简单介绍一下web服务的基本内容，怎样在java web开发中构建SOAP服务：<br /> 一、SOAP（Simple Object Access Protocol）简单对象访问协议，要了解SOAP，首先就需要了解分布式计算的由来，随着下一代的分布式计算体系web服务的出现，SOAP成为了创建和调用通过网络发布的应用程序的实际通信标准。SOAP类似传统的二进制协议IIOP（CORBA）和JRMP（RMI），但它不采用二进制数据表示法，而是采用使用XML的，基于文本的数据表示法。<br />        通过XML表示法，SOAP定义了一种小型有线连接协议和编码格式，以表示数据类型、编程语言和数据库，还可以使用各种Internet标准协议作为其消息传输工具，还可以提供表示RPC和文档驱动的消息交换等通信模型的约定。请注意，W3C正致力于SOAP的研究，<a href="http://www.w3c.org/2000/xp/Group/"><font color="#000080">http://www.w3c.org/2000/xp/Group/</font></a> ，并得到了主流供应商的积极响应，以便对于基于XML的协议相关的重要任务达成共识，并定义其关键要求和使用场景。<br />        SOAP1.2的基本规范定义了以下基本内容：<br />       1）用于将XML文档表示为结构化SOAP消息的语法和语义<br />       2）在SOAP消息中表示数据的编码标准<br />       3）用于交换SOAP消息的通信模型<br />       4）SOAP传输等底层协议的绑定<br />      SOAP消息主要包括了信封头，消息头，主体，附件几部分<br />      一个简单的SOAP消息表示：<br />      POST   /StudentInfo   HTTP/1.1<br />      Host：anthropology.cun.edu<br />      Content-Type: text/xml;charset="utf-8"<br />      Content-Length: 640<br />      SOAPAction:  "GetStudentInfo"<br /><br />     &lt;SOAP-ENV:Envelop xmlns:SOAP-ENV="<a href="http://www.w3c.org/2001/06/soap-envelope"><font color="#000080">http://www.w3c.org/2001/06/soap-envelope</font></a>"<br />              xmlns:xsi="<a href="http://www.w3c.org/2001/XMLSchema-instance"><font color="#000080">http://www.w3c.org/2001/XMLSchema-instance</font></a>"<br />              xmlns:xsd="<a href="http://www.w3c.org/2001/XMLSchema"><font color="#000080">http://www.w3c.org/2001/XMLSchema</font></a>"<br />             SOAP-ENV:encodingStyle="http://www.w3c.org/2001/06/soap-encoding"&gt;<br />        &lt;SOAP-ENV:Header&gt;<br />            &lt;person:mail xmlns:person="http://www.cun.edu/Header"&gt;xyz@cun.edu<br />        &lt;/SOAP-ENV:Header&gt; <br /><br />        &lt;SOAP-ENV:Body&gt;<br />            &lt;m:GetStudentInfo   xmlns:m="http://www.cun.edu/jws.student.studentInfo"&gt;<br />                 &lt;student_name xsi:type='xsd:string'&gt;<br />                        Wang wen yin<br />                 &lt;/student&gt;<br />             &lt;/m:GetStudentInfo&gt;<br />        &lt;/SOAP-ENV:Body&gt;<br />    &lt;/SOAP-ENV:Envelop&gt;<br />   以上是1.2版本命名空间，1.1的命名空间 SOAP ENVELOPE：<a href="http://schemas.xmlsoap.org/soap/envelop/"><font color="#000080">http://schemas.xmlsoap.org/soap/envelop/</font></a> ,SOAP ENCODING: <a href="http://schemas.xmlsoap.org/soap/encoding/"><font color="#000080">http://schemas.xmlsoap.org/soap/encoding/</font></a> <br />   关于SOAP编码规范请参阅<a href="http://www.w3c.org/TR/xmlschema-2/"><font color="#000080">www.w3c.org/TR/xmlschema-2/</font></a> 定义的编码值，其他的一些规范可以上<a href="http://www.w3c.org/"><font color="#000080">www.w3c.org</font></a> 上具体查看。<br />二、以下从实际例子来学习，这里我使用的是Apache的一个子项目Axis的具体例子，便于深入了解soap的运行：<br />    1）下载Axis的相关内容<a href="http://ws.apache.org/axis/"><font color="#000080">http://ws.apache.org/axis/</font></a>：<br />    2）建立一个实例程序（遵守j2ee的web程序规范），如（WebServiceTest目录）<br />          把axis中lib文件夹的内容拷到你的WebServiceTest/WEB-INF/lib下，同时上网下载xerces(下载地点：<a href="http://xml.apache.org/xerces-j/"><font color="#000080">http://xml.apache.org/xerces-j/</font></a>）解释器的包文件xerces.jar，也拷到WebServiceTest/WEB-INF/lib文件夹下,（若要配置log4j，请把属性文件log4j.properties拷到WebServiceTest/WEB-INF/classes文件夹下)<br />    3)修改应用程序WebServiceTest/WEB-INF中的web.xml文件：主要servlet设置如下<br />       &lt;servlet&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;servlet-class&gt;org.apache.axis.transport.http.AxisServlet&lt;/servlet-class&gt;<br />      &lt;/servlet&gt;<br />      &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br />     &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;/servlet/TestServlet&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br />  <br />    &lt;servlet-mapping&gt;<br />              &lt;servlet-name&gt;TestServlet&lt;/servlet-name&gt;<br />              &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt; 
<p><br />     &lt;servlet&gt;<br />          &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;<br />          &lt;servlet-class&gt;<br />               org.apache.axis.transport.http.AdminServlet<br />          &lt;/servlet-class&gt;<br />          &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;<br />     &lt;/servlet&gt;<br /> <br />     &lt;servlet-mapping&gt;<br />          &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;<br />          &lt;url-pattern&gt;/servlet/AdminServlet&lt;/url-pattern&gt;<br />     &lt;/servlet-mapping&gt;<br /> <br />     &lt;mime-mapping&gt;<br />          &lt;extension&gt;wsdl&lt;/extension&gt;<br />          &lt;mime-type&gt;text/xml&lt;/mime-type&gt;<br />     &lt;/mime-mapping&gt;<br /> <br />     &lt;mime-mapping&gt;<br />          &lt;extension&gt;xsd&lt;/extension&gt;<br />          &lt;mime-type&gt;text/xml&lt;/mime-type&gt;<br />     &lt;/mime-mapping&gt;<br />    你现在可以在网址里输入<a href="http://localhost/WebServiceTest/servlet/TestServlet"><font color="#000080">http://localhost/WebServiceTest/servlet/TestServlet</font></a> 看到了吗？Axis是使用axis.jar包里的org.apache.axis.transport.http.AxisServlet对应用程序进行处理的，基本配置就讲到这里。<br />三、接着我们来说Axis中的内核。<br />1）不使用Tomcat引擎运行Axis。<br />       先建立一个脚步文件，对环境变量classpath进行设置要把lib下的那些包文件的路径全都包括进去，运行：java  org.apache.axis.transport.http.SimpleAxisServer  &lt;port&gt;<br /> 2）内部服务处理程序是org.apache.axis.providers.java.RPCProvider，标志出服务所需的方法，然后提供从SOAP请求消息组成部分的参数。<br /> 3）Axis的应用程序端管理功能：<br />       java  org.apache.axis.client.AdminClient 就会列出参数，可供你选择。我们的例子是：java  org.apache.axis.client.AdminClient  -l <a href="http://localhost/WebserviceTest/servlet/TestServlet"><font color="#000080">http://localhost/WebserviceTest/servlet/TestServlet</font></a>  list 就会显示出服务列表，返回的是xml文件<br />4）wsdl2java应用程序可以把wsdl文件创建基于java的程序，如占位程序等<br />     java  org.apache.axis.wsdl.WSDL2java  &lt;url&gt;<br />Axis的基本内容说到这里<br />四、具体例子<br /> 1）编写逻辑程序，简单如：SoapTest.java<br />    public class SoapTest{<br />        public String getStr(String name){<br />            return "Hello，"+name;<br />        }<br />    }<br />  2) 部署服务，编写wsdd文件SoapTest_deploy.wsdd:<br />     &lt;deployment name="SimapleTest" xmlns="<a href="http://xml.apache.org/axis/wsdd/"><font color="#000080">http://xml.apache.org/axis/wsdd/</font></a>"<br />         xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><font color="#000080">http://xml.apache.org/axis/wsdd/providers/java</font></a>"<br />         xmlns:xsd="<a href="http://www.w3.org/2000/10/XMLSchema"><font color="#000080">http://www.w3.org/2000/10/XMLSchema</font></a>"<br />         xmlns:xsi="<a href="http://www.w3.org/2000/10/XMLSchema-instance"><font color="#000080">http://www.w3.org/2000/10/XMLSchema-instance</font></a>"&gt;<br />             &lt;service name="SoapTest" provider="java:RPC"&gt;<br />                  &lt;parameter name="className" value="SoapTest"/&gt;<br />                  &lt;parameter name="allowedMethods" value="getStr"/&gt;<br />             &lt;/service&gt;<br />    &lt;/deployment&gt;<br />    其中className参数是你的想部署的类名（全名），allowedMethods是调用的服务的方法，如果有多个方法的话可以用空格分开（如： &lt;parameter name="allowedMethods" value="getStr  getMoney"/&gt;),当用*的时候表示全部。<br />     好了现在准备部署了，确保环境路径classpath设置正确，运行：<br />        java  org.apache.axis.client.AdminClient  -l  <a href="http://localhost/WebserviceTest/servlet/TestServlet"><font color="#000080">http://localhost/WebserviceTest/servlet/TestServlet</font></a>  SoapTest_deploy.wsdd<br />     （这里不懂的话，请参考以上的说明） <br /> ok，呵呵，至此，我们已经完成了一个web服务的部署：测试<a href="http://localhost/WebServiceTest/servlet/TestServlet"><font color="#000080">http://localhost/WebServiceTest/servlet/TestServlet</font></a>  看里面是否多了一个选择SoapTest服务？<br />      如果不想要服务了那重新编写一个wsdd文件，内容改为：<br />&lt;deployment name="SimapleTest" xmlns="<a href="http://xml.apache.org/axis/wsdd/"><font color="#000080">http://xml.apache.org/axis/wsdd/</font></a>"<br />         xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><font color="#000080">http://xml.apache.org/axis/wsdd/providers/java</font></a>"<br />         xmlns:xsd="<a href="http://www.w3.org/2000/10/XMLSchema"><font color="#000080">http://www.w3.org/2000/10/XMLSchema</font></a>"<br />         xmlns:xsi="<a href="http://www.w3.org/2000/10/XMLSchema-instance"><font color="#000080">http://www.w3.org/2000/10/XMLSchema-instance</font></a>"&gt;<br />            &lt;service name="SoapTest"/&gt;<br />&lt;/deployment&gt;<br />和上面一样，对比一下就ok了。<br />五、客户端测试：<br />     客户端我们也可以使用java来进行测试，网上也有资料的，你可以去学习，很简单的。现在为了体现web服务的魅力，我用.NET平台来测试吧，客户端使用c#编写（先要安装.net framework sdk)：<br />    1）通过wsdl生成web服务代理，在net平台下运行：<br />      wsdl  /l:CS  /protocol:SOAP  /out:SoapTestClient.cs  <a href="http://localhost/WebserviceTest/services/SoapTest?wsdl"><font color="#000080">http://localhost/WebserviceTest/services/SoapTest?wsdl</font></a>  <br />        我们通过wsdl得到了一个cs文件SoapTestClient.cs（当前目录），你可以打开cs文件，研究一下里面的代码，那个getStr(string name)就是我们需要调用的方法，我们的客户端通过调用该方法就可以调用服务器端的方法，内部的转化wsdl.exe工具已经帮我们完成了，axis下的WSDL2Java工具也是一样的功能，可以参考我上面所说的关于Axis的内核内容<br />   2)编译cs文件成程序集dll：<br />      csc /target:library /r:System.Web.Services.dll  /r:System.Xml.dll SoapTestClient.cs<br />      最后我们等到了一个dll文件SoapTestClient.dll，客户端程序通过调用它就行了<br />   3）编写客户端应用程序SoapTestClientApp.cs<br />      using System;<br />      <br />      namespache  jws.client{<br />         public class SoapTestClientApp{<br />            public SoapTestClientApp(){<br />            }<br />            public static void Main(string[] args){<br />                if(args.Length!=1){<br />                    Console.WriteLine("Usage:SoapTestClientApp &lt;name&gt;");<br />                    Environment.Exit(1);<br />                }<br />                SoapTestService  st_service=new SoapTestService();<br />                st_service.getStr("Wang wenyin");<br />           }<br />        } <br />     }<br />４）编译文件csc  /r:SoapTestClient.dll  SoapTestClientApp.cs<br />    运行SoapTestClientApp<br />输出结果：<br />     Hello,Wang wenyin<br />与预期结果相符。<br /></p></div>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/61832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:06 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService学习，开发总结</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61831.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 04 Aug 2006 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61831.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/61831.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/61831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/61831.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基本概念：																						1，什么是 Web 服务？												Web 				是使应用程序可以以与平台和编程语言无关的方式进行相互通信的一项技术。Web 服务是一个软件接口，它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61831.html'>阅读全文</a><img src ="http://www.blogjava.net/wangxinsh55/aggbug/61831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-08-04 20:04 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/08/04/61831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于XML（XMLHTTP）跨域加载数据不会出现跨域的安全提示信息的问题</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38259.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 30 Mar 2006 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38259.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/38259.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38259.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/38259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/38259.html</trackback:ping><description><![CDATA[ 网上看了很多资料，但好象很少人谈到跨域读取XML文档的问题，有些论坛或BLOG关于XML跨域读取的问题，实现起来非法复杂。 <br />在这里我介绍一下XMLHTTP跨域读取页面数据的问题，以JS为例 <br /><br />一、读取数据 <br /><br />//建立对象<br />var xml = new ActiveXObject("Microsoft.XMLHTTP")<br /><br />//这里的abc.xml是被读取的文件，当然也可以换成别的文件，false表示非异步传输，async是asynchronism简写 <br />xml.open("get","<img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" /><a href="http://www.mydomain.com/abc.xml&quot;,false)" target="_blank">http://www.mydomain.com/abc.xml",false)</a>  <br />xml.send()<br /><br /><br />二、在被读取数据的域根下（上例是在www.mydomain.com/下），建立一个XML 策略文件，名字一定要是crossdomain.xml。<br /><br />在策略文件中加入以下代码<br />&lt;?xml version="1.0"?&gt;<br />&lt;cross-domain-policy&gt;<br />    &lt;allow-access-from domain="www.mydomain.com"/&gt; //domain属性的值就是被允许从本站读取数据的来源域名<br />&lt;/cross-domain-policy&gt;<br /><br /><br />这样就完成了跨域读取数据并不会出现跨域的安全提示信息了<br /><img src ="http://www.blogjava.net/wangxinsh55/aggbug/38259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-03-30 15:02 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis开发之Stubs方式 </title><link>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38234.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 30 Mar 2006 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38234.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/38234.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/38234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/38234.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>1、建立代理接口文件<br />public interface ISendSms extends java.rmi.Remote {<br />    public String getUser(String id,String type);<br />}</p>
				<p>转到在目录..\WebRoot\WEB-INF\classes下:</p>
				<p>2、生成client stub文件, 生成SendSms.wsdl文件<br />java -Djava.ext.dirs=../lib org.apache.axis.wsdl.Java2WSDL -oSendSms.wsdl -lhttp://localhost:8080/websms/services/SendSms -n"urn:SendSms" -p"sample.webservice" "urn:SendSms" sample.webservice.ISendSms</p>
				<p>生成的SendSms.wsdl文件中，参数名称默认为in1,in2等，需要改成相应的名称。</p>
				<p>3、生成client stub<br />java -Djava.ext.dirs=../lib org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true -Nurn:SendSms sample.webservice SendSms.wsdl</p>
				<p>生成的文件列表如下:<br />deploy.wsdd<br />undeploy.wsdd<br />ISendSms.java<br />ISendSmsService.java<br />ISendSmsServiceLocator.java<br />SendSmsSoapBindingImpl.java<br />SendSmsSoapBindingSkeleton.java<br />SendSmsSoapBindingStub.java</p>
				<p>4、布署服务,在WEB-INF目录下生成server-config.wsdd文件, 随Tomcat启动自动加载里面定义的服务<br />转到目录..\WebRoot\WEB-INF\classes\sample\webservice下<br />java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/websms/services/AdminService deploy.wsdd</p>
				<p>在Axis里书写deploy.wsdd并利用org.apache.axis.client.AdminClient发布，其主要工作就是把&lt;service&gt;标签中的内容添加在server-config.wsdd里，所以一般直接编辑server-config.wsdd文件会更方便一些。不过当你还没有server-config.wsdd文件时，使用deploy.wsdd的方法会更方便些，因为AdminClient会帮你生成一些额外的xml元素（&lt;handler&gt;等等），而这些元素是必要的。<br /><br />5、项目中加入Axis所需的包, web.xml加入相关定义<br />  &lt;display-name&gt;Apache-Axis&lt;/display-name&gt;<br />  &lt;servlet&gt;<br />    &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;<br />    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;<br />    &lt;servlet-class&gt;<br />        org.apache.axis.transport.http.AxisServlet<br />    &lt;/servlet-class&gt;<br />  &lt;/servlet&gt;<br />  &lt;servlet&gt;<br />    &lt;display-name&gt;Axis Admin Servlet&lt;/display-name&gt;<br />    &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;<br />    &lt;servlet-class&gt;<br />        org.apache.axis.transport.http.AdminServlet<br />    &lt;/servlet-class&gt;<br />    &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;<br />  &lt;/servlet&gt;<br />  &lt;servlet-mapping&gt;<br />    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;<br />    &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />  &lt;/servlet-mapping&gt;</p>
				<p>通过<a href="http://localhost:8080/websms/services/SendSms?wsdl">http://localhost:8080/websms/services/SendSms?wsdl</a>来查看WSDL描述了</p>
				<p>6、测试代码<br />public static void main(String[] args) {<br />  try{<br />  /*ISendSmsService service = new ISendSmsServiceLocator();<br />   ISendSms sender = service.getSendSms();<br />   String result = sender.send("cid","cname");<br />   System.out.println("call result:"+result);*/<br />   String tvServiceURL = "<a href="http://localhost:8080/websms/services/SendSms">http://localhost:8080/websms/services/SendSms</a>"; //web service 地址<br />   java.net.URL endpointURL = new java.net.URL(tvServiceURL);<br />   String result = "ok";<br />   result = new SendSmsSoapBindingStub(endpointURL,null).send("id","cname");<br />   System.out.println("call result:"+result);<br />  }<br />  catch(Exception ex){<br />   ex.printStackTrace();<br />  }<br /> }<br /><br />我们还可以通过IE浏览器直接调用服务，方法是在服务URL后加“method=xxx”，其中xxx是要调用的方法名称。例如可以通过<a href="http://localhost:8080/websms/services/SendSms?method=send&amp;userId=uid">http://localhost:8080/websms/services/SendSms?method=send&amp;userId=uid</a>&amp;...调用方法。<br />====================================================================================<br />另外,  也可能过新建一个deploy.wsdd文件，通过这个文件直接布署我们的服务<br />java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/websms/services/SendSms deploy.wsdd<br />// 它会在WEB-INF目录生成server-config.wsdd文件, 若此文件已存在, 它会在文件加入当前服务的注册。</p>
				<p>生成wsdl文件<br />java -Djava.ext.dirs=../lib org.apache.axis.wsdl.Java2WSDL -oSendSms.wsdl -lhttp://localhost:8080/websms/services/SendSms -nsendsms sample.webservice.SendSms</p>
				<p>生成客户端文件<br />java -Djava.ext.dirs=../lib org.apache.axis.wsdl.WSDL2Java SendSms.wsdl -p client<br /><br />***************************************************************************************<br />org.apache.axis.wsdl.Java2WSDL  中的命令解释<br />-o  ：生成的WSDL文件<br />-l   ：Web服务的位置<br />-n  ：WSDL文件的名字空间<br />-p  ：包到名字空间的映射</p>
				<p>***************************************************************************************</p>
				<p>
				</p>java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true <br /><pre><code>-Nurn:BookServletService com.hellking.webservice.servlet temp.wsdl</code></pre><p>使用这个命令后将生成以下文件：</p><p>BookServiceInterface.java：新的BookServiceInterface接口，它扩展了java.rmi.Remote接口；</p><p>BookServiceInterfaceService.java：客户端服务接口，用来获得BookServiceInterface对象的引用；</p><p>BookServiceInterfaceServiceLocator.java：在客户端使用，主要用来服务定位；</p><p>BookServletServiceSoapBindingImpl.java：服务端实现类，它实现了BookServiceInterface接口，服务端的业务方法实现代码就在这里编写；</p><p>BookServletServiceSoapBindingSkeleton.java：服务端Skeleton；</p><p>BookServletServiceSoapBindingStub.java：客户端Stub；</p><p>BookVO.java：新的BookVO序列化对象；</p><p>deploy.wsdd：部署这个Web服务的脚本；</p><p>undeploy.wsdd：卸载这个Web服务的脚本。</p></div>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/38234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-03-30 12:55 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis 开发 web service 实战</title><link>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38233.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 30 Mar 2006 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38233.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/38233.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/38233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/38233.html</trackback:ping><description><![CDATA[
		<span id="LblContent">一、axis安装<br />1.环境<br />  J2SE SDK 1.3 or 1.4:  我使用 1.4.2<br />   Servlet Container: 我使用Tomcat 5.0 <br />2.到 <a href="http://ws.apache.org/axis/">http://ws.apache.org/axis/</a>网站下载axis安装包<br />3.解压缩安装包，将AXIS_UNZIP_PATH\axis-version\webapps下的axis包拷贝到TOMCAT_HOME\webapps\下，<br />    以下约定AXIS_HOME为该TOMCAT_HOME\webapps\axis目录<br />4.启动tomcat,访问<a href="http://localhost:8080/axis">http://localhost:8080/axis</a> 检查安装是否成功<br />5.以上步骤执行成功，可以开发webservice例子了<br /><br />axis支持三种web service的部署和开发，分别为：<br />1。Dynamic Invocation Interface ( DII)<br />2。 Stubs方式<br />3。Dynamic Proxy方式<br /><br />以下逐一讲述web service在axis上的部署和开发，设置classpath<br />set CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;E:/thirdparty/activation/activation.jar;E:/thirdparty/activation/mail.jar<br /><br /><br /><br />二、编写DII(Dynamic Invocation Interface )方式web服务<br />1.编写服务端程序HelloClient<br />public class HelloClient {<br />    public String getName(String name)<br />    {<br />        return "hello "+name;<br />    }<br />}<br /><br />2.将源码拷贝到AXIS_HOME下，重命名为 HelloClient.jws<br />3.访问连接<a href="http://localhost:8080/axis/HelloClient.jws?wsdl">http://localhost:8080/axis/HelloClient.jws?wsdl</a>，页面显示axis自动生成的wsdl<br />4.编写访问服务的客户端 TestHelloClient.java<br /><br />import org.apache.axis.client.Call;<br />import org.apache.axis.client.Service;<br />import javax.xml.namespace.QName;<br />import javax.xml.rpc.ServiceException;<br />import java.net.MalformedURLException;<br />import java.rmi.RemoteException;<br /><br />public class SayHelloClient2 {<br />    public static void main(String[] args) {<br />        try {<br />            String endpoint = "http://localhost:8080/axis/HelloClient.jws";<br /><br />            Service service = new Service();<br />            Call call = null;<br /><br />            call = (Call) service.createCall();<br /><br />            call.setOperationName(new QName(<br />                    "http://localhost:8080/axis/HelloClient.jws", "getName"));<br />            call.setTargetEndpointAddress(new java.net.URL(endpoint));<br /><br />            String ret = (String) call.invoke(new Object[] {"zhangsan"});<br />            System.out.println("return value is " + ret);<br />        } catch (Exception ex) {<br />            ex.printStackTrace();<br />        }<br />    }<br />}<br />三、编写Dynamic Proxy方式访问服务<br />1.编写部署服务端程序，同上边DII方式，本次仍使用上边部署的HelloClient<br />2.编写代理接口<br />public interface HelloClientInterface extends java.rmi.Remote {<br />    public String getName(String name) throws java.rmi.RemoteException;<br />}<br />3.编写并执行客户端程序TestHelloClient.java<br /><br />import javax.xml.rpc.Service;<br />import javax.xml.rpc.ServiceFactory;<br />import java.net.URL;<br />import javax.xml.namespace.QName;<br /><br />public class TestHelloClient {<br />    public static void main(String[] args) {<br />        try<br />        {<br />            String wsdlUrl = "http://localhost:8080/axis/HelloClient.jws?wsdl";<br />            String nameSpaceUri = "http://localhost:8080/axis/HelloClient.jws";<br />            String serviceName = "HelloClientService";<br />            String portName = "HelloClient";<br /><br />            ServiceFactory serviceFactory = ServiceFactory.newInstance();<br />            Service afService = serviceFactory.createService(new URL(wsdlUrl),<br />                    new QName(nameSpaceUri, serviceName));<br />            HelloClientInterface proxy = (HelloClientInterface)<br />                                           afService.getPort(new QName(<br />                    nameSpaceUri, portName), HelloClientInterface.class);<br />            System.out.println("return value is "+proxy.getName("john") ) ;<br />        }catch(Exception ex)<br />        {<br />            ex.printStackTrace() ;<br />        }<br />    }<br />}<br /><br />四、编写wsdd发布web服务，编写stub client访问web服务<br /><br />1.编写服务端程序server,SayHello.java，编译server.SayHello.java    <br />package server;<br />public class SayHello {<br />    public String getName(String name)<br />    {<br />        return "hello "+name;<br />    }<br />}<br />2.编写LogHandler.java<br />import org.apache.axis.AxisFault;<br />import org.apache.axis.Handler;<br />import org.apache.axis.MessageContext;<br />import org.apache.axis.handlers.BasicHandler;<br /><br />import java.util.Date;<br /><br />public class LogHandler extends BasicHandler {<br />    public void invoke(MessageContext msgContext) throws AxisFault<br />    {<br />        /** Log an access each time we get invoked.<br />         */<br />        try {<br />            Handler serviceHandler = msgContext.getService();<br /><br />            Integer numAccesses =<br />                             (Integer)serviceHandler.getOption("accesses");<br />            if (numAccesses == null)<br />                numAccesses = new Integer(0);<br /><br />            numAccesses = new Integer(numAccesses.intValue() + 1);<br /><br />            Date date = new Date();<br />            String result = date + ": service " +<br />                            msgContext.getTargetService() +<br />                            " accessed " + numAccesses + " time(s).";<br />            serviceHandler.setOption("accesses", numAccesses);<br /><br />            System.out.println(result);<br />        } catch (Exception e) {<br />            throw AxisFault.makeFault(e);<br />        }<br />    }<br />}<br />3..编写wsdd文件<br />deploy.wsdd<br />&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"<br />            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;           <br />        <br /> &lt;handler name="print" type="java:LogHandler"/&gt; <br /> &lt;service name="sayhello" provider="java:RPC"&gt;<br />   &lt;requestFlow&gt;<br />     &lt;handler type="print"/&gt;<br />   &lt;/requestFlow&gt;<br />  &lt;parameter name="className" value="server.SayHello"/&gt;<br />  &lt;parameter name="allowedMethods" value="*"/&gt;  <br /> &lt;/service&gt;<br />&lt;/deployment&gt;<br /><br />3.将编译后的文件拷贝到AXIS_HOME/WEB-INF/classes下，如：D:\tomcat\webapps\axis\WEB-INF\classes<br />4.发布服务：<br />java org.apache.axis.client.AdminClient deploy.wsdd<br />5.生成client stub文件<br />   a:方式1<br />      将SayHello.java拷贝到AXIS_HOME/下，重命名为SayHello.jws，执行下面的命令生存client stub<br />      java org.apache.axis.wsdl.WSDL2Java  -p client  http://localhost:8080/axis/services/SayHello.jws?wsdl<br />    b:方式2<br />    执行如下命令生成SayHello.wsdl<br />         java org.apache.axis.wsdl.Java2WSDL -oSayHello.wsdl -lhttp://localhost:8080/axis/services/SayHello -nsayhello server.SayHello<br />          执行如下命令生成client stub<br />      java org.apache.axis.wsdl.WSDL2Java  SayHello.wsdl  -p client<br />   生成的stub client文件列表为：<br />   1。SayHello.java<br />   2。SayHelloService.java。<br />   3。SayHelloServiceLocator.java<br />   4。SayHelloSoapBindingStub.java<br />6.编写客户端程序，编译并执行<br />public class SayHelloClient {<br />    public static void main(String[] args) {<br />        try {<br />            <br />            SayHelloService service = new client.<br />                                               SayHelloServiceLocator();<br />            client.SayHello_PortType client = service.getSayHello();<br />            String retValue=client.getName("zhangsan");<br />            System.out.println(retValue);<br /><br />            <br />        } catch (Exception e) {<br />            System.err.println("Execution failed. Exception: " + e);<br />        }<br />    }<br />}<br /></span>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/38233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2006-03-30 12:54 <a href="http://www.blogjava.net/wangxinsh55/archive/2006/03/30/38233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>