论坛首页 入门讨论版

我该如何理解wsdl为核心的分布式应用

浏览 570 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2007-11-29 关键字: WebService

简单来说,我很弄不懂ws&wsdl的运行模式,我仔细阅读了一下webservice关于分布式应用的逻辑!我的理解很simple!wsdl以文本形式提供为各种机器语言提供调用平台!所以我理所当然的认为,从wsdl生成的Client可以为我下层的各种应用平台提供敏捷的分步式对象!但是我发现,我很难理解ws生成的Client!

 
例子一个:
 Ant Task! 简单运行一个Wsgen!
 
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project default="webs" >  
  3.        
  4.     <property name="base" value="${user.home}\jars"></property>  
  5.        
  6.     <path id="xfire">  
  7.         <fileset dir="${base}\apache\activeMq" includes="*.jar"></fileset>  
  8.         <fileset dir="${base}\apache\ant" includes="*.jar"></fileset>  
  9.         <fileset dir="${base}\apache\commons" includes="*.jar"></fileset>  
  10.         <fileset dir="${base}\apache\struts2" includes="*.jar"></fileset>  
  11.         <fileset dir="${base}\apache\tomcat" includes="*.jar"></fileset>  
  12.         <fileset dir="${base}\apache\xmlbeans" includes="*.jar"></fileset>  
  13.         <fileset dir="${base}\antlr" includes="*.jar"></fileset>  
  14.         <fileset dir="${base}\dom4j" includes="*.jar"></fileset>  
  15.         <fileset dir="${base}\j2ee" includes="*.jar"></fileset>  
  16.         <fileset dir="${base}\jaxen" includes="*.jar"></fileset>  
  17.         <fileset dir="${base}\jee-ws" includes="*.jar"></fileset>  
  18.         <fileset dir="${base}\jsr" includes="*.jar"></fileset>  
  19.         <fileset dir="${base}\sun\jaxb" includes="*.jar"></fileset>  
  20.         <fileset dir="${base}\sun\jta" includes="*.jar"></fileset>  
  21.         <fileset dir="${base}\sun\mail" includes="*.jar"></fileset>  
  22.         <fileset dir="${base}\servlet" includes="*.jar"></fileset>  
  23.         <fileset dir="${base}\jdom" includes="*.jar"></fileset>  
  24.         <fileset dir="${base}\jetty" includes="*.jar"></fileset>  
  25.         <fileset dir="${base}\wsdl" includes="*.jar"></fileset>  
  26.         <fileset dir="${base}\xfire\old" includes="*.jar"></fileset>  
  27.     </path>  
  28.        
  29.     <target name="webs">  
  30.         <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask"    
  31.             classpathref="xfire" />  
  32.         <wsgen outputDirectory="src" wsdl="http://localhost:8191/TwosomeMode?wsdl" package="com.dztalk.client" overwrite="true" />     
  33.     </target>  
  34. </project>  

运行结果

 

java 代码
  1. [wsgen] com\dztalk\core\services\ObjectFactory.java   
  2. [wsgen] com\dztalk\core\services\Send.java   
  3. [wsgen] com\dztalk\core\services\SendResponse.java   
  4. [wsgen] com\dztalk\core\services\Trive.java   
  5. [wsgen] com\dztalk\core\services\TriveAll.java   
  6. [wsgen] com\dztalk\core\services\TriveAllResponse.java   
  7. [wsgen] com\dztalk\core\services\TriveResponse.java   
  8. [wsgen] com\dztalk\core\services\package-info.java   
  9. [wsgen] com\dztalk\client\JMSException.java   
  10. [wsgen] com\dztalk\client\TwosomeModeClient.java   
  11. [wsgen] com\dztalk\client\TwosomeModeImpl.java   
  12. [wsgen] com\dztalk\client\TwosomeModePortType.java   
  13. [wsgen] javax\jms\ArrayOfMessage.java   
  14. [wsgen] javax\jms\Destination.java   
  15. [wsgen] javax\jms\JMSException.java   
  16. [wsgen] javax\jms\Message.java   
  17. [wsgen] javax\jms\ObjectFactory.java   
  18. [wsgen] javax\jms\package-info.java   
  19. [wsgen] java\util\Enumeration.java   
  20. [wsgen] java\util\ObjectFactory.java   
  21. [wsgen] java\util\package-info.java   
  22. [wsgen] com\dztalk\core\pojo\roles\DzUser.java   
  23. [wsgen] com\dztalk\core\pojo\roles\ObjectFactory.java   
  24. [wsgen] com\dztalk\core\pojo\roles\package-info.java   
  25. [wsgen] java\lang\Exception.java   
  26. [wsgen] java\lang\ObjectFactory.java   
  27. [wsgen] java\lang\package-info.java  

 

 

  • 为什么生成的代码不能直接使用
  • 为什么要生成原生类

 

 

 为什么生成的代码不能直接使用

缺少类支持这个原因我是能理解的,但是很明显,wsgen还生成了JDK的原生类,这样我的Client在reference类的时候会去引用$myproject/src/java.lang.Exception ...这样的类!而这样我的code根本编译不过去!我在Xfire的MailList等了1个星期,没有任何人回答这个问题!再这个星期我尝试手动写XFire Client Code,是可以正常运行的!但是手动编Code肯定不是我的最终目的,我又尝试修改wsdl,同样可以!但是这和手写Client道理一样需要人工介入!

 

为什么要生成原生类

这是个让我很懵懂的地方,为什么要生成原生类?Client运行在自己的容器中,自然有本身的类库支持!而且我手写的Client根本不要写原生类,那为什么从wsdl生成的就要出现!我觉得这才是关键!我根本弄不懂!

 

我的code!

java 代码

  1. public Object getEndpoint(Endpoint endpoint) {   
  2.     try {   
  3.         return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());   
  4.     } catch (MalformedURLException e) {   
  5.         throw new XFireRuntimeException("Invalid URL", e);   
  6.     }   
  7. }   
  8.   
  9. public Object getEndpoint(QName name) {   
  10.     Endpoint endpoint = ((Endpoint) endpoints.get((name)));   
  11.     if ((endpoint) == null) {   
  12.         throw new IllegalStateException("No such endpoint!");   
  13.     }   
  14.     return getEndpoint((endpoint));   
  15. }  

 

出错的地方是

java 代码

  1. MalformedURLException e  

 error是 No Exception of type XFireRuntimeException can be thrown!  An Exception type must be a subclass of thrownable!

java 代码

  1. throw new XFireRuntimeException("Invalid URL", e);     

 error依然是 No Exception of type XFireRuntimeException can be thrown!  An Exception type must be a subclass of thrownable! 同时我认为这个函数也有问题!既然throw了一个e,为什么函数本身没有throw出去!难道ws的client不需要遵守java的编程规范!

 

java 代码

  1. throw new IllegalStateException("No such endpoint!");    

error同上! 同样认为有语法问题存在!

 

 

 

 

 

 

希望能有高人点化一下我!我已经陷入了!找不到路了!

 

 

 

   
最后更新时间:2007-11-29
我理解的是,WSDL 是远程服务接口的定义,通过生成器调用它是可以生成远程调用的接口的(interface),然后通过 WebService 客户端带入生成的接口,就可以返回一个实现了这个远程调用接口的代理对象,最后通过这个代理对象就可以访问服务器上的方法了。

但 Java 的 WebService 客户端是否是这么做的我就不清楚了。
   
0 请登录后投票
最后更新时间:2007-11-30
惊叹号看得我心惊肉跳
   
0 请登录后投票
论坛首页 入门讨论版

跳转论坛:
JavaEye推荐