用户操作
[即时聊天] [发私信] [加为好友]
曹翔ID:java_xiang
16153次访问,排名7285(2)好友1人,关注者2
阿翔编程学
java_xiang的文章
原创 43 篇
翻译 0 篇
转载 7 篇
评论 8 篇
曹翔的公告
WebService,Java,J2EE 任何个人和单位均可免费复制,拷贝,复制时请注明出处。但如需商业用途或者使用,修改其中的全部或者部分代码,图片。请先和作者联系.
最近评论
asdf:很好,谢谢分享
xiang:恩,好吧,那句话怎么说的,反正就是帮人帮到底的意思吧。
丫头:这个多代码,别人找都难找,想想起他改良的办法啦,帮人帮到底么。。。。
xunmenglin:义愤填庸了~~~~
xunmenglin:我顶阿
楼主说得好啊
文章分类
收藏
    相册
    阿翔的相册
    Blog链接
    傻丫头的Blog
    冰冻小子的Blog
    大中华办公软件在线
    我的CSDN博客
    我的新浪Blog
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 阿翔编程学-Web Service详细解析及使用方法(全) 包括XFire、Axis、CXF 修改版收藏

    新一篇: 阿翔编程学-Web Service详细解析及使用方法(全) 包括XFire、Axis、CXF 修改版(二) | 旧一篇: 阿翔编程学-Web Service详细解析及使用方法(全) 包括XFire、Axis

     
    Web Service详细解析及使用方法
     
     
     
     
    XFire
    XFire简介
           它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合。提供了一个工作在web services下的简单API,支持POJOschema开发。XFire是 CodeHaus 推出的下一代的 Java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
    XFire特性
           1)、 支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
           2)、 高性能的SOAP栈设计
           3)可插拔的绑定,支持POJOXMLBeansJAXB1.1JAXB2castor
           4) jsr181规范
           5)支持多种传输协议:HTTPJMSXMPPIn-JVM
           6)可嵌入式的API
           7) JBI支持
           8)客户端和服务器端的存根创建工具
           9) JAX-WS的早期支持
    XFire使用
           首先打开IDE,创建一个普通的Java工程,将XFire所需要的jar加入到工程的类库引用中。创建一个简单的Java文件,这个文件只有一个名为sayHello的成员方法。
           //包名
    package net.ruixin.webservicedemo;
    /**
         *服务实现类的实现
         *@authorcaoxiang
     */
    publicclass HelloWorldServiceImpl implements IHelloWorldService {
         /**
            *返回名称的方法
            *@paramname名称
            */
        public String sayHello(String name){
            return"您好,"+name;
        }
    }
           //包名
    package net.ruixin.webservicedemo;
    /**
         *服务接口类的创建
         *@authorcaoxiang
     */
    publicinterface IHelloWorldService {
            /**
             *返回名称的方法
             *@paramname名称
             *@return返回值
             */
            public String sayHello(String name);
    }
    配置services.xml
    <beans xmlns="http://xfire.codehaus.org/config/1.0">
    <service>
                   <name>HelloWorldService</name>
                  <serviceClass>
                       net.ruixin.webservicedemo.IHelloWorldService
                  </serviceClass>
                   <implementationClass>
                       net.ruixin.webservicedemo.HelloWorldServiceImpl
                 </implementationClass>
                   <scope>application</scope>
             </service>
    </beans>
        标签说明:
    WebService的服务名
    <name>HelloWorldService</name>
    WebService的服务接口类<serviceClass>net.ruixin.webservicedemo.IHelloWorldService
    </serviceClass>
    WebService的服务接口实现类<implementationClass>net.ruixin.webservicedemo.HelloWorldServiceImpl</implementationClass>
    WebService的服务有效范围
    <scope>application</scope>
           //包名
    package net.ruixin.webservicedemo;
    import java.net.MalformedURLException;
    import org.codehaus.xfire.XFireFactory;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.service.binding.ObjectServiceFactory;
    /**
         *测试服务类的创建
         *@authorcaoxiang
     */
    publicclass HelloWorldClient {
           /**
             *测试主程序
             *@paramargs
             *@throwsException
        */
            publicstaticvoid main(String args[]) {
               //通过接口类创建Service对象
                 Service srvcModel = new ObjectServiceFactory()
                     .create(IHelloWorldService.class);
               //通过XFire的工厂类创建工厂对象
    XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    //访问的地址
    String helloWorldURL="http://localhost:5200/xfire_sample/services/HelloWorldService";
    //异常处理
                 try {
                  //创建服务对象
    IHelloWorldService srvc = (IHelloWorldService) factory.create(srvcModel, helloWorldURL);
    //调用服务中的方法,并显示其结果
                     System.out.print(srvc.sayHello("dennis"));
               //异常处理
                 } catch (MalformedURLException e) {
                  //显示错误信息
                     e.printStackTrace();
                 }
    }
    }
           XFire、Axis以及其他的一些商业产品都提供了wsdl文档创建客户端代码的工具。这里采用XFire提供的wsgen工具来创建客户端的访问代码。
           Wsgen是XFire提供的一个ant task,task的申明如下:
           <targetname="Wsgen">
    <taskdefname="wsgen"classname="org.codehaus.xfire.gen.WsGenTask"classpathref="build.classpath"/>
        <wsgenoutputDirectory="build.classpath"wsdl="http://localhost:portno/xfire_sample/services/HelloWorldService?wsdl"package="client"/>
    </target>
    outputDirectory属性定义了创建代码的存放路径,wsdlweb服务的wsdl文件,package代表创建的代码的package。还可以通过binding属性指定bind类型,jaxb或者是xmlbeans
    这样就会在outputDirectory属性指定的目录下创建多个Java文件,这些文件提供了访问web服务的方法。
    XFire框架中,我们有两种方式将 POJO 发布成 Web 服务:
    方式1:直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布
    <beans xmlns="http://xfire.codehaus.org/config/1.0">
    <service>
            <name>HelloWorldService</name>
            <serviceClass>
                net.rubyeye.webservicedemo.IHelloWorldService
            </serviceClass>
            <implementationClass>
                net.rubyeye.webservicedemo.HelloWorldServiceImpl
            </implementationClass>
            <style>wrapped</style>
            <use>literal</use>
            <scope>application</scope>
    </service>
    </beans>
    方式2:基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
    package com.test;
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    @WebService(name="Hello",serviceName="Hello",
           targetNamespace="http://www.oksonic.cn/xfire")
    publicclass Hello {
            @WebMethod
            @WebResult
            public String getName(@WebParam String name){
               return"Hello world " + name;
            }
    }
    <beans xmlns="http://xfire.codehaus.org/config/1.0">
        <service>
           <serviceClass>com.test.Hello</serviceClass>
           <serviceFactory>jsr181</serviceFactory>
        </service>
    </beans>
    Axis
    Axis简介
    Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
    但是Axis不仅仅是一个SOAP引擎,它还包括:
        1)、 一个独立运行的SOAP服务器
        2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
        3)、对WSDL的扩展支持
        4)、一个将WSDL的描述生成JAVA类的工具
        5)、一些示例代码
        6)、还有一个监控TCP/IP包的工具
    SOAP
    SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
    Axis使用
    //包名
    package zpf;
    /**
      *服务实现类的实现
      *@authorcaoxiang
    */
    publicclass SSOWebservice
    {
        /**
         登陆并得到用户信息
         */
        publicboolean login(String loginid, String password) {
           //判断用户是否登陆成功的标记
           boolean ret = false;
           if (loginid.equals("caoxiang") && password.equals("caoxiang "))
               ret = true;
           else
               ret = false;
           //返回
           return ret;
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <servlet>
           <servlet-name>XFireServlet</servlet-name>
           <servlet-class>
               org.codehaus.xfire.transport.http.XFireConfigurableServlet
           </servlet-class>
           <load-on-startup>0</load-on-startup>
        </servlet>
        <servlet-mapping>
           <servlet-name>XFireServlet</servlet-name>
           <url-pattern>/services/*</url-pattern>
        </servlet-mapping>
        <servlet>
           <servlet-name>AxisServlet</servlet-name>
           <servlet-class>
               org.apache.axis.transport.http.AxisServlet
           </servlet-class>
        </servlet>
        <servlet>
           <servlet-name>AdminServlet</servlet-name>
           <servlet-class>
               org.apache.axis.transport.http.AdminServlet
           </servlet-class>
           <load-on-startup>100</load-on-startup>
        </servlet>
        <servlet>
           <servlet-name>SOAPMonitorService</servlet-name>
           <servlet-class>
               org.apache.axis.monitor.SOAPMonitorService
           </servlet-class>
           <init-param>
               <param-name>SOAPMonitorPort</param-name>
               <param-value>5001</param-value>
           </init-param>
           <load-on-startup>100</load-on-startup>
        </servlet>
        <servlet-mapping>
           <servlet-name>AxisServlet</servlet-name>
           <url-pattern>/servlet/AxisServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
           <servlet-name>AxisServlet</servlet-name>
           <url-pattern>*.jws</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
           <servlet-name>AxisServlet</servlet-name>
           <url-pattern>/services/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
           <servlet-name>SOAPMonitorService</servlet-name>
           <url-pattern>/SOAPMonitor</url-pattern>
        </servlet-mapping>
        <mime-mapping>
           <extension>wsdl</extension>
           <mime-type>text/xml</mime-type>
        </mime-mapping>
        <mime-mapping>
           <extension>xsd</extension>
           <mime-type>text/xml</mime-type>
        </mime-mapping>
    </web-app>
    <?xml version="1.0" encoding="gb2312"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
        <globalConfiguration>
           <parameter name="adminPassword" value="admin" />
           <parameter name="enableNamespacePrefixOptimization"
               value="true" />
           <parameter name="attachments.Directory"   value="D:\jakarta-tomcat-5.0.28\webapps\axis\WEB-INF\attachments" />
           <parameter name="disablePrettyXML" value="true" />
           <parameter name="attachments.implementation"
               value="org.apache.axis.attachments.AttachmentsImpl" />
           <parameter name="sendXsiTypes" value="true" />
           <parameter name="sendMultiRefs" value="true" />
           <parameter name="sendXMLDeclaration" value="true" />
           <requestFlow>
               <handler type="java:org.apache.axis.handlers.JWSHandler">
                  <parameter name="scope" value="session" />
               </handler>
               <handler type="java:org.apache.axis.handlers.JWSHandler">
                  <parameter name="scope" value="request" />
                  <parameter name="extension" value=".jwr" />
               </handler>
           </requestFlow>
        </globalConfiguration>
        <handler name="LocalResponder"
           type="java:org.apache.axis.transport.local.LocalResponder" />
        <handler name="URLMapper"
           type="java:org.apache.axis.handlers.http.URLMapper" />
       <handler name="Authenticate"    type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"     />
        <!-- 自定义服务开始 -->
        <!-- 单点登陆服务 add by Zhang.P.F -->
        <service name="SSOWebservice" provider="java:RPC">
           <parameter name="allowedMethods" value="*" />
           <parameter name="className" value="zpf.SSOWebservice" />
           <operation name="login" returnType="ns:boolean">
               <parameter name="loginid" type="ns:String" />
               <parameter name="password" type="ns:String" />
           </operation>
        </service>
        <!-- 自定义服务结束 -->
        <service name="AdminService" provider="java:MSG">
           <parameter name="allowedMethods" value="AdminService" />
           <parameter name="enableRemoteAdmin" value="false" />
       <parameter name="className" value="org.apache.axis.utils.Admin" />
           <namespace>http://xml.apache.org/axis/wsdd/</namespace>
           <namespace>http://xml.apache.org/axis/wsdd/</namespace>
        </service>
        <service name="Version" provider="java:RPC">
           <parameter name="allowedMethods" value="getVersion" />
           <parameter name="className" value="org.apache.axis.Version" />
        </service>
        <transport name="http">
           <requestFlow>
               <handler type="URLMapper" />
               <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
           </requestFlow>
           <parameter name="qs:list"
               value="org.apache.axis.transport.http.QSListHandler" />
           <parameter name="qs:wsdl"
               value="org.apache.axis.transport.http.QSWSDLHandler" />
           <parameter name="qs.list"
               value="org.apache.axis.transport.http.QSListHandler" />
           <parameter name="qs.method"
               value="org.apache.axis.transport.http.QSMethodHandler" />
           <parameter name="qs:method"
               value="org.apache.axis.transport.http.QSMethodHandler" />
           <parameter name="qs.wsdl"
               value="org.apache.axis.transport.http.QSWSDLHandler" />
        </transport>
        <transport name="local">
           <responseFlow>
               <handler type="LocalResponder" />
           </responseFlow>
        </transport>
    </deployment>
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    import javax.xml.rpc.ParameterMode;
    /**
      *客户端登陆类的实现
      *@authorcaoxiang
    */
    publicclass CallC
    {
    /**
        *测试主程序
        *@paramargs
       *@throwsException
    */
       publicstaticvoid main(String [] args) throws Exception {
           try{
            //服务路径
               String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice";
            //用户名
               String user= new String("1");
            //
               String password=new String("2");
            //服务对象
               Service service = new Service();
            //调用服务的对象
               Call call = (Call) service.createCall();
               //设置目标服务
               call.setTargetEndpointAddress(new java.net.URL(endpoint));
            //设置调用的方法
               call.setOperationName("login");
              //设置参数
               call.addParameter("loginid", XMLType.XSD_STRING, ParameterMode.IN);
            //设置参数
               call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
               call.setReturnType(XMLType.XSD_BOOLEAN);
               //用于判断用户是否登陆的成功的标记