使用axis开发WebService(总结)

来源:互联网 发布:完整的hse培训矩阵 编辑:程序博客网 时间:2024/06/06 12:50

WebService以前没听过,进了现在的公司才见识到,又让我这个菜鸟学习了。虽然我现在还没真正进入到WebService的实战开发,只是肤浅的工作,但是我决定自己把最近一段时间所学的结合广大网友在网上分享的相关资料,做一次小小的总结,不是为了别的,只是为了下次用到后直接找到就用。2013年,我决定不再做一只糊里糊涂的菜鸟,打算从今天起要就要用心学习,快乐工作,享受生活。感谢那些神一般的队友能一直宽恕猪一般队友的我,我要更加努力去追赶你们,不再拖累你们啦。。。

 第一部分:了解理论(这些理论来自动力节点老师讲的视频,我做了下总结,可能理解的有偏差,可以再询名师指点)

首先看一个axis的相关理论知识:

A).Soap协议(简单对象访问协议):通过HTMLxml文件的协议,用与客户端和服务器之间的通信。

 <soap:envelop>

  <soap:header>

  ...

  </soap:header>

  <soap:body>

  ...

  </soap:body>

</soap:envelop>

 客户端访问服务器,通过SOAP协议将请求对象(客户端的语言编写的对象)转换成XML文件传到服务器端,并解析成对象(服务器端的语言编写的对象),经服务器端处理后返回一个对象(服务器端的语言编写的对象);然后该对象再被SOAP协议转换成XML文件通过SOAP协议返回给客户端,同时在解析成对象(客户端的语言对象)。

该过程是通过服务来实现的,常见的服务有AxisXfireCXF

 B).AxisApache eXtensible Interaction System)是一款开源的WebService运行引擎,它是SOAP协议的一个实现,其本身来源于Apache的另一个项目Apache SOAP

 C).WSDLWeb Servise Defined Language,一种XML文件,用于让客户端和服务器端都能认识的语言,一种标准,一种中立的语言。即服务器告诉客户端能提供给何种服务的一种描述语言。

好多人是通过服务器端的代码文件生成WSDL文件,但是,又他们又将正规的开发步骤是先写WSDL文件,在进行客户端和服务器端的开发,唉,wsdl文件看都看半天别说些啦,还是先写服务器端代码再生成WSDL文件吧,为啥有简单方法不用呢。

 UDDI:类似于JNDI,一般不用

好了,以上几个概念,大体可以了解一下下面要用到的东西,要想更详细的搞懂他们之间的关系,还是再谷歌吧。。。

D).客户端通过以下三种方式可以访问服务器端(也叫做三种web service的部署和开发

   1Dynamic Invocation Interface ( DII)

   2Stubs方式

   3Dynamic Proxy方式

 

axis全称Apache EXtensible Interaction System阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器。

 

第二部分:开发热身(先给自己一点自信,快速体验WebService,不过这并不是实际开发中常用的)

言归正传,进入具体开发过程:

1. 下载axis1.4最新版本http://apache.mirror.phpchina.com/ws/axis/1_4/ (我没有打开这个网页,但是谷哥给我提供了下载地址,当然还是咱们的CSDN啦,http://download.csdn.net/download/renyuanchunby/3542767这个网址的网友可是免费提供的哦。)(我是这样理解的:这个东西可以当成一个示例代码,里面有jar包同时配置文件也写好了,可以拿来用)。

2.  将解压后的axis-1_4文件下的webapps目录下的axis目录考到

%TOMCAT_HOME%Webapps/目录下

3. 启动tomcat.输入路径http://localhost:8080/axis  打开axis主界面

4. 点击页面上的Validation ->查看一下你的axis 是否添加了完整的jar文件,注意,这里要仔细看一下,自已少了什么 样的  jar文件,有时缺少了文件axis将无法正常工作.补充一下:这里的xmlsec.jar文件如果缺少的话.  可以到这里下载 http://xml.apache.org/security/dist/java-library/ c++的与java两个目录.下载后把xmlsec-1.4.0.jar考到axislib目录下.上面的步骤如果进行正常将会在Validation页面中就看不到有ErrorWarning的信息.(不过对于上面的补充我没照做,依然是可以的,因为缺少的这个jar只是会报Warning,不是Error可以不用理会)

=========================================================== 

        写到这里,网友们提出了以下总结(上面我也有提到这三种方式):

Axis支持三种web service的部署和开发,分别为

1Dynamic Invocation Interface ( DII)

2Stubs方式

3Dynamic Proxy方式

 =====================================================

我们先来了解一下第一种方式,算是给自己打气,因为以下几步很容易操作,还是拿来主义吧,把网友的东西贴过来看看!!!

第一种Dynamic Invocation InterFace(DII) 开发方式

步骤1:打开eclipse创建一个新项目编写一个类.代码如下:

               public class SayHello {//这个类没有包,注意了.

                   public String say(String name){
                        return " Hello ~~" + name;
                    }
                }

步骤2:

编写好上面的类(SayHello.java),将源代码copy%tomcat_home%webapps

/axis/目录下.这里要注意了,只需要把类考备到这个目录下

,然后重命名为:SayHello.jws jws就是java webservice的缩写哦)

