﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-狼爱上狸-随笔分类-AXIS</title><link>http://www.blogjava.net/waterjava/category/23480.html</link><description>闻道有先后  术业有专攻</description><language>zh-cn</language><lastBuildDate>Tue, 03 Jul 2007 07:16:56 GMT</lastBuildDate><pubDate>Tue, 03 Jul 2007 07:16:56 GMT</pubDate><ttl>60</ttl><item><title>不同种类的webservice错误信息</title><link>http://www.blogjava.net/waterjava/archive/2007/07/01/127362.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Sun, 01 Jul 2007 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/07/01/127362.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/127362.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/07/01/127362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/127362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/127362.html</trackback:ping><description><![CDATA[<p>下面是调试web service时，不同种种类的异常情况，以供调试参考<br></p>
<p><br>缺少的jar文件请加在classpath中，注意检查，classpath文件前面不要有空格。<br><br>缺少axis.jar<br>javax.xml.rpc.ServiceException: java.lang.ClassNotFoundException: org.apache.axis.client.ServiceFactory<br>&nbsp;at javax.xml.rpc.ServiceFactory.newInstance(ServiceFactory.java:69)<br>&nbsp;at com.company.project.remote.WebServiceClient.main(WebServiceClient.java:24)</p>
<p>缺少saaj.jar<br>Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException<br>&nbsp;at org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)<br>&nbsp;at org.apache.axis.AxisEngine.init(AxisEngine.java:172)<br>&nbsp;at org.apache.axis.AxisEngine.<init>(AxisEngine.java:156)<br>&nbsp;at org.apache.axis.client.AxisClient.<init>(AxisClient.java:52)<br>&nbsp;at org.apache.axis.client.Service.getAxisClient(Service.java:104)<br>&nbsp;at org.apache.axis.client.Service.<init>(Service.java:157)<br>&nbsp;at org.apache.axis.client.ServiceFactory.createService(ServiceFactory.java:198)<br>&nbsp;at com.company.project.remote.WebServiceClient.main(WebServiceClient.java:26)</p>
<p>缺少wsdl4j.jar<br>Exception in thread "main" java.lang.NoClassDefFoundError: javax/wsdl/extensions/mime/MIMEContent<br>&nbsp;at org.apache.axis.wsdl.gen.Parser.run(Parser.java:297)<br>&nbsp;at org.apache.axis.client.Service.initService(Service.java:243)<br>&nbsp;at org.apache.axis.client.Service.<init>(Service.java:165)<br>&nbsp;at org.apache.axis.client.ServiceFactory.createService(ServiceFactory.java:198)<br>&nbsp;at com.company.project.remote.WebServiceClient.main(WebServiceClient.java:26)</p>
<p>错误的URL<br>javax.xml.rpc.ServiceException: Error processing WSDL document:&nbsp; <br>java.net.UnknownHostException: <a href="http://www.xmethods.com/"><u><font color=#0000ff>www.xmethods.com</font></u></a><br>&nbsp;at org.apache.axis.client.Service.initService(Service.java:250)<br>&nbsp;at org.apache.axis.client.Service.<init>(Service.java:165)<br>&nbsp;at org.apache.axis.client.ServiceFactory.createService(ServiceFactory.java:198)<br>&nbsp;at com.company.project.remote.WebServiceClient.main(WebServiceClient.java:26)</p>
<p>缺少用户名、密码<br>javax.xml.rpc.ServiceException: Error processing WSDL document:&nbsp; <br>java.net.ProtocolException: Server redirected too many&nbsp; times (20)<br>&nbsp;at org.apache.axis.client.Service.initService(Service.java:250)<br>&nbsp;at org.apache.axis.client.Service.<init>(Service.java:165)<br>&nbsp;at org.apache.axis.client.ServiceFactory.createService(ServiceFactory.java:198)<br>&nbsp;at com.company.project.remote.WebServiceClient.main(WebServiceClient.java:26)<br>&nbsp;</p>
<img src ="http://www.blogjava.net/waterjava/aggbug/127362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-07-01 15:51 <a href="http://www.blogjava.net/waterjava/archive/2007/07/01/127362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis开发Webservice传Bean对象返回String串的实例 </title><link>http://www.blogjava.net/waterjava/archive/2007/06/29/127044.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Fri, 29 Jun 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/29/127044.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/127044.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/29/127044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/127044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/127044.html</trackback:ping><description><![CDATA[这几天也一直在为了设计与实现一个业务平台,想用Webservice 来作为核心技术来实现,也一直想精溢求精地把这个东东搞好, 突然觉得好久没来这里写日志了.呵,时间如白驹过隙啊!
<p>&nbsp;</p>
<p>&nbsp; 对于webService 以前也接触过.但只是皮毛,这次可是来真格的.来就来吧,年轻人这就是机会.一定得把握好,干它一票! 呵,就在网上到处找找啊,在本地机器上左试试,右试试啊, 什么法子都用一遍。就不信搞不定它，小样！</p>
<p>&nbsp;</p>
<p>&nbsp; 网上的例子也比较散，比较简易的，达不我想要的业务水平，只能慢慢搜索与摸索吧。。。。。。就这样天天想着这事，也没什么心情来这里写写。</p>
<p>&nbsp;</p>
<p>&nbsp; 近些天，也快回深圳了，定在下周四动身吧。这边的工作也得告一节了。把我前一些日子，搞一个完整的Samples 放到这里来，与大家共享。希望对有心人有些启发，也希望高人指点与点评。。。。。。。、</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; ****************************************************<br>&nbsp;&nbsp; *Axis开发Webservice传Bean对象返回String串的实例.rtf*<br>&nbsp;&nbsp; ****************************************************</p>
<p>&nbsp;</p>
<p>在ECLIPSE 里新建一工程，其次建包，再次建类，<br>基本包：samples.userguide.example5<br>基本类： Order.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>内容：<br>&nbsp;&nbsp;&nbsp; *&nbsp; Order.java *<br>*《********************************</p>
<p>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u>blackskin@126.com</u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/<br>public class Order {<br>&nbsp;/** Who's ordering */<br>&nbsp;private String customerName;</p>
<p>&nbsp;/** Where do they live */<br>&nbsp;private String shippingAddress;</p>
<p>&nbsp;/** Which items do we want */<br>&nbsp;private String itemCodes[];</p>
<p>&nbsp;/** And how many */<br>&nbsp;private int quantities[];</p>
<p>&nbsp;// Bean accessors</p>
<p>&nbsp;public String getCustomerName() {<br>&nbsp; return customerName;<br>&nbsp;}</p>
<p>&nbsp;public void setCustomerName(String name) {<br>&nbsp; customerName = name;<br>&nbsp;}</p>
<p>&nbsp;public String getShippingAddress() {<br>&nbsp; return shippingAddress;<br>&nbsp;}</p>
<p>&nbsp;public void setShippingAddress(String address) {<br>&nbsp; shippingAddress = address;<br>&nbsp;}</p>
<p>&nbsp;public String[] getItemCodes() {<br>&nbsp; return itemCodes;<br>&nbsp;}</p>
<p>&nbsp;public void setItemCodes(String[] items) {<br>&nbsp; itemCodes = items;<br>&nbsp;}</p>
<p>&nbsp;public int[] getQuantities() {<br>&nbsp; return quantities;<br>&nbsp;}</p>
<p>&nbsp;public void setQuantities(int[] quants) {<br>&nbsp; quantities = quants;<br>&nbsp;}<br>}</p>
<p>********************************》*</p>
<p>&nbsp;</p>
<p>主服务包: samples.userguide.example5<br>主服务类: BeanService.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;如下：<br>&nbsp;&nbsp;&nbsp; * BeanService.java *<br>**《*******************************<br>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u>blackskin@126.com</u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/</p>
<p>public class BeanService {<br>&nbsp;public String processOrder(Order order) {<br>&nbsp; String sep = System.getProperty("line.separator");</p>
<p>&nbsp; String response = "Hi, " + order.getCustomerName() + "!" + sep;</p>
<p>&nbsp; response += sep + "You seem to have ordered the following:" + sep;</p>
<p>&nbsp; String[] items = order.getItemCodes();<br>&nbsp; int[] quantities = order.getQuantities();</p>
<p>&nbsp; for (int i = 0; i &lt; items.length; i++) {<br>&nbsp;&nbsp; response += sep + quantities[i] + " of item : " + items[i];<br>&nbsp; }</p>
<p>&nbsp; response += sep + sep + "If this had been a real order processing system, "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + sep + "we'd probably have charged you about now.";</p>
<p>&nbsp; return response;<br>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) throws Exception{<br>&nbsp; /** Who's ordering */<br>&nbsp; String customerName = "Black Skin";<br>&nbsp; /** Where do they live */<br>&nbsp; String shippingAddress = "001 xingan Street, bayuquan, YK";<br>&nbsp; /** Which items do we want */<br>&nbsp; String[] items = new String[] { "apple", "160ml-Milk" }; <br>&nbsp; /** And how many */<br>&nbsp; int[] quantities = new int[] { 2, 4 };<br>&nbsp; /** request class init() */<br>&nbsp; Order order = new Order();<br>&nbsp; order.setCustomerName(customerName);<br>&nbsp; order.setShippingAddress(shippingAddress);<br>&nbsp; order.setItemCodes(items);<br>&nbsp; order.setQuantities(quantities); <br>&nbsp; /** server class init() */<br>&nbsp; BeanService beanservice = new BeanService();<br>&nbsp; String result = beanservice.processOrder(order);<br>&nbsp; /** OutPut the result */<br>&nbsp; System.out.println(" " + result);&nbsp; <br>&nbsp;}<br>&nbsp; <br>}</p>
<p>********************************》*</p>
<p>&nbsp;</p>
<p>&nbsp;BeanService.java里有个本地测试方法(samples.userguide.example5.BeanService.main())，来测试此应用的可运行性；</p>
<p><br>到此，服务端类写完了，接着来把此类的方法发布成 WebService 接口</p>
<p>手写一个deploy.wsdd 文件，可以参考下面的例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *deploy.wsdd例子*<br>*《********************************<br>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u>http://xml.apache.org/axis/wsdd/</u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u>http://xml.apache.org/axis/wsdd/providers/java</u></a>"&gt; <br>&lt;service name="服务名" provider="java:RPC"&gt; <br>&lt;parameter name="className" value="服务类文件的实际路径（包括包的信息）"/&gt; <br>&lt;parameter name="allowedMethods" value="*（即为所有方法都可访问，如要指定多个可用空格分隔开）"/&gt; <br>&lt;parameter name="allowedRoles" value="user"/&gt; <br>&lt;parameter name="scope" value="Session"/&gt; <br>&lt;requestFlow&gt; <br>&lt;handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt; <br>&lt;/requestFlow&gt; <br>&lt;/service&gt; <br>&lt;/deployment&gt; <br>********************************》*</p>
<p>显然，简单，造一个deploy.wsdd 信手捏来,如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *deploy.wsdd*<br>*《********************************<br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u>http://xml.apache.org/axis/wsdd/</u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u>http://xml.apache.org/axis/wsdd/providers/java</u></a>"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;service name="OrderProcessor" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="samples.userguide.example5.BeanService"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="processOrder"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;beanMapping qname="myNS:Order" xmlns:myNS="urn:BeanService" languageSpecificType="java:samples.userguide.example5.Order"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&lt;/deployment&gt;<br>********************************》*</p>
<p>有了deploy.wsdd文件了，接着通过它来生成 server-config.wsdd.<br>OK! 用命令直接生成就行；在deploy.wsdd 的文件夹下新建一个 makeWsdd.bat.<br>其中的写法有下面的例子来参考：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * makeWsdd.bat 例子*<br>*《********************************<br>set AXISCLASSPATH= &#8220;应用发布的路径&#8221;<br>set AXIS_LIB= &#8220;AXIS框架的内部JAR包LIB路径&#8221;<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;<br>%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java -Djava.ext.dirs=%AXISCLASSPATH% org.apache.axis.client.AdminClient <br>&nbsp;-S服务名\services\AdminService -p端口号（如果你的端口号不是默认的8080需要指定。<br>&nbsp;例如：8899）deploy.wsdd <br>********************************》*</p>
<p><br>如此，我写了一&#8220;makeWsdd.bat&#8221;文件。如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * makeWsdd.bat*<br>*《********************************<br>set AXISCLASSPATH=C:\Axis_webservice\Tomcat_4.1\webapps\axis<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;<br>%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java -Djava.ext.dirs=%AXISCLASSPATH% org.apache.axis.client.AdminClient <br>&nbsp;-SBeanServer\services\AdminService -p 8080 deploy.wsdd<br>********************************》*</p>
<p>保存好，接下来架设Webservice.</p>
<p>环境架设：<br>首先，安装JDK...（略）...本例用JDK版本号V1.4.<br>其次，安装Tomcat...（略）...本例用Tomcat版本号V4.1.<br>再次，AXIS...（略）...本例用AXIS版本号V1.4. 去AXIS官方网站：<a href="http://www.apache.org/"><u>http://www.apache.org</u></a>下载AXIS，解压后得，<br>&nbsp;&nbsp; |- axis-1_4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- docs <br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- lib<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis-ant.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- commons-discovery-0.2.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- commons-logging-1.0.4.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- jaxrpc.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- log4j-1.2.8.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- log4j.properties<br>&nbsp;&nbsp;&nbsp;&nbsp; |- saaj.jar<br>&nbsp;&nbsp;&nbsp;&nbsp; |- wsdlj-1.5.1.jar<br>&nbsp;|- samples<br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- webapps<br>&nbsp;&nbsp;&nbsp;&nbsp; |- axis<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;|- xmls<br>&nbsp;&nbsp;&nbsp;&nbsp; |- ..（略）...<br>&nbsp;&nbsp;&nbsp; 将解压后，C:\axis-1_4\webapps 目录下的 axis 目录 Copy 到 tomcat/webapps目录（C:\Axis_webservice\Tomcat_4_1\webapps）下，</p>
<p>架设AXIS：<br>首先，将deploy.wsdd文件Copy到 %AXISCLASSPATH%/WEB-INF 目录下；<br>其次，将之前的类编译后，连路径一起Copy到 %AXISCLASSPATH%/WEB-INF/classes目录下，<br>最后，将tomcat的 catalina 服务启动.<br>（即：C:\Axis_webservice\Tomcat_4.1\bin,</p>
<p>&nbsp;&nbsp; [特别注意的是：]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ａ。tomcat务必启动。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ｂ。在写如上的命令行时，务必注意参数的写法。&#8220;-D&#8221;　与 &#8220;-S&#8221;与其值间不能有空格。切记！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C。各XX的路径里，最好是不要有空格，因为JAVA里对大小写与路径空格有校验。<br>，）</p>
<p>测试：<br>命令行启动方法；运行"cmd",在命令行里写："cd C:\Axis_webservice\Tomcat_4.1\bin",回车，再写："&nbsp; catalina run ",回车，OK！<br>后台会报错：<br>"<br>- Unable to find config file.&nbsp; Creating new servlet engine config file: /WEB-INF/server-config.wsdd<br>2007-1-20 10:07:48 org.apache.coyote.http11.Http11Protocol start<br>信息: Starting Coyote HTTP/1.1 on port 8080<br>"<br>说明，在../WEB-INF/下没有"server-config.wsdd",暂时忽略。<br>在IE地址栏写：<a href="http://localhost:8080/axis"><u>http://localhost:8080/axis</u></a><br>可见，axis 欢迎首页，点击 "list" 便可看到默认情况下发布了两个服务下各有一个方法。一切准备工作已经OK！</p>
<p><br>再回到，刚才我们写的那个批处理文件：" makeWsdd.bat"，<br>直接双击，便可执行， 有一个警告，可以忽略的。执行完成后，在相应的<br>%AXISCLASSPATH%/WEB-INF下便有一&#8220;server-config.wsdd&#8221;文件，如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *server-config.wsdd*<br>*《********************************</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u>http://xml.apache.org/axis/wsdd/</u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u>http://xml.apache.org/axis/wsdd/providers/java</u></a>"&gt;<br>&nbsp;&lt;globalConfiguration&gt;<br>&nbsp; &lt;parameter name="sendMultiRefs" value="true"/&gt;<br>&nbsp; &lt;parameter name="disablePrettyXML" value="true"/&gt;<br>&nbsp; &lt;parameter name="adminPassword" value="admin"/&gt;<br>&nbsp; &lt;parameter name="attachments.Directory" value="C:\Axis_webservice\Tomcat_4.1\webapps\axis\WEB-INF\attachments"/&gt;<br>&nbsp; &lt;parameter name="dotNetSoapEncFix" value="true"/&gt;<br>&nbsp; &lt;parameter name="enableNamespacePrefixOptimization" value="false"/&gt;<br>&nbsp; &lt;parameter name="sendXMLDeclaration" value="true"/&gt;<br>&nbsp; &lt;parameter name="sendXsiTypes" value="true"/&gt;<br>&nbsp; &lt;parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/&gt;<br>&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="scope" value="session"/&gt;<br>&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.JWSHandler"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="scope" value="request"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter name="extension" value=".jwr"/&gt;<br>&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp;&lt;/globalConfiguration&gt;<br>&nbsp;&lt;handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/&gt;<br>&nbsp;&lt;handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/&gt;<br>&nbsp;&lt;handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&gt;<br>&nbsp;&lt;service name="AdminService" provider="java:MSG"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="AdminService"/&gt;<br>&nbsp; &lt;parameter name="enableRemoteAdmin" value="false"/&gt;<br>&nbsp; &lt;parameter name="className" value="org.apache.axis.utils.Admin"/&gt;<br>&nbsp; &lt;namespace&gt;http://xml.apache.org/axis/wsdd/&lt;/namespace&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;service name="Version" provider="java:RPC"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="getVersion"/&gt;<br>&nbsp; &lt;parameter name="className" value="org.apache.axis.Version"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;service name="OrderProcessor" provider="java:RPC"&gt;<br>&nbsp; &lt;parameter name="allowedMethods" value="processOrder"/&gt;<br>&nbsp; &lt;parameter name="className" value="samples.userguide.example5.BeanService"/&gt;<br>&nbsp; &lt;beanMapping languageSpecificType="java:samples.userguide.example5.Order" qname="ns1:Order" xmlns:ns1="urn:BeanService"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&lt;transport name="http"&gt;<br>&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="URLMapper"/&gt;<br>&nbsp;&nbsp; &lt;handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/&gt;<br>&nbsp; &lt;/requestFlow&gt;<br>&nbsp; &lt;parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/&gt;<br>&nbsp; &lt;parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/&gt;<br>&nbsp; &lt;parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/&gt;<br>&nbsp; &lt;parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/&gt;<br>&nbsp;&lt;/transport&gt;<br>&nbsp;&lt;transport name="local"&gt;<br>&nbsp; &lt;responseFlow&gt;<br>&nbsp;&nbsp; &lt;handler type="LocalResponder"/&gt;<br>&nbsp; &lt;/responseFlow&gt;<br>&nbsp;&lt;/transport&gt;<br>&lt;/deployment&gt;</p>
<p><br>********************************》*<br>&nbsp; <br>再去打开："<a href="http://localhost:8080/axis/servlet/AxisServlet"><u>http://localhost:8080/axis/servlet/AxisServlet</u></a>",或者，再刷新。<br>便可以看到，我们新发布的一个webservice接口服务，其名为："OrderProcessor "<br>此服务下的个方法：其名为："processOrder "。</p>
<p>点击服务对应的"（WSDL）"可见服务WSDL描述内容。在其中也可以得服务的访问地址：<br>"<a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u>http://localhost:8080/axis/services/OrderProcessor?wsdl</u></a>"<br><span><strong class=g onmouseover='isShowAds = false;isShowAds2 = false;isShowGoogle = true;InTextAds_GoogleLayer="_u670D_u52A1_u5668_u7AEF";ads.ShowGoogleAds(this,"_u670D_u52A1_u5668_u7AEF",event)' style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline" onclick='javascript:window.open("http://www.google.com/pagead/iclk?sa=l&amp;ai=B8tpgaYyERqaCN4rasQKGnOCgBMjIzy24mYrsAqqQqaQG0IYDEAEYASDN2PgHOAFQ5_KzzAJgncHegdgFmAGVhwGYAb6IAaAB6u6K_gOqAQoxMDAwMDAwMTQ4yAEByALE63PZA9XD9EBc3ens&amp;num=1&amp;adurl=http://search.china.alibaba.com/offer/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E7%25AB%25AF.html%3Fcosite%3Dgooglejj1%26location%3Dkw_diannao_%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E7%25AB%25AF")' onmouseout='isShowGoogle = false;InTextAds_GoogleLayer="_u670D_u52A1_u5668_u7AEF"'>服务器端</strong>的开发，搞定了！</span></p>
<p>-:)&nbsp;&nbsp;&nbsp; -:)&nbsp;&nbsp;&nbsp; -:)&nbsp;&nbsp; </p>
<p>接下来，准备开发，客户端的开发。</p>
<p>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Client.java *<br>*《********************************<br>package samples.userguide.example5;</p>
<p>/**<br>&nbsp;* This is a JavaBean which represents an order for some products.<br>&nbsp;* Copyright: Copyright (c) 2007-1 <br>&nbsp;* @author Black skin (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#97;&#99;&#107;&#115;&#107;&#105;&#110;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u>blackskin@126.com</u></a>)<br>&nbsp;* @version 1.0<br>&nbsp;*/</p>
<p>import java.net.URL;</p>
<p>import org.apache.axis.AxisFault;<br>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>import org.apache.axis.utils.Options;</p>
<p>import javax.xml.namespace.QName;<br>import javax.xml.rpc.ParameterMode;</p>
<p>public class Client {<br>&nbsp;public static void main(String[] args) throws Exception {<br>&nbsp; //Options options = new Options(args);<br>&nbsp; String urlWsdl = "<a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u>http://localhost:8080/axis/services/OrderProcessor?wsdl</u></a>";</p>
<p>&nbsp; Order order = new Order();<br>&nbsp; order.setCustomerName("Black Skin");<br>&nbsp; order.setShippingAddress("275 Grove Street, Newton, MA");</p>
<p>&nbsp; String[] items = new String[] { "apple", "160ml-Milk" };<br>&nbsp; int[] quantities = new int[] { 8, 4 };</p>
<p>&nbsp; order.setItemCodes(items);<br>&nbsp; order.setQuantities(quantities);</p>
<p>&nbsp; Service service = new Service();<br>&nbsp; Call call = (Call) service.createCall();<br>&nbsp; QName qn = new QName("urn:BeanService", "Order");</p>
<p>&nbsp; call.registerTypeMapping(Order.class, qn,<br>&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanSerializerFactory(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order.class, qn),<br>&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanDeserializerFactory(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order.class, qn));<br>&nbsp; String result;<br>&nbsp; try {<br>&nbsp;&nbsp; //call.setTargetEndpointAddress(new java.net.URL(options.getURL()));<br>&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(urlWsdl));<br>&nbsp;&nbsp; call.setOperationName(new QName("OrderProcessor", "processOrder"));<br>&nbsp;&nbsp; call.addParameter("arg1", qn, ParameterMode.IN);<br>&nbsp;&nbsp; call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);</p>
<p>&nbsp;&nbsp; result = (String) call.invoke(new Object[] { order });<br>&nbsp; } catch (AxisFault fault) {<br>&nbsp;&nbsp; result = "Error : " + fault.toString();<br>&nbsp; }</p>
<p>&nbsp; System.out.println(result);<br>&nbsp;}<br>}</p>
<p>********************************》*</p>
<p>oK! 到此，一个完整的Webservice例子就搞定了。</p>
<p>另外，Axis 还提供了一些工具，如:" wsdl2java "、" java2wsdl "</p>
<p>处理的方式与方法：<br>&nbsp; java2wsdl:<br>&nbsp;&nbsp; 1. 以上为例，在以上工程的class输出目录新建一BAT文件：名为：&#8220;java2wsdl.bat&#8221;<br>&nbsp;&nbsp; 2. 其内容为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * java2wsdl.bat *<br>*《********************************<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java org.apache.axis.wsdl.Java2WSDL -o Order.wsdl&nbsp; -l"<a href="http://localhost:8080/axis/services/OrderProcessor"><u>http://localhost:8080/axis/services/OrderProcessor</u></a>" -n "urn:BeanService"&nbsp; -p"samples.userguide.example5.Order" "urn:Order" samples.userguide.example5.BeanService<br>********************************》*</p>
<p>把AXIS_LIB设为正确的本地包路径，再运行&#8220;java2wsdl.bat&#8221;，<br>便可以在目录下看到一个文件：&#8220;Order.wsdl&#8221;，通过这个WSDL文件，可以生成Webservice接口服务的框架，<br>既可以是服务器端，也可以是客户端框架。其细节，可以参考下一节。</p>
<p><br>处理的方式与方法：<br>&nbsp; wsdl2java :<br>&nbsp;&nbsp; 1. 以上为例，把Order.wsdl拷贝过来，在其目录下新建一BAT文件：名为：&#8220;wsdl2java.bat&#8221;<br>&nbsp;&nbsp; 2. 其内容为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * wsdl2java.bat *<br>*《********************************<br>set AXIS_LIB=C:\axis-1_4\lib<br>SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar</p>
<p>java org.apache.axis.wsdl.WSDL2Java Order.wsdl<br>********************************》*</p>
<p>或者有另外的作法：把服务端的应用启动，直接写成：<br>&#8220;<br>java org.apache.axis.wsdl.WSDL2Java <a href="http://localhost:8080/axis/services/OrderProcessor?wsdl"><u>http://localhost:8080/axis/services/OrderProcessor?wsdl</u></a><br>&#8221;<br>保存好后，运行这个BAT文件，<br>便会自动生成:<br>BeanService_pkg\<br>&nbsp; BeanService.java<br>&nbsp; BeanServiceService.java<br>&nbsp; BeanServiceServiceLocator.java<br>&nbsp; OrderProcessorSoapBindingStub.java&nbsp;&nbsp;&nbsp; <br>&nbsp; Order.java</p>
<p>ok.</p>
<br>来自:http://blackskin126.bokee.com/viewdiary.14630183.html <br>
<img src ="http://www.blogjava.net/waterjava/aggbug/127044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-29 12:43 <a href="http://www.blogjava.net/waterjava/archive/2007/06/29/127044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis 的客户端使用</title><link>http://www.blogjava.net/waterjava/archive/2007/06/29/127039.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Fri, 29 Jun 2007 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/29/127039.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/127039.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/29/127039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/127039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/127039.html</trackback:ping><description><![CDATA[<p>1.&nbsp;http://ws.apache.org/Axis/下载 axis-1_2_1 解压放在 D:\softSetup\下
<div class=Pug391>dl.bitsCN.com网管软件下载</div>
<p>&#160;</p>
<p>2.下载 apache-ant-1.6.1&nbsp;&nbsp;解压放在D:\softSetup\下 <font color=#ffffff>bitsCN全力打造网管学习平台</font> </p>
<p>3.环境变量设置:
<div class=Pug391>需要什么来搜一搜吧so.bitsCN.com</div>
<p>&#160;</p>
<p>JAVA_HOME=C:\jdk1.5.0_06<br>CATALINA_HOME=tomcat-5.5.15 <br>ANT_HOME=D:\softSetup\apache-ant-1.6.1<br>AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\mail.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB% \wsdl4j.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\junit.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar<br>AXIS_HOME=D:\softSetup\axis-1_2_1<br>AXIS_LIB=%AXIS_HOME%\lib<br>CATALINA_HOME=D:\softSetup\jakarta-tomcat-5.0.24<br>classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%AXISCLASSPATH%<br>path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin <font color=#ffffff>so.bitsCN.com网管资料库任你搜</font> </p>
<p>4.在命令行 运行set 确保新加的环境变量生效
<p class=Pug391>bitsCN.com中国网管联盟</p>
<p>&#160;</p>
<p>5.根据合作伙伴给的wsdl地址 http://www.****.com/services/OrderService?wsdl保存下来到D:\project\test\wsdl\OrderService.wsdl <span class=Pug391>需要什么来搜一搜吧so.bitsCN.com</span> </p>
<p>6.在命令行 切换到 D:\project\test\wsdl\下运行axis的WSDL2Java&nbsp;命令: &nbsp;java org.apache.axis.wsdl.WSDL2Java OrderService.wsdl&nbsp;&nbsp;&nbsp; 生成 bean 文件,***Service.java,***ServiceLocator.java,***ServiceSoapBindingStub.java 等文件,可以用Axis的wsdl2java生成web service的客户端，wsdl2java生成的客户端是stub方式的。它包括endpoint借口、实现该接口的stub、 serviceLocator、可选的单元测试代码。其中，serviceLocator中hard code了服务端地址.
<p class=Pug391>so.bitsCN.com网管资料库任你搜</p>
<p>&#160;</p>
<p>7. 应用.写一个表单jsp,提交到下面jsp文件进行处理(可以写在类里,此处简单处理) <span class=Pug391>play.bitsCN.com累了吗玩一下吧</span> </p>
<p>&lt;%@ page contentType="text/html; charset=GBK"%&gt;<br>&lt;%@page import="org.apache.axis.client.Call"%&gt;<br>&lt;%@page import="javax.xml.namespace.QName"%&gt;<br>&lt;%@page import="java.net.MalformedURLException"%&gt;<br>&lt;%@page import="java.rmi.RemoteException"%&gt;<br>&lt;%@page import="java.util.*"%&gt;<br>&lt;%@page import="java.net.URL"%&gt;<br>&lt;%@page import="org.apache.axis.client.Service"%&gt;<br>&lt;%@page import="com.newSky.datainterface.beans.*"%&gt;<br>&lt;%!
<p class=Pug391>dl.bitsCN.com网管软件下载</p>
<p>&#160;</p>
<p>&nbsp; private final static String success = "测试完成";<br>&nbsp; private final static String fail = "测试失败:";<br>&nbsp; final static String endPoint = "http://www.***.com/services/OrderService";<br>&nbsp; final static String portName = "addNewOrder";<br>&nbsp; final static String nameSpace = "http://beans.datainterface.newSky.com";<br>%&gt;<br>&lt;html&gt;<br>&lt;head&gt;&lt;/head&gt;<br>&lt;body&gt;<br>&lt;%<br>&nbsp; try {<br>&nbsp;&nbsp;&nbsp; Call call = null;<br>&nbsp;&nbsp;&nbsp; URL url = null;<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create new url<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = new URL(endPoint);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (MalformedURLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fail + e.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //create new service<br>&nbsp;&nbsp;&nbsp; Service service = new Service();<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create new call <span class=Pug391>需要什么来搜一搜吧so.bitsCN.com</span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call = (Call) service.createCall();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception se) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fail + se.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //设置服务器<br>&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(url);<br>&nbsp;&nbsp;&nbsp; //设置端口<br>&nbsp;&nbsp;&nbsp; call.setOperationName(new QName(endPoint, portName));<br>&nbsp;&nbsp;&nbsp; //***********************<br>&nbsp;&nbsp;&nbsp;&nbsp; //注册类，开始<br>&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QName qn1 = new QName(nameSpace, "OrderUserData");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.registerTypeMapping(OrderUserData.class, qn1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanSerializerFactory(OrderUserData.class, qn1),
<div class=Pug391>bbs.bitsCN.com国内最早的网管论坛</div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderUserData.class, qn1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception EQ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EQ.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //注册类，结束<br>&nbsp;&nbsp;&nbsp; //设置返回类型<br>&nbsp;&nbsp;&nbsp; // set bean 此处省略。。<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用服务<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("*************&nbsp; 测试开始 ******************");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setUsername(request.getParameter("id"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result = (String) call.invoke(new Object[] {new Integer(request.getParameter("id)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String(request.getParameter("pwd")), orderData});
<p class=Pug391>so.bitsCN.com网管资料库任你搜</p>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(result);
<p class=Pug391>bbs.bitsCN.com国内最早的网管论坛</p>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(result.equals("-100")){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write("用户名密码错误");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write("成功");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("*************&nbsp; 测试完成 ******************");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (RemoteException re) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fail + re.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //re.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp; // e.printStackTrace();<br>&nbsp; }<br>%&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;
<p class=Pug391>bitsCN全力打造网管学习平台</p>
<p>&#160;</p>
<p>8. ok ^_^ <font color=#ffffff>bitsCN全力<br><br><br><span style="COLOR: red">来自:http://www.bitscn.com/java/webservice/200611/82110.html</span></font></p>
<img src ="http://www.blogjava.net/waterjava/aggbug/127039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-29 12:33 <a href="http://www.blogjava.net/waterjava/archive/2007/06/29/127039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Axis开发基于Java的Web服务</title><link>http://www.blogjava.net/waterjava/archive/2007/06/29/127001.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Fri, 29 Jun 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/29/127001.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/127001.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/29/127001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/127001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/127001.html</trackback:ping><description><![CDATA[<strong><font color=#ac0000>概述<br><br></font></strong>　　本文介绍了一个比较简单实用的基于Java的SOAP引擎——Apache组织推出的Axis——的安装、配置和应用开发方法，希望对有兴趣做基于Java的Web Services应用开发的朋友有所帮助。
<p>　　<strong><font color=#ac0000>Axis简介</font></strong><br><br>　　Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C++的版本正在开发之中。Axis v1.1<a href="http://www.zhujiangroad.com/software/" target=_blank><font color=#0000ff><u>软件</u></font></a>包可以从http://ws.apache.org/axis/dist/1_1/<a href="http://www.zhujiangroad.com/software/sort.asp" target=_blank><font color=#0000ff><u>下载</u></font></a>得到。</p>
<p>　　<strong>Axis的安装</strong><br><br>　　应用Axis开发Web Services，你需要有一个支持Servlet的<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>引擎，比如广为人知的Tomcat（Tomcat也是由Apache组织所提供的，目前的最新版本为4.1.24，<a href="http://www.zhujiangroad.com/software/sort.asp" target=_blank><font color=#0000ff><u>下载</u></font></a>地址为http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.24/）。在此之前当然你机器必须已经装好了JDK1.3以上的版本，当安装好Tomcat之后，只需将<a href="http://www.zhujiangroad.com/software/sort.asp" target=_blank><font color=#0000ff><u>下载</u></font></a>的Axis<a href="http://www.zhujiangroad.com/software/" target=_blank><font color=#0000ff><u>软件</u></font></a>包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下即可。</p>
<p>　　<strong>Axis的配置</strong><br><br>　　Axis基于Java开发，可以部署于多种<a href="http://www.zhujiangroad.com/price/soft_sys.html" target=_blank><font color=#0000ff><u>操作系统</u></font></a>，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p>
<p>CATALINA_HOME<br>C:\Tomcat_4_1</p>
<p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）<br><br>AXIS_HOME<br>%CATALINA_HOME%\webapps\axis<br><br>AXIS_LIB<br>%AXIS_HOME%\lib<br><br>AXISCLASSPATH<br>%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar<br></p>
<p>　　如果你不愿做这么繁琐的类路径设置，可以直接将axis<a href="http://www.zhujiangroad.com/software/" target=_blank><font color=#0000ff><u>软件</u></font></a>包中&#8220;lib&#8221;目录下的所有.jar文件加入到系统环境变量CLASSPATH中即可。</p>
<p>　　<strong>Axis的测试</strong><br><br>　　安装配置完毕后，应测试一下是否Axis可以正确运行了。</p>
<p>　　启动Tomcat<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>，在浏览器中访问http://localhost:8080/axis/happyaxis.jsp，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功，如下图所示：</p>
<p><img hspace=3 src="http://www.yesky.com/image20010518/60714.jpg" align=center vspace=1 border=1 twffan="done"><br><br>　　现在可以开始开发你的Web Services应用了。</p>
<p>&#160;</p>
<div class=fontclear></div>
<br>
<div class=left><span class=span>作者：飞鹰</span><span class=span>出处：yesky</span><span class=span>责任编辑： 方舟 </span><span class=span>[ 2003-08-21 16:50 ]</span></div>
<div class=fontclear></div>
<div class="left fontsize3">本文介绍了一个比较简单实用的基于Java的SOAP引擎的安装、配置和应用开发方法</div>
<div class=fontclear></div>
<hr class=hr1>
<center><span></span></center>
<div class="left fontsize4">
<div class=guanggao><span></span></div>
　　<strong><font color=#ac0000>服务的发布</font></strong><br><br>　　Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。
<p>&#160;</p>
<p>　　<strong>使用即时发布</strong><br><br>　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>重启了也不必对其做任何处理，使用非常简单快捷。</p>
<p>　　使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下即可。</p>
<p>　　在此给出一个从英里到公里的长度单位转换的服务，其源码如下：</p>
<p>文件Distance.jws<br><br>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class Distance</p>
<p>{</p>
<p>public double convertMile2Kilometre( double mile )</p>
<p>{</p>
<p>//实现英里到公里的距离转换</p>
<p>return mile * 1.609;</p>
<p>}//convertMile2Kilometre()</p>
<p>}/* Distance */<br></p>
<p>　　将其放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录，通过访问http://localhost:8080/axis/Distance.jws?wsdl可以看到这个服务的WSDL描述文件，这说明Distance服务被成功发布了。如下图所示：</p>
<p><img hspace=3 src="http://www.yesky.com/image20010518/60715.jpg" align=center vspace=1 border=1 twffan="done"><br><br>　　<strong>使用定制发布</strong><br><br>　　即时发布是一项令人激动的技术，它使Web服务的开发变得如此简单；然而即时发布并不总是最好的选择，比如有些应用系统是第三方提供的，我们没有购买源代码，只有.class文件，但我们又希望将这个应用系统的一些功能对外发布成Web服务，使其能够在更大范围内产生作用，这个时候即时发布技术就无能为力了。此外，即时发布技术并不灵活，无法进行更多的服务配置，这使得它并不能满足一些特定系统的需求。</p>
<p>　　因此，Axis提供了另一种服务发布方式，这就是定制发布。</p>
<p>　　在此给出一个从加仑到升的容积单位转换的服务，其源码如下：</p>
<p>　　文件Capacity.java<br><br>package samples.capacity;</p>
<p>&#160;</p>
<p>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class Capacity</p>
<p>{</p>
<p>public double convertGallon2Litre( double gallon )</p>
<p>{</p>
<p>//实现加仑到升的容积转换</p>
<p>return gallon * 4.546;</p>
<p>}//convertGallon2Litre()</p>
<p>}/* Capacity */<br></p>
<p>　　将其编译成.class文件，放置到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，即可着手进行发布。</p>
<p>　　定制发布不需要构建.jws文件，但必须创建服务发布描述文件deploy.wsdd（Web Service Deployment Descriptor的缩写），这个文件负责描述服务的名称、入口等信息，其内容如下：</p>
<p>　　文件deploy.wsdd<br><br>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"</p>
<p>xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;</p>
<p>&#160;</p>
<p>&lt;service name="Capacity" provider="java:RPC"&gt;</p>
<p>&lt;parameter name="className" value="samples.capacity.Capacity"/&gt;</p>
<p>&lt;parameter name="allowedMethods" value="*"/&gt;</p>
<p>&lt;/service&gt;</p>
<p>&#160;</p>
<p>&lt;/deployment&gt;<br></p>
<p>　　将该文件也放到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。</p>
<p>　　在&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，运行：</p>
<p>java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd<br></p>
<p>　　可以看到以下运行结果：</p>
<p>Processing file deploy.wsdd</p>
<p>&lt;Admin&gt;Doneprocessing&lt;/Admin&gt;<br></p>
<p>　　这表明Capacity服务定制发布完成。</p>
<p>　　通过访问http://localhost:8080/axis/services/Capacity?wsdl可以看到这个服务的WSDL描述文件，这说明Capacity服务被成功发布了。如下图所示：</p>
<p><img hspace=3 src="http://www.yesky.com/image20010518/60716.jpg" align=center vspace=1 border=1 twffan="done"><br><br></p>
<div class=fontclear></div>
<br>
<div class=left><span class=span>作者：飞鹰</span><span class=span>出处：yesky</span><span class=span>责任编辑： 方舟 </span><span class=span>[ 2003-08-21 16:50 ]</span></div>
<div class=fontclear></div>
<div class="left fontsize3">本文介绍了一个比较简单实用的基于Java的SOAP引擎的安装、配置和应用开发方法</div>
<div class=fontclear></div>
<hr class=hr1>
<center><span></span></center>
<div class="left fontsize4">
<div class=guanggao><span></span></div>
　　<strong><font color=#ac0000>服务的访问</font></strong><br><br>　　<strong>GET方式的服务访问</strong><br><br>　　一般的SOAP消息都是采用POST方式实现传递，但也可以通过GET方式来访问。比如以下给出的一个服务——&#8220;HelloWorld&#8221;，其源码如下：
<p>&#160;</p>
<p>文件HelloWorld.jws<br><br>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class HelloWorld</p>
<p>{</p>
<p>public String helloWorld()</p>
<p>{</p>
<p>//在<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>端打印输出</p>
<p>System.out.println( "Hello World!" );</p>
<p>&#160;</p>
<p>//返回相应字符串</p>
<p>return "Hello World!";</p>
<p>}//helloWorld()</p>
<p>&#160;</p>
<p>}/* HelloWorld */<br></p>
<p>　　这个服务给出一个名位&#8220;helloWorld&#8221;的无入口参数的操作，返回一个内容为&#8220;Hello World！的字符串&#8221;，同时在<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>端打印&#8220;Hello World！&#8221;，将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下，即可通过GET方法直接访问该服务，访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld，可以看到返回的SOAP信封消息，同时<a href="http://www.zhujiangroad.com/price/serverpc.html" target=_blank><font color=#0000ff><u>服务器</u></font></a>端给出了相应的显示信息&#8220;Hello World！&#8221;这表明HelloWorld服务被成功访问了。如下图所示：</p>
<p><img hspace=3 src="http://www.yesky.com/image20010518/60717.gif" align=center vspace=1 border=1 twffan="done"><br><br>　　<strong>客户端服务访问编程</strong><br><br>　　Axis提供了一套API来实现SOAP，从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。</p>
<p>　　其中，org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类，一般的客户端程序欲访问一个Web Service时，都要生成一个客户端的Service对象和Call对象，在访问服务之前，首先要对Call对象设置相应的参数，包括服务的位置、操作名、入口参数、返回值类型等，最后调用Call对象的invoke方法访问服务。</p>
<p>　　以下给出了一个客户端访问Web服务的例程——AXISTest.java：</p>
<p>　　文件AXISTest.java<br><br>package axisexercise;</p>
<p>&#160;</p>
<p>import org.apache.axis.client.Call;</p>
<p>import org.apache.axis.client.Service;</p>
<p>import org.apache.axis.encoding.XMLType;</p>
<p>&#160;</p>
<p>import javax.xml.rpc.ParameterMode;</p>
<p>&#160;</p>
<p>/**</p>
<p>* @author 飞鹰</p>
<p>*/</p>
<p>public class AXISTest</p>
<p>{</p>
<p>public static void main( String[] args ) throws Exception</p>
<p>{</p>
<p>Service service = new Service();</p>
<p>Call call = ( Call ) service.createCall();</p>
<p>&#160;</p>
<p>&#160;</p>
<p>//////////访问即时发布的Distance服务</p>
<p>//设置访问点</p>
<p>call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );</p>
<p>&#160;</p>
<p>//设置操作名</p>
<p>call.setOperationName( "convertMile2Kilometre" );</p>
<p>&#160;</p>
<p>//设置入口参数</p>
<p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p>
<p>call.setReturnType( XMLType.XSD_DOUBLE );</p>
<p>Double d1 = new Double( 190 );</p>
<p>&#160;</p>
<p>//调用服务</p>
<p>System.out.println( d1 + " 英里相当于 " + </p>
<p>call.invoke( new Object[] {d1} ) + " 公里！" );</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>//////////访问定制发布的Capacity服务</p>
<p>call = ( Call ) service.createCall();</p>
<p>//设置访问点</p>
<p>call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );</p>
<p>&#160;</p>
<p>//设置操作名</p>
<p>call.setOperationName( "convertGallon2Litre" );</p>
<p>&#160;</p>
<p>//设置入口参数</p>
<p>call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p>
<p>call.setReturnType( XMLType.XSD_DOUBLE );</p>
<p>d1 = new Double( 10.00 );</p>
<p>&#160;</p>
<p>//调用服务</p>
<p>System.out.println( d1 + " 加仑相当于 " + </p>
<p>call.invoke( new Object[] {d1} ) + " 升！" );</p>
<p>} //main()</p>
<p>}/* AXISTest */<br></p>
<p>　　编译运行后运行可以看到以下的结果：</p>
<p>　　190.0英里相当于305.71公里！</p>
<p>　　10.0加仑相当于45.46升！<br>　 <br>　　注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同，前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws，而后者的则为http://localhost:8080/axis/services/Capacity。<br><br><br>来自：<a href="http://hi.baidu.com/zxhcloth/blog/item/bb8637dbf28e0b67d0164ea5.html">http://hi.baidu.com/zxhcloth/blog/item/bb8637dbf28e0b67d0164ea5.html</a></p>
</div>
</div>
<img src ="http://www.blogjava.net/waterjava/aggbug/127001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-29 10:17 <a href="http://www.blogjava.net/waterjava/archive/2007/06/29/127001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS全攻略（二）</title><link>http://www.blogjava.net/waterjava/archive/2007/06/21/125602.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Thu, 21 Jun 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/21/125602.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/125602.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/21/125602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/125602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/125602.html</trackback:ping><description><![CDATA[<p>六、服务的访问</p>
<p>　　GET方式的服务访问</p>
<p>　　一般的SOAP消息都是采用POST方式实现传递，但也可以通过GET方式来访问。比如以下给出的一个服务——&#8220;HelloWorld&#8221;，其源码如下： </p>
<p>文件HelloWorld.jws<br>public class HelloWorld<br>{<br>&nbsp;&nbsp;&nbsp; public String helloWorld()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( "Hello World!" );//在服务器端打印输出&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hello World!";//返回相应字符串<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>　　这个服务给出一个名为&#8220;helloWorld&#8221;的无入口参数的操作，返回一个内容为&#8220;Hello World！的字符串&#8221;，同时在服务器端打印&#8220;Hello World！&#8221;，将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下，即可通过GET方法直接访问该服务，访问的地址为<a href="http://localhost:8080/axis/HelloWorld.jws?method=helloWorld"><u><font color=#0066cc>http://localhost:8080/axis/HelloWorld.jws?method=helloWorld</font></u></a>，可以看到返回的SOAP信封消息，同时服务器端给出了相应的显示信息&#8220;Hello World！&#8221;这表明HelloWorld服务被成功访问了，生成的SOAP信封消息为：<br>&nbsp;&lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br>- &lt;soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/envelope/</font></u></a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"<br>&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema-instance</font></u></a>"&gt;<br>- &lt;soapenv:Body&gt;<br>- &lt;helloWorldResponse soapenv:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>"&gt;<br>&nbsp; &lt;helloWorldReturn xsi:type="xsd:string"&gt;Hello World!&lt;/helloWorldReturn&gt; <br>&nbsp; &lt;/helloWorldResponse&gt;<br>&nbsp; &lt;/soapenv:Body&gt;<br>&nbsp; &lt;/soapenv:Envelope&gt;</p>
<p>&nbsp;</p>
<p><br>七、客户端服务访问编程</p>
<p>　　Axis提供了一套API来实现SOAP，从<a href="http://localhost:8080/axis/docs/apiDocs/index.html"><u><font color=#0066cc>http://localhost:8080/axis/docs/apiDocs/index.html</font></u></a>可以看到Axis的API文档。</p>
<p>　　其中，org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类，一般的客户端程序欲访问一个Web Service时，都要生成一个客户端的Service对象和Call对象，在访问服务之前，首先要对Call对象设置相应的参数，包括服务的位置、操作名、入口参数、返回值类型等，最后调用Call对象的invoke方法访问服务。</p>
<p>　　以下给出了一个客户端访问Web服务的例程——AXISTest.java：</p>
<p>　　文件AXISTest.java</p>
<p>package axisexercise;</p>
<p>import org.apache.axis.client.Call;</p>
<p>import org.apache.axis.client.Service;</p>
<p>import org.apache.axis.encoding.XMLType;</p>
<p>import javax.xml.rpc.ParameterMode;</p>
<p>public class AXISTest<br>{<br>&nbsp;&nbsp;&nbsp; public static void main( String[] args ) throws Exception<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建service和call对象，这些对象是标准的JAX-RPC对象，这些对象用于存储服务调用的数据（metadata）。</p>
<p>&nbsp;Service service = new Service();<br>&nbsp;Call call = ( Call ) service.createCall();<br>&nbsp;//////////访问即时发布的Distance服务</p>
<p>&nbsp;//设置访问点<br>&nbsp;call.setTargetEndpointAddress( "<a href="http://localhost:8080/axis/Distance.jws"><u><font color=#0066cc>http://localhost:8080/axis/Distance.jws</font></u></a>" );</p>
<p>&nbsp;//设置操作名<br>&nbsp;call.setOperationName( "convertMile2Kilometre" );</p>
<p>&nbsp;//设置入口参数<br>&nbsp;call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );</p>
<p>&nbsp;//设置返回参数类型<br>&nbsp;call.setReturnType( XMLType.XSD_DOUBLE );<br>&nbsp;Double d1 = new Double( 190 );</p>
<p>&nbsp;//调用服务，在invoke方法中传入的是包含调用参数的数组<br>&nbsp;System.out.println( d1 + " 英里相当于 " + <br>&nbsp;call.invoke( new Object[] {d1} ) + " 公里！" );</p>
<p>&nbsp;//////////访问定制发布的Capacity服务<br>&nbsp;call = ( Call ) service.createCall();</p>
<p>&nbsp;//设置访问点<br>&nbsp;call.setTargetEndpointAddress( "<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" );</p>
<p>&nbsp;//设置操作名<br>&nbsp;call.setOperationName( "convertGallon2Litre" );</p>
<p>&nbsp;//设置入口参数<br>&nbsp;call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );<br>&nbsp;call.setReturnType( XMLType.XSD_DOUBLE );<br>&nbsp;d1 = new Double( 10.00 );</p>
<p>&nbsp;//调用服务<br>&nbsp;System.out.println( d1 + " 加仑相当于 " + <br>&nbsp;call.invoke( new Object[] {d1} ) + " 升！" );</p>
<p>&nbsp;&nbsp;&nbsp; } //main()</p>
<p>}/* AXISTest */</p>
<p>编译运行后运行可以看到以下的结果：</p>
<p>190.0英里相当于305.71公里！</p>
<p>10.0加仑相当于45.46升！<br>　 <br>　　注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同，前者的服务访问点地址为<a href="http://localhost:8080/axis/HelloWorld.jws"><u><font color=#0066cc>http://localhost:8080/axis/HelloWorld.jws</font></u></a>，而后者的则为<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>。</p>
<p><br>八、服务类型：RPC, Document, Wrapped, and Message<br>在Axis中，有四种服务类型：</p>
<p>1. RPC服务：<br>PRC服务是AXIS中的默认服务，当你通过&lt;service ... provider="java:RPC"&gt; or &lt;service ... style="RPC"&gt;标签进行部署的时候，使用的就是RPC服务。RPC服务遵循SOAP RPC和其编码规范。AXIS可以将XML反序列化成java对象，并将其传给服务的方法。并且可以将服务的方法返回的JAVA对象序列化成XML。</p>
<p>2.Document / Wrapped services<br>Document services and wrapped services are similar in that neither uses the SOAP encoding for data; it's just plain old XML schema. In both cases, however, Axis still "binds" Java representations to the XML (see the databinding section for more), so you end up dealing with Java objects, not directly with XML constructs.</p>
<p>Document和Wrapped服务都不使用SOAP编码数据，这一点是他们相似的地方。他们仅仅使用旧的XML模式。然而，在这两种服务中，AXIS将捆绑Java的表示到XML文档中，所以你最终处理的是java对象而不直接处理XML。</p>
<p>下面是包含定单的一个简单的SOAP消息，你可以看到Document 和 Wrapped 服务的区别所在：<br>&lt;soap:Envelope xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/</font></u></a>"<br>&nbsp;&nbsp; xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt;<br>&nbsp; &lt;soap:Body&gt;<br>&nbsp;&lt;myNS:PurchaseOrder xmlns:myNS="<a href="http://commerce.com/PO"><u><font color=#0066cc>http://commerce.com/PO</font></u></a>"&gt;<br>&nbsp;&nbsp; &lt;item&gt;SK001&lt;/item&gt;<br>&nbsp;&nbsp; &lt;quantity&gt;1&lt;/quantity&gt;<br>&nbsp;&nbsp; &lt;description&gt;Sushi Knife&lt;/description&gt;<br>&nbsp;&lt;/myNS:PurchaseOrder&gt;<br>&nbsp; &lt;/soap:Body&gt;<br>&lt;/soap:Envelope&gt;</p>
<p>相应的XML模式如下：</p>
<p>&lt;schema targetNamespace="<a href="http://commerce.com/PO"><u><font color=#0066cc>http://commerce.com/PO</font></u></a>"&gt;<br>&nbsp; &lt;complexType name="POType"&gt;<br>&nbsp;&lt;sequence&gt;<br>&nbsp;&nbsp; &lt;element name="item" type="xsd:string"/&gt;<br>&nbsp;&nbsp; &lt;element name="quantity" type="xsd:int"/&gt;<br>&nbsp;&nbsp; &lt;element name="description" type="xsd:string"/&gt;<br>&nbsp;&lt;/sequence&gt;<br>&nbsp; &lt;/complexType&gt;<br>&nbsp; &lt;element name="PurchaseOrder" type="POType"/&gt;<br>&lt;/deployment&gt;</p>
<p>对于Document类型服务，他将映射成下面的方法：<br>public void method(PurchaseOrder po)</p>
<p><br>八、soap envolop(soap信封)<br>1. soap信封<br>在客户端发出服务请求以及服务端返回请求结果的时候，在网络中传输的是SOAP信封。首先客户端程序将请求参数及请求的方法序列到XML的文件中（SOAP信封），并将SOAP信封传送到服务器端。服务器端接受到SOAP信封后，将解析这个SOAP信封并反序列化调用参数及方法并将该方法的调用结果封装成SOAP信封（序列到XML的文件中）返回给客户端，客户端同样将SOAP信封中封装的返回结果反序列化为想要得到的结果。</p>
<p>我们来看下面这段客户端程序的SOAP信封：<br>(1) 客户端程序：<br>&nbsp; import org.apache.axis.client.Call;<br>&nbsp; import org.apache.axis.client.Service;<br>&nbsp; import javax.xml.namespace.QName;<br>&nbsp; <br>&nbsp; public class TestClient <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String [] args) <br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpoint = "<a href="http://nagoya.apache.org:5049/axis/services/echo"><u><font color=#0066cc>http://nagoya.apache.org:5049/axis/services/echo</font></u></a>";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service&nbsp; service = new Service();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call&nbsp; call = (Call) service.createCall();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress( new java.net.URL(endpoint) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName(new QName("<a href="http://soapinterop.org/"><u><font color=#0066cc>http://soapinterop.org/</font></u></a>", "echoString"));<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ret = (String) call.invoke( new Object[] { "Hello!" } );<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Sent 'Hello!', got '" + ret + "'");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp; catch (Exception e) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e.toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>(2) SOAP信封：<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;SOAP-ENV:Envelope xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:SOAP-ENV="<a href="http://schemas.xmlsoap.org/soap/envelope/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/envelope/</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema-instance</font></u></a>"&gt;<br>&nbsp; &lt;SOAP-ENV:Body&gt;<br>&nbsp;&lt;ns1:echoString xmlns:ns1="<a href="http://soapinterop.org/"><u><font color=#0066cc>http://soapinterop.org/</font></u></a>"&gt;<br>&nbsp;&nbsp; &lt;arg0 xsi:type="xsd:string"&gt;Hello!&lt;/arg0&gt;<br>&nbsp;&lt;/ns1:echoString&gt;<br>&nbsp; &lt;/SOAP-ENV:Body&gt;<br>&lt;/SOAP-ENV:Envelope&gt;</p>
<p>2. 参数命名：<br>在上面的代码中，AXIS自动将在Soap消息中的函数调用参数命名为arg0,arg1等等，如果你想按照自己定义的参数名调用方法的话，很简单，在你调用invoke函数之前只要调用addParameter()函数即可。如下所示：</p>
<p>&nbsp;&nbsp; call.addParameter("testParam", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.axis.Constants.XSD_STRING,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.xml.rpc.ParameterMode.IN);<br>&nbsp;&nbsp; call.setReturnType(org.apache.axis.Constants.XSD_STRING);<br>将testParam定义为调用函数的第一个参数（这里也只有一个参数），这里也可以同时定义该参数的类型以及该参数是输入、输出还是输入输出类型。在这里它是一个输入类型，现在当你运行程序，你将得到下面的消息：<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;SOAP-ENV:Envelope xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:SOAP-ENV="<a href="http://schemas.xmlsoap.org/soap/envelope/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/envelope/</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema-instance</font></u></a>"&gt;<br>&nbsp; &lt;SOAP-ENV:Body&gt;<br>&nbsp;&lt;ns1:echoString xmlns:ns1="<a href="http://soapinterop.org/"><u><font color=#0066cc>http://soapinterop.org/</font></u></a>"&gt;<br>&nbsp;&nbsp; &lt;testParam xsi:type="xsd:string"&gt;Hello!&lt;/testParam&gt;<br>&nbsp;&lt;/ns1:echoString&gt;<br>&nbsp; &lt;/SOAP-ENV:Body&gt;<br>&lt;/SOAP-ENV:Envelope&gt;</p>
<p>3. 返回类型<br>在上面的代码中我们知道echoString函数将返回一个String对象，而且我们也希望通过客户端的调用能够返回预期的String对象。下面是一个典型的通过调用echoString函数后获得的Soap信封（消息）。<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br>&nbsp; &lt;SOAP-ENV:Envelope xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>" <br>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:SOAP-ENV="<a href="http://schemas.xmlsoap.org/soap/envelope/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/envelope/</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema-instance</font></u></a>"&gt; <br>&nbsp; &lt;SOAP-ENV:Body&gt;<br>&nbsp;&nbsp; &lt;ns1:echoStringResponse xmlns:ns1="<a href="http://soapinterop.org/"><u><font color=#0066cc>http://soapinterop.org/</font></u></a>"&gt; <br>&nbsp;&lt;result xsi:type="xsd:string"&gt;Hello!&lt;/result&gt;<br>&nbsp;&nbsp; &lt;/ns1:echoStringResponse&gt; <br>&nbsp; &lt;/SOAP-ENV:Body&gt;<br>&nbsp;&lt;/SOAP-ENV:Envelope&gt;<br>我们可以看到这里已经声明了返回类型（&lt;result xsi:type="xsd:string"&gt;）是一个String对象。这样Axis就可以将返回结果反序列化成我们想要的String对象了。<br>很多工具都会将这种确定的类型信息放到XML文件中，以生成消息的&#8220;自我描述部分&#8221;，另一方面，还有一些工具是象下面这样返回响应的：(Many toolkits put this kind of explicit typing information in the XML to make the message "self-describing". On the other hand, some toolkits return responses that look like this:)<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;SOAP-ENV:Envelope xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:SOAP-ENV="<a href="http://schemas.xmlsoap.org/soap/envelope/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/envelope/</font></u></a>"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema-instance</font></u></a>"&gt;<br>&nbsp;&lt;SOAP-ENV:Body&gt;<br>&nbsp; &lt;ns1:echoStringResponse xmlns:ns1="<a href="http://soapinterop.org/"><u><font color=#0066cc>http://soapinterop.org/</font></u></a>"&gt;<br>&nbsp;&nbsp; &lt;result&gt;Hello, I'm a string!&lt;/result&gt;<br>&nbsp; &lt;/ns1:echoStringResponse&gt;<br>&nbsp;&lt;/SOAP-ENV:Body&gt;<br>&lt;/SOAP-ENV:Envelope&gt;<br>在这里并没有返回类型，那么我们怎么知道应该将返回结果反序列化成什么类型的结果呢？答案是metadata，在这种情况下，我们需要一个描述来指明我们期望的返回类型，下面这行代码说明了在客户端应该如何去做：<br>call.setReturnType( org.apache.axis.Constants.XSD_STRING );<br>这个方法将会告诉Axis客户端，如果返回的结果没有指明类型的话，那么Axis将会把返回类型指明为xsi:type属性所预定义的SOAP类型，在这里XSD_STRING属性所指明的是String类型。</p>
<p>所以也有这样一个相似的方法，允许你指定所期望返回的Java的类。<br>call.setReturnClass(String.class);</p>
<br><br><a href="http://blog.csdn.net/tenwang1977/archive/2004/09/06/95991.aspx">http://blog.csdn.net/tenwang1977/archive/2004/09/06/95991.aspx</a>
<img src ="http://www.blogjava.net/waterjava/aggbug/125602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-21 16:20 <a href="http://www.blogjava.net/waterjava/archive/2007/06/21/125602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Apache Axis部署 Web服务时的常见问题及其解决方法</title><link>http://www.blogjava.net/waterjava/archive/2007/06/21/125596.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Thu, 21 Jun 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/21/125596.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/125596.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/21/125596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/125596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/125596.html</trackback:ping><description><![CDATA[<p>来自: <a href="http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/">http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/</a><a name=1><span class=atitle><br><br>1 引言</span></a></p>
<p><br>随着Web服务技术的发展和成熟，其方便性和易用性已逐渐被人们所接受，越来越多的合作伙伴之间开始利用Web服务来实现合作方之间的数据接口。使用Apache Axis和Linux平台是一种低成本的Web服务解决方案，但Apache Axis文档的FAQ对开发者来说内容还不够丰富，本文作者将自己使用Axis时遇到的问题和解决方法整理成文，奉献给Web服务的开发人员和对此感兴趣的读者朋友，旨在帮助大家节约一些宝贵的时间。有关Web服务的基础知识，读者可以阅读参考文献中推荐的文档。作者未在文中介绍Apache和Resin的安装方法，读者可以参考相关网站的说明文档。 </p>
<p>作者使用的软件环境如下。 </p>
<p>操作系统：Red Hat Linux 7.2 </p>
<p>Web服务器: Apache 1.3.27 </p>
<p>应用服务器：Resin 2.1.8 ( <a href="http://www.caucho.com/"><u><font color=#5c81a7>http://www.caucho.com/</font></u></a> ) </p>
<p>SOAP服务器：Apache Axis 1.1 </p>
<p>XML解析器：Xerces 2.5.0，Xalan 2.5.1 </p>
<p>JDK版本：JDK 1.4.1 </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.ibm.com/developerworks/cn/webservices/ws-axisfaq/#main"><strong><font color=#5c81a7>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=2><span class=atitle>2 使用Axis时的常见问题及其解决方法</span></a></p>
<p>
<p>2.1 Axis运行需要哪些jar文件 </p>
<p>对Axis解包后，将axis-1_1/webapps/axis/WEB-INF/lib/目录下的jar文件复制到/usr/local/apache/htdocs/WEB-INF/lib目录下(Web应用程序的目录)。应包括以下jar文件。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>axis-ant.jar
            axis.jar
            commons-discovery.jar
            commons-logging.jar
            jaxrpc.jar
            log4j-1.2.8.jar
            name.txt
            saaj.jar
            wsdl4j.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果需要使用axis提供的测试页面，还要将axis-1_1/webapps/axis/目录下的文件复制到/usr/local/apache/htdocs/axis/目录下。应包括以下募? </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>EchoHeaders.jws
            fingerprint.jsp
            happyaxis.jsp
            index.html
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N10084><span class=smalltitle><strong><font face=Arial>2.2 应该使用哪一种XML解析器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>XML解析器选用不当，经常会导致使用Apache Axis时出现一些莫名其妙的问题。 </p>
<p>由于Apache Axis 并未对Resin内置的xml解析器进行过测试，因此推荐读者使用已通过测试的Xerces xml解析器。可以从 <a href="http://xml.apache.org/xalan-j/index.html"><u><font color=#5c81a7>http://xml.apache.org/xalan-j/index.html</font></u></a> 处下载Xalan的Java版XSLT处理器，其中包含了Xerces的Java版XML解析器，不需要再单独下载xml解析器。 </p>
<p>Xalan 2.5.1解包后，将bin/目录下的xercesImpl.jar、xml-apis.jar和xalan.jar复制到resin安装目录的lib/目录下，例如/usr/local/resin/lib。 </p>
<p>编辑/etc/目录下的profile文件，找到设置CLASSPATH环境变量的位置，在其后加入下面的内容(B shell)。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>XMLPARSER=$RESIN_HOME/lib/xalan.jar:$RESIN_HOME/lib/xercesImpl.jar:$RESIN_HOME/lib/xml-apis.jar
            export CLASSPATH=$XMLPARSER:$CLASSPATH
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.2.1 注意事项 <br>如果CLASSPATH中包含其它的XML解析器设置，应将其从CLASSPATH环境变量的设置中去掉，以免发生冲突。 </p>
<p><a name=N100A5><span class=smalltitle><strong><font face=Arial>2.3 如何在Resin中使用Xerces的XML解析器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>通过修改resin.conf将resin的XmlParser置换为Xerces的XmlParser。在resin.conf对应的Web应用程序配置中加入以下设置。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/&gt;
            &lt;system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/&gt;
            &lt;system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/&gt;
            &lt;system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>配置完成后重新启动Resin。</p>
<p><a name=N100B7><span class=smalltitle><strong><font face=Arial>2.4 如何排除XML解析器出现的异常</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.4.1 问题描述</p>
<p>使用http://test.com/axis查看已部署的服务时出现Axis内部错，显示有关WSDD配置的异常信息。如果把WEB-INF目录下的server-config.wsdd删除，再查看就正常了，但只能看到AdminService和Version两个系统缺省的服务，后来部署的服务都看不到了。 </p>
<p>2.4.2 原因分析</p>
<p>Axis会在WEB应用程序的WEB-INF/目录下自动生成一个名字为server-config.wsdd的xml文件，其中记录了已部署的WEB服务。每部署一个新的WEB服务时，Axis都会将新服务的描述信息加入到server-config.wsdd中。 </p>
<p>故障站点使用的XmlParser是resin内置的XmlParser，Axis并未对其对进行过兼容性测试，查看WEB服务信息时需要从server-config.wsdd(这是一个xml文件)取得已部署的WEB服务描述信息，当server-config.wsdd的内容较复杂时，resin内置的XmlParser因某种原因出现异常，导致Axis内部错误。Server-config.wsdd中记录的Web服务描述信息较少时不会出现异常。 </p>
<p>2.4.3 解决方法 </p>
<p>修改resin.conf，将resin的XmlParser置换为Xerces的XmlParser。置换方法参见2.3节。</p>
<p>2.4.4 小结 </p>
<p>如果Axis报告的错误中有关于xml解析器的错误，建议读者参照本小节描述的方法更换应用服务器的xml解析器，将会有助于问题的解决。 </p>
<p><a name=N100DA><span class=smalltitle><strong><font face=Arial>2.5 如何将Axis集成到Resin或其它应用服务器</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>Axis是以Servlet的方式运行的，而Resin的作用相当于Servlets容器(Container)，因此只要配置得当，就可以使Axis在Resin环境中运行，这一点也适用于Resin以外的其它应用服务器。在Resin中配置Axis的方法如下。 </p>
<p>将axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置项复制到resin.conf中对应的Web应用程序配置中。通常应包括以下内容。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode> &lt;!-- Axis Web-Service Configuration Start --&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.transport.http.AxisServlet
            &lt;/servlet-class&gt;
            &lt;/servlet&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
            &lt;display-name&gt;Axis Admin Servlet&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.transport.http.AdminServlet
            &lt;/servlet-class&gt;
            &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
            &lt;/servlet&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
            &lt;display-name&gt;SOAPMonitorService&lt;/display-name&gt;
            &lt;servlet-class&gt;
            org.apache.axis.monitor.SOAPMonitorService
            &lt;/servlet-class&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;SOAPMonitorPort&lt;/param-name&gt;
            &lt;param-value&gt;5001&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;load-on-startup&gt;100&lt;/load-on-startup&gt;
            &lt;/servlet&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/axis/servlet/AxisServlet&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;SOAPMonitorService&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/SOAPMonitor&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            &lt;!-- uncomment this if you want the admin servlet --&gt;
            &lt;!--
            &lt;servlet-mapping&gt;
            &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt;
            &lt;url-pattern&gt;/axis/servlet/AdminServlet&lt;/url-pattern&gt;
            &lt;/servlet-mapping&gt;
            --&gt;
            &lt;!-- currently the W3C havent settled on a media type for WSDL;
            http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
            for now we go with the basic 'it's XML' response --&gt;
            &lt;mime-mapping&gt;
            &lt;extension&gt;wsdl&lt;/extension&gt;
            &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
            &lt;/mime-mapping&gt;
            &lt;mime-mapping&gt;
            &lt;extension&gt;xsd&lt;/extension&gt;
            &lt;mime-type&gt;text/xml&lt;/mime-type&gt;
            &lt;/mime-mapping&gt;
            &lt;!-- Axis Web-Service Configuration End --&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N100EC><span class=smalltitle><strong><font face=Arial>2.6 Axis提供了哪些开发工具</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>Apache Axis提供了WSDL2Java和Java2WSDL两个开发工具。 </p>
<p>WSDL2Java利用已知的WSDL文件生成服务端和客户端代码。该WSDL文件可以是由合作伙伴提供的，也可以是利用Java2WSDL生成的。Java2WSDL根据已有的Java类文件生成WSDL文件，Java类文件可以是接口类文件，并不需要实现细节。 </p>
<p>此外Axis还提供了SoapMonitorApplet和TCPMon工具，可用于监测Web服务。 </p>
<p><a name=N100FD><span class=smalltitle><strong><font face=Arial>2.7 如何生成Web服务的服务端和客户端代码</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.7.1 生成或取得WSDL文件</p>
<p>Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成，例如下面的接口文件SoftwarePrice.java。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>package samples.userguide.example6;
            /**
            * Interface describing a web service to set and get software prices.
            **/
            public interface SoftwarePrice {
            public void setWidgetPrice(String softWareName, String price);
            public String getWidgetPrice(String softWareName);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>编译SoftwarePrice.java。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>javac SoftwarePrice.java
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>将SoftwarePrice.class复制到正确的package路径下。 </p>
<p>执行下面的命令: </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl  -l"http://test.com:80/services/SoftwarePrice" -n "urn:SoftwarePrice"
            -p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.SoftwarePrice
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>各参数的含义如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>-o：指定输出的WSDL文件的文件名。
            <br>
            -l：指定服务的位置。
            <br>
            -n：WSDL文件的目标名字空间。
            <br>
            -p：指定从package到名字空间的映射，这里可以有多个映射。
            <br>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>最后面的类文件包含了Web服务的接口。 </p>
<p>该命令执行后，将生成sp.wsdl文件。 </p>
<p>如果按CLASSPATH的设置找不到指定的类文件，Axis将报告异常，如下所示。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
            at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
            at java.security.AccessController.doPrivileged(Native Method)
            &#8230;&#8230;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果出现上面的问题，请检查是否已将有关类文件复制到正确的位置或CLASSPATH设置是否正确。 </p>
<p>生成WSDL文件以后，就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了。 </p>
<p>2.7.1.1 注意事项 </p>
<p>WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者，开发者只要按照既定的WSDL文件生成客户端或服务端代码就可以了。 </p>
<p>2.7.2 生成客户端或服务端代码 </p>
<p>WSDL2Java工具用于从WSDL文件生成客户端存根（stub）代码，服务端框架（skeleton）代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码，因此该工具极大地减轻了开发人员的编码负担。WSDL2Java的使用举例如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true MyService.wsdl
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>执行上述命令后将生成下列文件。 </p>
<p>
<table cellSpacing=0 cellPadding=5 width="90%" border=1>
    <tbody>
        <tr>
            <td width="20%">No.</td>
            <td width="40%">文件</td>
            <td width="40%">用途</td>
        </tr>
        <tr>
            <td>1.</td>
            <td>deploy.wsdd</td>
            <td>MyService服务的部署描述文件</td>
        </tr>
        <tr>
            <td>2.</td>
            <td>MyService.java</td>
            <td>MyService服务的接口文件</td>
        </tr>
        <tr>
            <td>3.</td>
            <td>MyServiceService.java</td>
            <td>获得MyService服务的接口文件</td>
        </tr>
        <tr>
            <td>4.</td>
            <td>MyServiceServiceLocator.java</td>
            <td>实现MyServiceService接口</td>
        </tr>
        <tr>
            <td>5.</td>
            <td>MyServiceSoapBindingImpl.java</td>
            <td>实现MyService接口，应向其中补充业务逻辑</td>
        </tr>
        <tr>
            <td>6.</td>
            <td>MyServiceSoapBindingSkeleton.java</td>
            <td>MyService服务的服务端框架代码,实现MyService, org.apache.axis.wsdl.Skeleton接口</td>
        </tr>
        <tr>
            <td>7.</td>
            <td>MyServiceSoapBindingStub.java</td>
            <td>MyService服务的客户端存根代码,实现MyService接口</td>
        </tr>
        <tr>
            <td>8.</td>
            <td>undeploy.wsdd</td>
            <td>注销MyService服务的部署描述文件</td>
        </tr>
    </tbody>
</table>
</p>
<p>2.7.3 编写Web服务客户端代码</p>
<p>Web服务的客户端程序完成对Web服务的调用，其程序结构如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空间;
            public class TestClient {
            public static void main (String[] args) throws Exception
            {
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = new  SPInterfaceForVNetLocator();//获得一个locator对象
            locator.setMaintainSession(true);
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = locator.getSPInterfaceForVNetSoap();//获得服务对象
            com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
            //初始化Web服务中定义的数据类型
            try {
            feedbackRes =  service.generalLedgerFeedback();//调用Web服务的方法并取得返回值
            System.out.println("FeedbackResult :");
            if(feedbackRes != null)
            {
            System.out.println("SPID: " +feedbackRes.getSPID());
            System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
            System.out.println("result: " +feedbackRes.getResult());
            }else
            {
            System.out.println("feedbackRes is null!");
            }
            } catch (java.rmi.RemoteException re) {
            //           throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re );
            re.printStackTrace();
            }
            }//End of main()
            }//End of TestClient class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>测试客户端程序是非常简单的，将客户端程序编译后，执行"java TestClient"即可。</p>
<p><a name=N101DB><span class=smalltitle><strong><font face=Arial>2.8 如何编写服务端代码</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>向MyServiceSoapBindingImpl.java添加相关的业务逻辑代码后，将WSDL2Java生成的源程序编译，打包成jar文件，复制到/usr/local/apache/htdocs/WEB-INF/lib/目录下。 </p>
<p><a name=N101E6><span class=smalltitle><strong><font face=Arial>2.9 如何发布Web服务</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>有了deploy.wsdd文件并准备好类文件后，就可以发布MyService服务了。Axis在安装后自动发布了AdminService，利用它可以发布新的Web服务。方法如下。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            上面的命令执行后，有如下提示。
            Processing file deploy.wsdd
            &lt;Admin&gt;Done processing&lt;/Admin&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101F5><span class=smalltitle><strong><font face=Arial>2.10 执行WSDL2Java时报告" 类型被引用但未定义"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.10.1 问题描述</p>
<p>执行WSDL2Java时报告下面的异常：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java.io.IOException: Type {http://schemas.xmlsoap.org/wsdl/} ArrayOfFailedRecord is referenced but not defined.
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.10.2 原因分析</p>
<p>出现上述情况可能的原因有：</p>
<p>类型未定义就被引用。</p>
<p>使用了错误的名字空间。 </p>
<p>WSDL文件中存在输入错误。 </p>
<p>2.10.3 解决方法</p>
<p>经过仔细检查发现wsdl文件中的</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;s:element minOccurs="0" maxOccurs="1" name="FailedRecords" type="s0:ArrayOfFailedRecord" /&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>的type=" s0:ArrayOfFailedRecord"中的s0:前面有一个空格，将空格删除后问题解决了。</p>
<p>2.10.4 小结</p>
<p>WSDL文件中出现的编辑错误有可能导致执行WSDL2Java时出现"类型被引用但未定义"错误。</p>
<p><a name=N10229><span class=smalltitle><strong><font face=Arial>2.11 server-config.wsdd的作用是什么</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>server-config.wsdd记录了axis已发布的Web服务的描述信息。</p>
<p>2.12 发布Web服务时报告"Exception:: (404)Not Found"</p>
<p>2.12.1 问题描述</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>执行java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd命令发布WEB服务时报告如下内容。
            Processing file deploy.wsdd
            Exception:: (404)Not Found
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>Apache的access_log显示如下。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>127.0.0.1 - - [17/Sep/2003:15:56:33 +0800] "POST /services/AdminService HTTP/1.0" 404 293
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.12.2 原因分析</p>
<p>出现这个问题的比较简单的原因可能是端口不对，或URL路径不对(例如路径中多写了目录)，Axis的SoapMonitor服务按指定的端口或URL找不到AdminService，需要检查正确的端口号和URL路径。 </p>
<p>比较深层次的原因就复杂得多了。</p>
<p>本文作者遇到的是下面的情况。 </p>
<p>AdminService是一个已发布的WEB服务。 </p>
<p>AdminClient使用soap协议同AdminService通信，需要按指定的端口和URL定位AdminService，而原来使用的resin.conf中，有两个web-app配置项，配置A的摘要如下所示。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;host id=' '&gt;
            &lt;app-dir&gt;/usr/local/apache/htdocs/&lt;/app-dir&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>配置B的摘要如下所示。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;host id='test.com'&gt;
            &lt;app-dir&gt;/usr/local/apache/htdocs/esales/&lt;/app-dir&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>Axis的有关配置在配置B中。</p>
<p>Httpd.conf中的DocumentRoot是/usr/local/apache/htdocs/。</p>
<p>使用java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd发布WEB服务时，需要按http协议解析url: //localhost:80/services/AdminService。由于htdocs/目录下并没有services/目录(services是Axis在resin.conf中的servlet-mapping)，因此应用服务器按resin.conf中的配置去定位AdminService ，因为url的主机名为localhost，因此resin不会到&lt;host id='test.com'&gt;(配置B)中去定位url，而是到配置A中去定位，在配置A中并没有Axis的配置，找不到与AdminService相关的url，因此报告了前面描述的异常情况。 </p>
<p>2.12.3 解决方法</p>
<p>知道了原因后，按如下方法就可以解决了。</p>
<p>将配置B中全部关于Axis的配置移到配置A中，注意相应地要改变/etc/profile中的CLASSPATH变量的值。 </p>
<p>保存resin.conf后，重新登录服务器(使新的CLASSPATH生效)，重新启动resin。再次发布WEB服务。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>屏幕显示如下。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Processing file deploy.wsdd
            &lt;Admin&gt;Done processing&lt;/Admin&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>WEB服务终于发布成功了。 </p>
<p>在发布成功的情况下apache的access_log中会看到如下的log： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>tail -f access_log|grep vice
            127.0.0.1 - - [17/Sep/2003:16:05:00 +0800] "POST /services/AdminService HTTP/1.0" 200 296 "-" "Axis/1.1"
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.12.4 小结</p>
<p>本小节描述的问题可能是读者遇到的出现最多的异常，但原因并不是唯一的。遇到该问题时，建议读者冷静分析出现问题的可能原因，多实验几种解决方法，最终一定可以成功！ </p>
<p><a name=N10292><span class=smalltitle><strong><font face=Arial>2.13 如何监测SOAP请求和响应流</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.13.1 引言 </p>
<p>发布了Web服务以后，如何观察请求和响应数据呢？记录运行日志是一种传统且有效的方法，但对于调试程序来讲还不够方便和直观。值得欣慰的是，Axis为我们提供了在客户端观察SOAP请求和响应流数据的工具SoapMonitor，经过适当配置后，可以实时地观察到Web服务的SOAP请求和响应数据。SoapMonitor是一个Java Applet程序，通过浏览器下载到客户端运行。下面就介绍SoapMonitor的配置和使用方法。 </p>
<p>2.13.2 准备SOAPMonitor 小应用程序</p>
<p>在Axis 1.1中，没有为我们编译SOAPMonitor.java程序，但我们可以在axis-1_1/webapps/axis/目录下找到名字为SOAPMonitorApplet.java的源程序文件，自己进行编译。该程序编译后，会生成如下的类文件： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>SOAPMonitorApplet.class
            SOAPMonitorApplet$ServiceFilterPanel.class
            SOAPMonitorApplet$SOAPMonitorData.class
            SOAPMonitorApplet$SOAPMonitorFilter.class
            SOAPMonitorApplet$SOAPMonitorPage.class
            SOAPMonitorApplet$SOAPMonitorTableModel.class
            SOAPMonitorApplet$SOAPMonitorTextArea.class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>读者需要把上述类文件复制到自己的Web应用程序目录下，本例中是/usr/local/apache/htdocs/目录。 </p>
<p>在浏览器地址样中输入SOAPMonitor的地址，例如 <a href="http://test.com/SOAPMonitor"><u><font color=#5c81a7>http://test.com/SOAPMonitor</font></u></a> ，浏览器会提示用户正在下载Applet程序，下载完毕后，读者可以在浏览器窗口中看到如图4-1所示的用户界面。如果上述类文件的位置不正确，浏览器会报告"找不到类"的错误。此时应检查是否已将上述类文件复制到正确的目录下。 </p>
<br><br><img alt="" src="http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/image01.gif"> <br>
<p><strong>图 2-1 SOAPMonitor的界面</strong> </p>
<p>2.13.3 发布SOAPMonitor服务</p>
<p>图2-1所示的SOAPMonitor界面出现后，并不意味着就可以观察到Web服务的SOAP请求流与响应流了，首先需要发布SOAPMonitorService。该Web服务是由Axis提供的，但需要由用户自己进行发布，方法如下。 </p>
<p>获得SOAPMonitor服务的WSDD文件deploy.wsdd，内容如下(也可到 <a href="http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html"><u><font color=#5c81a7>http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html</font></u></a> 复制该文件)： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
            &lt;handler name="soapmonitor"
            type="java:org.apache.axis.handlers.SOAPMonitorHandler"&gt;
            &lt;parameter name="wsdlURL"
            value="/axis/SOAPMonitorService-impl.wsdl"/&gt;
            &lt;parameter name="namespace"
            value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/&gt;
            &lt;parameter name="serviceName" value="SOAPMonitorService"/&gt;
            &lt;parameter name="portName" value="Demo"/&gt;
            &lt;/handler&gt;
            &lt;service name="SOAPMonitorService" provider="java:RPC"&gt;
            &lt;parameter name="allowedMethods" value="publishMessage"/&gt;
            &lt;parameter name="className"
            value="org.apache.axis.monitor.SOAPMonitorService"/&gt;
            &lt;parameter name="scope" value="Application"/&gt;
            &lt;/service&gt;
            &lt;/deployment&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>发布SOAPMonitor服务：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.13.4 修改deploy.wsdd</p>
<p>发布SOAPMonitor服务后，还要对被监测的Web服务进行配置。方法是先注销该Web服务，然后修改该服务对应的WSDD文件，在其中增加请求流和响应流的配置，否则是观测不到SOAP请求和响应流的。 </p>
<p>注销Web服务的方法如下。 </p>
<p>进入该Web服务的undeploy.wsdd文件所在的目录，执行 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改WSDD文件的方法如下。 </p>
<p>以Axis提供的MyService为例，对MyService的WSDD文件做如下修改。 </p>
<p>修改前: </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>...
            &lt;service name="MyService" provider="java:RPC"&gt;
            &lt;parameter name="className" value="samples.userguide.example3.MyService"/&gt;
            &lt;parameter name="allowedMethods" value="*"/&gt;
            ...
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改后: (有下划线的行是新加入的内容)</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>...
            &lt;service name="MyService" provider="java:RPC"&gt;
            &lt;requestFlow&gt;
            &lt;handler type="soapmonitor"/&gt;
            &lt;/requestFlow&gt;
            &lt;responseFlow&gt;
            &lt;handler type="soapmonitor"/&gt;
            &lt;/responseFlow&gt;
            &lt;parameter name="className" value="samples.userguide.example3.MyService"/&gt;
            &lt;parameter name="allowedMethods" value="*"/&gt;
            ...
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>修改WSDD文件后，重新发布MyService服务：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2.13.5 启动SOAPMonitor小应用程序</p>
<p>按2.13.2节介绍的方法启动SOAPMonitor小应用程序。</p>
<p>使用客户端程序测试MyService服务： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>#  java samples.userguide.example3.Client -lhttp://vnet.sohu.com/services/MyService "test"
            结果为：You typed : test
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>注意，一定要先启动SOAPMonitor小应用程序，后调用Web服务才能观察到SOAP请求和响应流。</p>
<p>2.13.6 观察SOAP请求和响应流</p>
<p>这时在SoapMonitorApplet的窗口中可以观察到SOAP和请求和响应消息，如图2-2所示。 </p>
<br><br><img alt="" src="http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/image02.gif"> <br>
<p><strong>图2-2 MyService的Soap请求和响应流</strong> </p>
<p><a name=N10337><span class=smalltitle><strong><font face=Arial>2.14 使用客户端程序测试Web服务时报告"Exception:: (404)Not Found"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.14.1 问题描述</p>
<p>WEB服务接口编写完成并发布后，客户端测试程序收不到WEB服务的返回结果，Apache或Resin的log中也看不到访问记录。但测试程序返回结果为0(成功)，在没有部署该WEB服务的情况下，也是这个结果，因此怀疑调用的是WSDL文件的提供者自己测试用的WEB服务接口，可能与另一方提供的WSDL文件有关。 </p>
<p>2.14.2 原因分析</p>
<p>合作伙伴调用WEB服务就能够成功，从WEB服务主机自己的客户端调用就接收不到数据，估计与合作伙伴提供的WSDL文件有关，该WSDL文件影响了WSDL2Java生成的客户端stub代码。检查stub代码，发现其soapAction都指向了合作伙伴的测试地址。 </p>
<p>2.14.3 解决方法</p>
<p>修改stub代码中的soapAction，改为sp(Service Provider)自己的WEB服务URL。重新编译程序并发布Web服务，问题解决。 </p>
<p>_call.setSOAPActionURI("sp自己的Web服务地址"); </p>
<p>2.14.4 小结</p>
<p>本小节描述的问题出现于Web服务提供方按合作伙伴统一提供的WSDL文件生成客户端代码的情况。遇到这类问题，读者可直接检查WSDL2Java自动生成的代码的有关部分。 </p>
<p>在WSDL文件中可以看到与下列内容相似的设置。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;wsdl:service name="SPInterfaceForVNet"&gt;
            &lt;wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap"&gt;
            &lt;wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" /&gt;
            &lt;/wsdl:port&gt;
            &lt;/wsdl:service&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中 <a href="http://test.com/services/SPInterfaceSoap"><u><font color=#5c81a7>http://test.com/services/SPInterfaceSoap</font></u></a>即为已发布的WEB服务的URL，供客户端调用。 </p>
<p><a name=N10368><span class=smalltitle><strong><font face=Arial>2.15 如何列出已发布的Web服务</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>使用下面的命令： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/  list
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>实际上该命令的输出就是server-config.wsdd文件的内容。 </p>
<p><a name=N1037A><span class=smalltitle><strong><font face=Arial>2.16 发布Web服务时报告"调用目标异常"</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.16.1 问题描述 </p>
<p>在部署WEB服务时报告：java.lang.reflect.InvocationTargetException异常。 </p>
<p>2.16.2 原因分析 </p>
<p>在WSDL文件中自定义的名字空间与Axis的services名字空间冲突。 </p>
<p>2.16.3 解决方法 </p>
<p>修改WSDL文件，将services改为别的名字。 </p>
<p><a name=N10394><span class=smalltitle><strong><font face=Arial>2.17 WSDL文件中的targetNamespace的作用是什么</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>TargetNamespace指明目标名字空间，用于验证xml文档。 </p>
<p>在WSDL文件中，&lt;definitions&gt;中的targetNamespace与&lt;types&gt;中的targetNamespace应保持一致。 </p>
<p><a name=N103A2><span class=smalltitle><strong><font face=Arial>2.18 Web服务部署成功但检测不到</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>2.19 客户端程序找不到可用的Web服务</p>
<p>2.19.1 问题描述</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>执行
            java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>时显示&lt;Admin&gt;Done processing&lt;/Admin&gt;，却检查不到新的服务，在WEB-INF/目录下的server-config.wsdd文件中也看不到相应的配置项。 </p>
<p>2.19.2 原因分析</p>
<p>新的WEB服务的类文件没有重新编译并复制到正确的位置。 </p>
<p>2.19.3 解决方法</p>
<p>WEB服务的类文件可以打包为jar文件。在CLASSPATH环境变量中正确设置jar文件的路径。例如：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jar cvf  SPInterfaceSoap.jar com/zx/service/v1_0/*.class
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>将SPInterfaceSoap.jar复制到WEB-INF/lib/目录下，重新发布WEB服务。 </p>
<p><a name=N103CA><span class=smalltitle><strong><font face=Arial>2.20 如何排除原因不明的错误</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>有时，在对WEB服务执行客户端测试时会出现慕名其妙的错误。为保证环境是正确的，可以按下面的步骤排除原因不明的错误。 </p>
<p>1. Undeploy被测试的服务 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2. 重新启动resin: /usr/local/resin/bin/httpd.sh restart(如果是其它的应用服务器，请按相应的方法重新启动) </p>
<p>3. 重新发布WEB服务 </p>
<p>4. 进行测试 </p>
<br>
<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.ibm.com/developerworks/cn/webservices/ws-axisfaq/#main"><strong><font color=#5c81a7>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=3><span class=atitle>3 小结</span></a></p>
<p><br>目前有很多可以使用的应用服务器和Web服务平台软件，本文仅以Apache Axis和Resin为例介绍了在部署Web服务的过程中可能遇到的问题及其解决方法，其中并未讨论Web服务的安全性问题。对于如何高效地开发和部署Web服务以及如何确保Web服务的安全性，还希望对此感兴趣的读者共同参与讨论，对于文中存在的错误和不足之处也希望读者朋友们能够不吝批评指正。 </p>
<br><br>
<p><a name=resources><span class=atitle>参考资料 </span></a></p>
<ul>
    <li><a href="http://xml.apache.org/xerces2-j/index.html"><u><font color=#5c81a7>http://xml.apache.org/xerces2-j/index.html</font></u></a> <br><br>
    <li><a href="http://xml.apache.org/xalan-j/index.html"><u><font color=#5c81a7>http://xml.apache.org/xalan-j/index.html</font></u></a> <br><br>
    <li><a href="http://ws.apache.org/axis/"><u><font color=#996699>http://ws.apache.org/axis/</font></u></a> <br><br>
    <li><a href="http://www.w3.org/TR/SOAP/"><u><font color=#5c81a7>http://www.w3.org/TR/SOAP/</font></u></a> <br><br>
    <li><a href="http://www.w3c.org/TR/wsdl.html"><u><font color=#5c81a7>http://www.w3c.org/TR/wsdl.html</font></u></a> <br><br>
    <li><a href="http://www.caucho.com/"><u><font color=#5c81a7>http://www.caucho.com/</font></u></a> <br><br><br></li>
</ul>
<p><a name=author><span class=atitle>关于作者</span></a></p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
        </tr>
        <tr vAlign=top align=left>
            <td>
            <p>&#160;</p>
            </td>
            <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
            <td width="100%">
            <p>姓名：刘红涛 <br>电子邮件:　 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#101;&#100;&#119;&#97;&#118;&#101;&#104;&#116;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;&#63;&#99;&#99;&#61;"><u><font color=#5c81a7>redwaveht@hotmail.com</font></u></a> <br>办公电话：+86(010)87717788转5645 <br>移动电话：13910662615 <br>专长：电子邮件系统，计费系统，Radius协议,Web服务。 <br>兴趣：J2EE <br>研究方向：Web服务和数据挖掘 </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/waterjava/aggbug/125596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-21 16:02 <a href="http://www.blogjava.net/waterjava/archive/2007/06/21/125596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS全攻略（一）</title><link>http://www.blogjava.net/waterjava/archive/2007/06/21/125594.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Thu, 21 Jun 2007 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/21/125594.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/125594.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/21/125594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/125594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/125594.html</trackback:ping><description><![CDATA[<p>一、Axis简介</p>
<p><br>1. 什么是SOAP</p>
<p>SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出，随着不断地完善和改进，SOAP很快被业界广泛应用，目前完全发布版本是1.1。在其发展过程中，W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时，SOAP1.2草案已经发布，1.2对1.1中相对混乱的部分做了改进。<br>SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。</p>
<p><br>2. 什么是Axis</p>
<p>Axis是Apache组织推出的SOAP引擎，Axis项目是Apache组织著名的SOAP项目的后继项目，目前最新版本是采用Java开发的1.1版本，C++的版本正在开发之中。Axis v1.1软件包可以从<a href="http://ws.apache.org/axis/dist/1_1/"><u><font color=#0066cc>http://ws.apache.org/axis/dist/1_1/</font></u></a>下载得到。<br>但是Axis不仅仅是一个SOAP引擎，它还包括：<br>&nbsp;&nbsp;&nbsp; 一个独立运行的SOAP服务器<br>&nbsp;&nbsp;&nbsp; 一个servlet引擎的插件，这个servlet引擎可以是Tomcat<br>&nbsp;&nbsp;&nbsp; 对WSDL的扩展支持<br>&nbsp;&nbsp;&nbsp; 一个将WSDL的描述生成JAVA类的工具<br>&nbsp;&nbsp;&nbsp; 一些示例代码<br>&nbsp;&nbsp;&nbsp; 还有一个监控TCP/IP包的工具<br>&nbsp;<br>二、Axis的安装</p>
<p>应用Axis开发Web Services，你需要安装如下软件：<br>1.JDK1.4.2<br>2.一个支持Servlet的服务器引擎，比如广为人知的Tomcat。</p>
<p>当安装好Tomcat之后，只需将下载的Axis软件包解压缩，将其中的&#8220;webapps&#8221;目录下的&#8220;axis&#8221;目录整个拷贝到Tomcat安装目录下的&#8220;webapps&#8221;目录下即可。</p>
<p>三、Axis的配置</p>
<p>Axis基于Java开发，可以部署于多种操作系统，使用前需要配置一系列的系统变量，在此假定你已经在本机上装好了Tomcat 4.0以上的版本，需要配置的系统变量如下表所示：</p>
<p>CATALINA_HOME<br>C:\Tomcat_4_1</p>
<p>（此处应为Tomcat的安装位置，注意路径名中不要有空格）</p>
<p>AXIS_HOME<br>%CATALINA_HOME%\webapps\axis</p>
<p>AXIS_LIB<br>%AXIS_HOME%\lib</p>
<p>AXISCLASSPATH<br>%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar</p>
<p>CLASSPATH 中加入：<br>%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar</p>
<p>四、Axis的测试</p>
<p>安装配置完毕后，应测试一下是否Axis可以正确运行了。</p>
<p>　　启动Tomcat服务器，在浏览器中访问<a href="http://localhost:8080/axis/happyaxis.jsp"><u><font color=#800080>http://localhost:8080/axis/happyaxis.jsp</font></u></a>，如果页面显示有错误，则需要回头检查一下相关配置是否正确，如果浏览页面能正确显示出系统组件、属性等参数配置信息，则表示安装成功。现在可以开始开发你的Web Services应用了。</p>
<p>五、服务的发布<br>Axis提供了两种服务发布方式，一种是即时发布（Instant Deployment），一种是定制发布（Custom Deployment）。</p>
<p>1. 使用即时发布 Java Web Service(JWS)</p>
<p>　　对即时发布的支持是Axis的特色之一，使用即时发布使用户只需有提供服务的Java类的源代码，即可将其迅速发布成Web服务。每当用户调用这类服务的时候，Axis会自动进行编译，即使服务器重启了也不必对其做任何处理，使用非常简单快捷。</p>
<p>　　使用即时发布首先需要一个实现服务功能的Java源文件，将其扩展名改为.jws（Java Web Service的缩写），然后将该文件放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录下即可。<br>&nbsp;&nbsp;&nbsp; 在此给出一个从英里到公里的长度单位转换的服务，其源码如下：</p>
<p>文件Distance.jws</p>
<p>public class Distance<br>{<br>&nbsp;&nbsp;&nbsp; public double convertMile2Kilometre( double mile )<br>&nbsp;&nbsp;&nbsp; {&nbsp;<br>&nbsp;return mile * 1.609;&nbsp;&nbsp;//实现英里到公里的距离转换<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>将其放到&#8220;&#8230;&#8230;\webapps\axis&#8221;目录，通过访问<a href="http://localhost:8080/axis/Distance.jws?wsdl"><u><font color=#800080>http://localhost:8080/axis/Distance.jws?wsdl</font></u></a>可以看到这个服务的WSDL描述文件，这说明Distance服务被成功发布了。描述的WDSL代码如下：<br>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br>- &lt;wsdl:definitions targetNamespace="<a href="http://192.168.0.26:8080/axis/Distance.jws"><u><font color=#0066cc>http://192.168.0.26:8080/axis/Distance.jws</font></u></a>" xmlns="<a href="http://schemas.xmlsoap.org/wsdl/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/</font></u></a>"&nbsp; <br>&nbsp;&nbsp; xmlns:apachesoap="<a href="http://xml.apache.org/xml-soap"><u><font color=#0066cc>http://xml.apache.org/xml-soap</font></u></a>" xmlns:impl="<a href="http://192.168.0.26:8080/axis/Distance.jws"><u><font color=#0066cc>http://192.168.0.26:8080/axis/Distance.jws</font></u></a>" xmlns:intf="<a href="http://192.168.0.26:8080/axis/Distance.jws"><u><font color=#0066cc>http://192.168.0.26:8080/axis/Distance.jws</font></u></a>" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/</font></u></a>" xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/soap/</font></u></a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"&gt;<br>- &lt;wsdl:message name="convertMile2KilometreRequest"&gt;<br>&nbsp; &lt;wsdl:part name="mile" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:message name="convertMile2KilometreResponse"&gt;<br>&nbsp; &lt;wsdl:part name="convertMile2KilometreReturn" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:portType name="Distance"&gt;<br>- &lt;wsdl:operation name="convertMile2Kilometre" parameterOrder="mile"&gt;<br>&nbsp; &lt;wsdl:input message="impl:convertMile2KilometreRequest" name="convertMile2KilometreRequest" /&gt; <br>&nbsp; &lt;wsdl:output message="impl:convertMile2KilometreResponse" name="convertMile2KilometreResponse" /&gt; <br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:portType&gt;<br>- &lt;wsdl:binding name="DistanceSoapBinding" type="impl:Distance"&gt;<br>&nbsp; &lt;wsdlsoap:binding style="rpc" transport="<a href="http://schemas.xmlsoap.org/soap/http"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/http</font></u></a>" /&gt; <br>- &lt;wsdl:operation name="convertMile2Kilometre"&gt;<br>&nbsp; &lt;wsdlsoap:operation soapAction="" /&gt; <br>- &lt;wsdl:input name="convertMile2KilometreRequest"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" namespace="<a href="http://defaultnamespace/"><u><font color=#0066cc>http://DefaultNamespace</font></u></a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:input&gt;<br>- &lt;wsdl:output name="convertMile2KilometreResponse"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" namespace="<a href="http://192.168.0.26:8080/axis/Distance.jws"><u><font color=#0066cc>http://192.168.0.26:8080/axis/Distance.jws</font></u></a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:output&gt;<br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:binding&gt;<br>- &lt;wsdl:service name="DistanceService"&gt;<br>- &lt;wsdl:port binding="impl:DistanceSoapBinding" name="Distance"&gt;<br>&nbsp; &lt;wsdlsoap:address location="<a href="http://192.168.0.26:8080/axis/Distance.jws"><u><font color=#0066cc>http://192.168.0.26:8080/axis/Distance.jws</font></u></a>" /&gt; <br>&nbsp; &lt;/wsdl:port&gt;<br>&nbsp; &lt;/wsdl:service&gt;<br>&nbsp; &lt;/wsdl:definitions&gt;</p>
<p>需要注意的是：JWS的web服务发布是一个很简单的Web服务发布方式，在页面中你不能使用包，而且由于代码是在运行期被编译的，所以在部署之后，你也很难找到错误所在。</p>
<p>2. 使用定制发布 Web Service Deployment Descriptor(WSDD)</p>
<p>　　即时发布是一项令人激动的技术，它使Web服务的开发变得如此简单；然而即时发布并不总是最好的选择，比如有些应用系统是第三方提供的，我们没有购买源代码，只有.class文件，但我们又希望将这个应用系统的一些功能对外发布成Web服务，使其能够在更大范围内产生作用，这个时候即时发布技术就无能为力了。此外，即时发布技术并不灵活，无法进行更多的服务配置，这使得它并不能满足一些特定系统的需求。</p>
<p>　　因此，Axis提供了另一种服务发布方式，这就是定制发布。</p>
<p>　　在此给出一个从加仑到升的容积单位转换的服务，其源码如下：</p>
<p>　　文件Capacity.java<br>&nbsp;&nbsp;&nbsp; package samples.capacity;<br>&nbsp;&nbsp;&nbsp; public class Capacity<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double convertGallon2Litre( double gallon )<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; return gallon * 4.546;//实现加仑到升的容积转换<br>&nbsp;}//convertGallon2Litre()</p>
<p>&nbsp;&nbsp;&nbsp; }/* Capacity */<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 将其编译成.class文件，放置到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，即可着手进行发布。<br>&nbsp;&nbsp;&nbsp; 定制发布不需要构建.jws文件，但必须创建服务发布描述文件deploy.wsdd（Web Service Deployment Descriptor的缩写），这个文件负责描述服务的名称、入口等信息，其内容如下：<br>&nbsp;&nbsp;&nbsp; 文件deploy.wsdd</p>
<p>&nbsp;&nbsp;&nbsp; &lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/</font></u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt;<br>&nbsp;&lt;service name="Capacity" provider="java:RPC"&gt;<br>&nbsp;&lt;parameter name="className" value="samples.capacity.Capacity"/&gt;<br>&nbsp;&lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&lt;/service&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/deployment&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 在这里服务的提供者是&#8220;java:RPC&#8221;，它被内建在Axis中，而且指明了一个JAVA RPC服务，做这个处理的类是org.apache.axis.providers.java.RPCProvider。<br>&nbsp;&nbsp;&nbsp; 我们是通过一个&lt;parameter&gt;标签告诉RPC服务应该调用的类，而另外一个&lt;parameter&gt;标签则告诉引擎，它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表，来指明那些方法可以被调用。</p>
<p>　　将该文件也放到&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。<br>&nbsp;&nbsp; 在&#8220;&#8230;&#8230;\webapps\axis\samples\capacity&#8221;目录下，运行：</p>
<p>&nbsp;&nbsp; java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd</p>
<p>&nbsp;&nbsp; 如果运行时说没有找到类，那么可能是类路径没有配置好，建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:</p>
<p>&nbsp;&nbsp; java org.apache.axis.client.AdminClient deploy.wsdd<br>&nbsp;&nbsp; 可以看到以下运行结果：</p>
<p>&nbsp;Processing file deploy.wsdd<br>&nbsp;&lt;Admin&gt;Doneprocessing&lt;/Admin&gt;</p>
<p>　　这表明Capacity服务定制发布完成。<br>&nbsp;<br>&nbsp;&nbsp; 你也可以调用：<br>&nbsp;java org.apache.axis.client.AdminClient undeploy.wsdd&nbsp; 来取消部署。</p>
<p>&nbsp;&nbsp; 你也可以调用：<br>&nbsp;java org.apache.axis.client.AdminClient list 来获得所有的已经部署的服务的列表。在这里你会看到services, handlers, transports等等，注意这个调用只是列出了WEB-INF\server-config.wsdd的文件内容。</p>
<p>&nbsp;&nbsp; 一定要注意：编译后的class文件要拷贝到web-inf/classes的目录中，如果该文件中有包存在的话，别忘了还要在classes目录下创建包的目录<br>&nbsp;&nbsp; 通过访问<a href="http://localhost:8080/axis/services/Capacity?wsdl"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity?wsdl</font></u></a>可以看到这个服务的WSDL描述文件，这说明Capacity服务被成功发布了。<br>&nbsp;&nbsp; 你也可以通过访问<a href="http://localhost:8080/axis/servlet/AxisServlet"><u><font color=#800080>http://localhost:8080/axis/servlet/AxisServlet</font></u></a>查看所有定制发布的服务。<br>&nbsp;&nbsp; WDSL如下：<br>&nbsp; &lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br>- &lt;wsdl:definitions targetNamespace="<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" xmlns="<a href="http://schemas.xmlsoap.org/wsdl/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/</font></u></a>"<br>&nbsp;&nbsp;&nbsp; xmlns:apachesoap="<a href="http://xml.apache.org/xml-soap"><u><font color=#0066cc>http://xml.apache.org/xml-soap</font></u></a>" xmlns:impl="<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" xmlns:intf="<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" xmlns:wsdl="<a href="http://schemas.xmlsoap.org/wsdl/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/</font></u></a>" xmlns:wsdlsoap="<a href="http://schemas.xmlsoap.org/wsdl/soap/"><u><font color=#0066cc>http://schemas.xmlsoap.org/wsdl/soap/</font></u></a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema"><u><font color=#0066cc>http://www.w3.org/2001/XMLSchema</font></u></a>"&gt;<br>- &lt;wsdl:message name="convertGallon2LitreResponse"&gt;<br>&nbsp; &lt;wsdl:part name="convertGallon2LitreReturn" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:message name="convertGallon2LitreRequest"&gt;<br>&nbsp; &lt;wsdl:part name="in0" type="xsd:double" /&gt; <br>&nbsp; &lt;/wsdl:message&gt;<br>- &lt;wsdl:portType name="Capacity"&gt;<br>- &lt;wsdl:operation name="convertGallon2Litre" parameterOrder="in0"&gt;<br>&nbsp; &lt;wsdl:input message="impl:convertGallon2LitreRequest" name="convertGallon2LitreRequest" /&gt; <br>&nbsp; &lt;wsdl:output message="impl:convertGallon2LitreResponse" name="convertGallon2LitreResponse" /&gt; <br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:portType&gt;<br>- &lt;wsdl:binding name="CapacitySoapBinding" type="impl:Capacity"&gt;<br>&nbsp; &lt;wsdlsoap:binding style="rpc" transport="<a href="http://schemas.xmlsoap.org/soap/http"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/http</font></u></a>" /&gt; <br>- &lt;wsdl:operation name="convertGallon2Litre"&gt;<br>&nbsp; &lt;wsdlsoap:operation soapAction="" /&gt; <br>- &lt;wsdl:input name="convertGallon2LitreRequest"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" namespace="<a href="http://capacity.samples/"><u><font color=#0066cc>http://capacity.samples</font></u></a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:input&gt;<br>- &lt;wsdl:output name="convertGallon2LitreResponse"&gt;<br>&nbsp; &lt;wsdlsoap:body encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/"><u><font color=#0066cc>http://schemas.xmlsoap.org/soap/encoding/</font></u></a>" namespace="<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" use="encoded" /&gt; <br>&nbsp; &lt;/wsdl:output&gt;<br>&nbsp; &lt;/wsdl:operation&gt;<br>&nbsp; &lt;/wsdl:binding&gt;<br>- &lt;wsdl:service name="CapacityService"&gt;<br>- &lt;wsdl:port binding="impl:CapacitySoapBinding" name="Capacity"&gt;<br>&nbsp; &lt;wsdlsoap:address location="<a href="http://localhost:8080/axis/services/Capacity"><u><font color=#0066cc>http://localhost:8080/axis/services/Capacity</font></u></a>" /&gt; <br>&nbsp; &lt;/wsdl:port&gt;<br>&nbsp; &lt;/wsdl:service&gt;<br>&nbsp; &lt;/wsdl:definitions&gt;</p>
<p>&nbsp; WSDD 的高级功能：<br>&nbsp; (1) AXIS支持三种对象范围：<br>&nbsp;&nbsp;&nbsp;&nbsp; "request"范围：这是默认的情况，每一次Soap请求的时候都将创建新的对象。<br>&nbsp;&nbsp;&nbsp;&nbsp; "application"范围：将会为所有的请求生成一个单独的共享的对象。<br>&nbsp;&nbsp;&nbsp;&nbsp; "session"范围：为每一个session期的客户端请求创建一个对象。<br>&nbsp; 指定方法如下：<br>&nbsp; &lt;service name="MyService"...&gt;<br>&nbsp; &lt;parameter name="scope" value="value"/&gt;<br>&nbsp; ...<br>&nbsp; &lt;/service&gt;<br>&nbsp; (2) 更多部署内容：Handlers and Chains<br>&nbsp; 让我们来深入挖掘一下Axis引擎的更强大的特性。如果我们想跟踪我们的服务被调用了多少次，那么我们只需要包含一个简单的handler，它存放在samples/log目录下。要使用这个handler，你就首先应该部署这个handler，然后使用在部署服务时给它指定的名字。下面是一个wsdd文件的例子：<br>&nbsp; &lt;deployment xmlns="<a href="http://xml.apache.org/axis/wsdd/"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/</font></u></a>" xmlns:java="<a href="http://xml.apache.org/axis/wsdd/providers/java"><u><font color=#0066cc>http://xml.apache.org/axis/wsdd/providers/java</font></u></a>"&gt;<br>&nbsp;&nbsp; &lt;!-- define the logging handler configuration --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;handler name="track" type="java:samples.userguide.example4.LogHandler"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="filename" value="MyService.log"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/handler&gt;<br>&nbsp; <br>&nbsp;&nbsp; &lt;!-- define the service, using the log handler we just defined --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;service name="LogTestService" provider="java:RPC"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;requestFlow&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;handler type="track"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requestFlow&gt;<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="samples.userguide.example4.Service"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br>&nbsp; &lt;/deployment&gt;</p>
<p>&nbsp; 第一段指明了一个名为track的handler，它是samples.userguide.example4.LogHandler类的实例。另外还指定了一个参数filename，用于指定日志文件名称。<br>&nbsp; 下面的那段指明了一个RPC服务，和我们在上面的例子中看到的一样，所不同的是在service标签中的&lt;requestFlow&gt;标签，它指定了一些在调用服务前应该被调用的handler集。也就是由于我们在部署中插入了这个"track"的引用，所以我们确定每次调用服务的时候都将被记录到日志文件中去。<br>&nbsp; <br>&nbsp; (3)远程管理：<br>&nbsp; &lt;service name="AdminService" provider="java:MSG"&gt;<br>&nbsp;&lt;parameter name="className" value="org.apache.axis.util.Admin"/&gt;<br>&nbsp;&lt;parameter name="allowedMethods" value="*"/&gt;<br>&nbsp;&lt;parameter name="enableRemoteAdmin" value="true"/&gt;<br>&nbsp; &lt;/service&gt;<br>&nbsp; WARNING: enabling remote administration may give unauthorized parties access to your machine. If you do this, please make sure to add security to your configuration!<br>&nbsp; 所以远程管理涉及到安全问题，不建议采用。</p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=35550<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blog.csdn.net/tenwang1977/archive/2004/07/06/35550.aspx">http://blog.csdn.net/tenwang1977/archive/2004/07/06/35550.aspx</a><br></p>
<img src ="http://www.blogjava.net/waterjava/aggbug/125594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-21 15:58 <a href="http://www.blogjava.net/waterjava/archive/2007/06/21/125594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Axis和web service之一 </title><link>http://www.blogjava.net/waterjava/archive/2007/06/21/125590.html</link><dc:creator>狼爱上狸</dc:creator><author>狼爱上狸</author><pubDate>Thu, 21 Jun 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/waterjava/archive/2007/06/21/125590.html</guid><wfw:comment>http://www.blogjava.net/waterjava/comments/125590.html</wfw:comment><comments>http://www.blogjava.net/waterjava/archive/2007/06/21/125590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/waterjava/comments/commentRss/125590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/waterjava/services/trackbacks/125590.html</trackback:ping><description><![CDATA[<p>学习Axis和web service之一<br>web service由于工作中需要用到，所以那天从网上GOOGLE一下,查看如何制作自己的第一个WEB SERVICE。首先,web service的原理我就不多讲了,再怎么讲也不如人家讲的好,况且都是从别人那里拷贝的。还是整点实际的吧。马上建立自己的WEB SERVICE的程序。</p>
<p>一.首先下载安装软件：<br>1.axis-src-1_2_1,(自己去下载,地址忘记了)<br>2.jakarta-tomcat-5.0.18.exe(这个是安装版本,从别的地方拷贝也可以的)<br>最少也要有这两个包</p>
<p>二.安装<br>自己安装吧。挺简单的。TOMCAT安装最好改一下名字比如：TOMCAT</p>
<p>三.<br>1.将axis-src-1_2_1这个包解压后，将axis-1_2_1\webapps下axis的所有东西拷贝到你刚刚建立的TOMCAT的webapps下。目录结构如下：<br>tomcat-webapps-axis<br>然后查看一下你的axis的WEB-INF的lib下*.jar文件是否全，应该有8个<br>axis.jar<br>axis-ant.jar<br>commons-discovery-0.2.jar<br>commons-logging-1.0.4.jar<br>jaxrpc.jar<br>log4j-1.2.8.jar<br>saaj.jar<br>wsdl4j-1.5.1.jar<br>(一定看好各个文件的文件名，一会将配置CLASSPATH)</p>
<p>2.然后到axis-1_2_1目录下,找到lib文件夹,拷贝其中的activation.jar文件,到<br>Tomcat\webapps\axis\WEB-INF\lib,和上面的8个jar文件在一起，就OK了。<br><br>四.配置classpath<br>我的电脑-右键属性-高级-环境变量<br>1.建立变量:AXIS_HOME=D:\Tomcat\webapps\axis(你自己的实际TOMCAT目录)<br>2.建立变量:AXIS_LIB=%AXIS_HOME%\WEB-INF\lib<br>建立这两个环境变量<br>3.classpath(相信这个变量里面肯定有值,TOMCAT安装的时候配置过)</p>
<p>.;%JAVA_HOME%\lib\dt.jar;<br>%JAVA_HOME%\lib\tools.jar;<br>%TOMCAT_HOME%\lib;(以上三个都是安装TOMCAT配置的,下面是axis的)<br>%AXIS_LIB%\axis.jar;<br>%AXIS_LIB%\commons-discovery-0.2.jar;<br>%AXIS_LIB%\commons-logging-1.0.4.jar;<br>%AXIS_LIB%\jaxrpc.jar;<br>%AXIS_LIB%\saaj.jar;<br>%AXIS_LIB%\log4j-1.2.8.jar;<br>%AXIS_LIB%\wsdl4j-1.5.1.jar;<br>%AXIS_LIB%\activation.jar;<br>%AXIS_LIB%\mail.jar<br>拷贝到classpath里面就可以了，然后点击确定。</p>
<p>五.测试<br>这步很重要,我自己觉得,因为如果你不知道CLASSPATH是否配置齐全,所以应该测试一下,有些文章没有测试直接就往下走了,但是就出现问题了,我就出现了问题,是jar包没有导入造成的,错误信息如这样：<br>Exception in thread "main" java.lang.NoClassDefFoundError: </p>
<p>javax/wsdl/OperationType<br>at org.apache.axis.description.OperationDesc.&lt;clinit&gt;(OperationDesc.java<br>:58)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis.client.Call.addParameter(Call.java:948)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at org.apache.axis.client.Call.addParameter(Call.java:983)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at BankClient.main(BankClient.java:29)<br>这就是没有导入造成的错误。<br>其实你先看一下classpath就能避免错误。<br>点击开始-运行-cmd-打开命令行窗口-敲入set classpath,好了你配置的classpath完全显示了，你可以仔细的查看了。</p>
<p>六调试AXIS<br>启动TOMCAT,输入网址 <a href="http://localhost:8080/axis"><u><font color=#0066cc>http://localhost:8080/axis</font></u></a>, 出现 "Hello! Welcome to Apache-Axis." 欢迎词, 点击链接 Validate 来验证 Axis 所需的 .jar 包是否齐全 (Needed Components).<br><br>七.开发一个 Web Service 服务端程序<br>(代码是转贴,谢谢!)<br>我的这个例子是使用 Web Service 返回一个请求字段的值.</p>
<p>import java.util.*;<br>&nbsp;<br>public class wsTestService<br>{<br>&nbsp;&nbsp;String strName = "Ryun";<br>&nbsp;&nbsp;int intAge = 21;<br>&nbsp;&nbsp;List items = new ArrayList();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;public String getName() {<br>&nbsp; &nbsp;&nbsp;return strName;<br>&nbsp; &nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;public int getAge() {<br>&nbsp; &nbsp;&nbsp;return intAge;<br>&nbsp; &nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;public List getItems() {<br>&nbsp; &nbsp;&nbsp;return items;<br>&nbsp; &nbsp;}<br>}将此文件命名为 wsTestService.jws 存放到<br>d:\tomcat\webapp\axis\下<br>访问 <a href="http://localhost:8080/axis/wsTestService.jws"><u><font color=#0066cc>http://localhost:8080/axis/wsTestService.jws</font></u></a>, 出现 "There is a Web </p>
<p>Service here"即表明 Web Service 服务端程序安装完成.<br>开发一个 Web Service 客户端程序<br>建立客户端程序wsTestClient.java<br>以下是客户端的源程序, 用于向 Web Service Server 提交服务请求:</p>
<p>import org.apache.axis.client.Call;<br>import org.apache.axis.client.Service;<br>&nbsp;<br>public class wsTestClient {<br>&nbsp;&nbsp;public static void main(String args[]) {<br>&nbsp; &nbsp;&nbsp;System.out.println("Start invoking...");<br>&nbsp; &nbsp;&nbsp;try {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String strUri = </p>
<p>"<a href="http://localhost:8080/axis/wsTestService.jws"><u><font color=#0066cc>http://localhost:8080/axis/wsTestService.jws</font></u></a>";<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Service service = new Service();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Call call = (Call)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;service.createCall();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(new </p>
<p>java.net.URL(strUri));<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;call.setOperationName("getName");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String ret = "" + call.invoke(new Object[] {});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println("I am " + ret + ".");<br>&nbsp;&nbsp; &nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp;catch (Exception e) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.err.println(e.toString());<br>&nbsp;&nbsp; &nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp;System.out.println("Finished the invoking.");<br>&nbsp; &nbsp;&nbsp;}<br>}<br>然后编译运行，如果出现问题，那可能是环境变量path,classpath配置的问题,自己查看</p>
<p>一下，这里就不再描述了。<br>C:\&gt;cd \<br>C:\&gt;javac wsTestClient.java<br>&nbsp;<br>C:\&gt;java wsTestClient<br>Start invoking...<br>I am Ryun.<br>Finished the invoking.<br>完成，再去学习，稍后总结<br><br><br>来自:<br><a href="http://www.cnweblog.com/battleseagull/articles/20130.html">http://www.cnweblog.com/battleseagull/articles/20130.html</a></p>
<img src ="http://www.blogjava.net/waterjava/aggbug/125590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/waterjava/" target="_blank">狼爱上狸</a> 2007-06-21 15:54 <a href="http://www.blogjava.net/waterjava/archive/2007/06/21/125590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>