步骤3:

打开你的浏览器:http://localhost:8080/axis/SayHello.jws 打开页面后你会看到

  Click to see the WSDL  <--点击链接,如果你上面的步骤都正常,类也没有带

包的话,那么就生成了wsdl.

恭喜你!到这里DII方式的服务器端编写完成了.接下来我们来看一下客户端是怎么调

用的

步骤4:DII方式的客户端的调用.

 首先将axis/web-inf/lib/目录下的axis.jar,commons-discovery-0.2.jar,

comm.ons-logging-1.0.4.jar导入到刚才的项目中,因为编写客户端时

要用到这些包.客户端代码如下:

  package com.huwd.web;

  import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;

  public class ToClient {

                public static void main(String args[]) throws Exception {
  
                           String urlname = "http://localhost:8080/axis/SayHello.jws";
                            //这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.

//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl
                           Service s = new Service();

  
                            Call call = (Call)s.createCall();
  
                          call.setOperationName("say");//注意。这里是要调用的方法名
  
                          call.setTargetEndpointAddress(urlname);//设置调用的目标url
  
                           String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"});                  //设置调用方法中的参数
  
                           System.out.println("这是webservice服务器返回给你的:>>>>"+val);
  
                     }
               }

运行结果输出:Hello ~~我是Blue’s Boy;

到此DII调用方式完成!

以上几步,我做完后,感觉信心大增,WebService也没想象中的那么难吗,服务器端代码的java文件改名称.jws,发布后就生成了WSDL文件了啊,接着客户端调用一下不就OK了吗,太简单啦。但是有没有发现刚才的作法是把服务器端的java代码改了个后缀名.jws,实际开发中,经常是要夸项目调用其他项目的接口的,他们而且也不一定是用java写的吧,或者我们作为客户端也不是java语言吧,总而言之,操作性不强。

为此,以下才是我们的重点!!!!

好吧,我们从头开始吧,从编写一个服务器端的项目和模拟一个客户端项目调用开始,这里我们都是采用java语言吧,其他的我也不会(囧)!!

================================================

第三部分:进入重点(这一部分才是我们经常用到的,也是网上说的最多的,我通过小例子做成功了,现在总结一下)

很多网友说这里是第二种即Stubs方式,我也这样认为吧。Stubs方式是最通用的做法,又因其灵活的特点,建议使用这种方式.

下面是详细的开发步骤:

 ----------------------------------------------------------------------------------------------

(I)服务器端的开发

1) 创建web工程

1、MyEclipse 下创建web project,取名为webserviceServer;

2、新建文件夹 文件夹名为lib ,然后 将下载下来的axis 其 axis-1_4\lib 目录下的jar 拷贝到lib目录下,将这些jar导入项目中,如图:

2) .编写Server 程序(服务器端代码)

1、  新建class

import com.cxx.bean.User;

public class HelloServer {
 //服务端,传递的是一个自定义的数据类型 User
 
    public String getBeanStr(User bean){
 
       return "You Name:"+bean.getName() + " , You Age:" + bean.getAge();
 
    }
}

2、配置web.xml

web.xml文件很容易配置,拷贝axis包里面的示例的web.xml配置到我们的工程中的web.xml中就可以了。正式开发的大项目也很多是直接copy这里的!!

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.5"  

    xmlns="http://java.sun.com/xml/ns/javaee"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

  <welcome-file-list> 

    <welcome-file>index.jsp</welcome-file> 

  </welcome-file-list> 

   

    <!-- =============== Axis Webservice =============--> 

    <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> 

 

3、部署 web project

利用MyEclipse部署工具 将我们的项目部署到Tomcat\webapp目录下

或者直接在%TOMCAT_HOME%\conf\下的server.xml问文件中加

<Context path="/webserviceServer" docBase="E:\project\workspace\webserviceServer\WebRoot" reloadable="true" debug="0" privileged="true">

       </Context>

这样就不用每次改动后在redeploy了。。。

 

4、 创建 deploy.wsdd文件

这个文件可以在任意目录下创建,这里我将它放到了WebRoot下:

示例代码:

<deploymentxmlns="http://xml.apache.org/axis/wsdd/"

 

    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 

    <!--这里的helloserverwsdd描述符中的ServiceNamespace -->

 

    <servicename="helloserver"provider="java:RPC">

 

        <!--这里的ClassName就是我的服务类了,这个服务主要功能就是传递一个自定义的对象 -->

 

        <parametername="className"value="com.cpic.server.HelloServer"/>

 

        <!--这里描术的意思是,此服务类中的方法全部享出来. value值为*

 

        如果你只想让你的客户端只能调用其中一个方法时,value值改为方法名就可以了. -->

 

        <parametername="allowedMethods"value="*"/>

       

        <!--这个typeMapping是类型映射,使传递的参数序列化用反序列化,一个自定义类型在要网络上传递,那就一定得让他序列化. -->

 <typeMapping

        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

 

        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

 

        qname="ns1:User"

        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

 

        type="java:com.cpic.bean.User"

 

        xmlns:ns1="http://bean.cpic.com"/>

 

</service>

 

 <servicename="SayHello"provider="java:RPC">

  <parametername="className"value="com.cpic.server.SayHello"/>

  <parametername="allowedMethods"value="*"/>

 </service>

 

</deployment>

 

 5、生成 server-config.wsdd 文件

 server-config.wsdd文件是WebService的核心配置文件。Web服务能否发布,很大程度上取决于次文件的配置

这里 我们写个批处理脚本deploy.bat:

set AXIS_HOME=WEB-INF

set AXIS_LIB=%AXIS_HOME%\lib

set AXISCLASSPATH=%AXIS_LIB%\axis.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%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;

 java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/webserviceServer/services/SayHello deploy.wsdd

 

下来,在执行deploy.bat(注意该文件的AXISCLASSPATHjava命令要写到一行,建议b不要再记事本中编辑)前,请确保Tomcat服务已运行,运行bat文件,或者通过CMD来运行,(建议后者)

看到如上图的运行的结果 Done processing,表明已经在%TOMCAT_HOME%\webapps\webserviceServer\WEB-INF目录下生成了server-config.wsdd文件.

在第一次发布service的情况下,需用bat文件生成server- config.wsdd,后续开发过程中,使用手工直接修改server- config.wsdd文件。

 

好了,大功告成了!webservice 发布成功了,重启Tomcat,我们来测试一下,看是否发布成功.

在IE上输入:http://localhost:8080/webserviceServer/services/helloserver?wsdl

就能够看到WSDL文件了(XML类型的文件)。

 --------------------------------------------------------

(II)客户端的开发

 1)使用axis的Wsdl2Java命令生成一个客户端

新建一个Java项目testforepolicy,模拟客户端

为了方便,我们写个脚本WSDL_SERVERTEST.CMD,将其放到src下

set AXIS_HOME=E:\project\workspace\testforepolicy

set CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar

java org.apache.axis.wsdl.WSDL2Java -p com.cpic.sertest http://localhost:8080/webserviceServer/services/helloserver?wsdl

 

同上面第5步一样,执行这个脚本

这时就会在E:\project\workspace\testforepolicy\src\com\cpic\sertest生成

或者还有一种方式,先创建项目,然后在项目所在目录下(跟src同级),创建一个bat文件:

set Axis_Lib=E:\project\workspace\testProject\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=%cd%\src
set Package=com.service.test.services.impl
rem set Package=test.axis
rem %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% --skeletonDeploy true SoapApplyBusiness.wsdl
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -Nurn:SoapBusiness com.service.test.services.impl -o%Output_Path%
http://localhost:8080/webserviceServer/services/helloserver?wsdl

pause

 

其中上面的

set Package=com.cpic.b2bi.service.newhyx.services.impl是用来分包的,把javaBean和Service分开的

rem是注释的意思

2)调用服务器端接口方法

package test.first;

 

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.cpic.sertest.HelloServerService;

import com.cpic.sertest.HelloServerServiceLocator;

import com.cpic.sertest.HelloserverSoapBindingStub;

import com.cpic.sertest.User;

/**

 * 存根(Stubs)

 * @author Administrator

 *

 */

publicclass HelloServerInterClientStub {

   

    publicstaticvoid main(String[] args) {

       HelloServerService service =new HelloServerServiceLocator();

      

       User user = new User();

      

       user.setAge(25);

       user.setName("mys");

      

       try {

           HelloserverSoapBindingStub soap = (HelloserverSoapBindingStub) service.gethelloserver();

          

           System.out.println("服务器返回:"+soap.getBeanStr(user));   

          

       } catch (ServiceException e) {

           //TODO Auto-generated catch block

           e.printStackTrace();

        } catch (RemoteException e) {

           //TODO Auto-generated catch block

           e.printStackTrace();

       }

      

    }

 

}

 注意:

服务器端的代码中如果传入或者返回的是一个自定义的对象类型,这时需要对deploy.wsdd做修改,详见上面的

  2) .编写Server 程序(服务器端代码)-----4 创建 deploy.wsdd文件,中helloserver部分的详细解释

此处可以仿照上面的步骤做出helloserver这个service。。。。