首页 > 开发 > Java > 正文

使用SOAP开发java web服务

2024-07-21 02:27:36
字体:
来源:转载
供稿:网友
  本文的预定读者首先要对j2ee有所了解,熟悉xml,tomcat等基本内容,本文主要是简单介绍一下web服务的基本内容,怎样在java 中构建soap服务:
 一、soap(simple object access protocol)简单对象访问协议,要了解soap,首先就需要了解分布式计算的由来,随着下一代的分布式计算体系web服务的出现,soap成为了创建和调用通过网络发布的应用程序的实际通信标准。soap类似传统的二进制协议iiop(corba)和jrmp(rmi),但它不采用二进制数据表示法,而是采用使用xml的,基于文本的数据表示法。
        通过xml表示法,soap定义了一种小型有线连接协议和编码格式,以表示数据类型、编程语言和数据库,还可以使用各种internet标准协议作为其消息传输工具,还可以提供表示rpc和文档驱动的消息交换等通信模型的约定。请注意,w3c正致力于soap的研究,http://www.w3c.org/2000/xp/group/ ,并得到了主流供应商的积极响应,以便对于基于xml的协议相关的重要任务达成共识,并定义其关键要求和使用场景。
        soap1.2的基本规范定义了以下基本内容:
       1)用于将xml文档表示为结构化soap消息的语法和语义
       2)在soap消息中表示数据的编码标准
       3)用于交换soap消息的通信模型
       4)soap传输等底层协议的绑定
      soap消息主要包括了信封头,消息头,主体,附件几部分
      一个简单的soap消息表示:
      post   /studentinfo   http/1.1
      host:anthropology.cun.edu
      content-type: text/xml;charset="utf-8"
      content-length: 640
      soapaction:  "getstudentinfo"

     <soap-env:envelop xmlns:soap-env="http://www.w3c.org/2001/06/soap-envelope"
              xmlns:xsi="http://www.w3c.org/2001/xmlschema-instance"
              xmlns:xsd="http://www.w3c.org/2001/xmlschema"
             soap-env:encodingstyle="http://www.w3c.org/2001/06/soap-encoding">
        <soap-env:header>
            <person:mail xmlns:person="http://www.cun.edu/header">[email protected]
        </soap-env:header> 

        <soap-env:body>
            <m:getstudentinfo   xmlns:m="http://www.cun.edu/jws.student.studentinfo">
                 <student_name xsi:type='xsd:string'>
                        wang wen yin
                 </student>
             </m:getstudentinfo>
        </soap-env:body>
    </soap-env:envelop>
   以上是1.2版本命名空间,1.1的命名空间 soap envelope:http://schemas.xmlsoap.org/soap/envelop/ ,soap encoding: http://schemas.xmlsoap.org/soap/encoding/ 
   关于soap编码规范请参阅www.w3c.org/tr/xmlschema-2/ 定义的编码值,其他的一些规范可以上www.w3c.org 上具体查看。
二、以下从实际例子来学习,这里我使用的是apache的一个子项目axis的具体例子,便于深入了解soap的运行:
    1)下载axis的相关内容http://ws.apache.org/axis/:
    2)建立一个实例程序(遵守j2ee的web程序规范),如(webservicetest目录)
          把axis中lib文件夹的内容拷到你的webservicetest/web-inf/lib下,同时上网下载xerces(下载地点:http://xml.apache.org/xerces-j/)解释器的包文件xerces.jar,也拷到webservicetest/web-inf/lib文件夹下,(若要配置log4j,请把属性文件log4j.properties拷到webservicetest/web-inf/classes文件夹下)
    3)修改应用程序webservicetest/web-inf中的web.xml文件:主要servlet设置如下
       <servlet>
              <servlet-name>testservlet</servlet-name>
              <servlet-class>org.apache.axis.transport.http.axisservlet</servlet-class>
      </servlet>
      <servlet-mapping>
              <servlet-name>testservlet</servlet-name>
              <url-pattern>*.jws</url-pattern>
     </servlet-mapping>
     <servlet-mapping>
              <servlet-name>testservlet</servlet-name>
              <url-pattern>/servlet/testservlet</url-pattern>
    </servlet-mapping>
  
    <servlet-mapping>
              <servlet-name>testservlet</servlet-name>
              <url-pattern>/services/*</url-pattern>
     </servlet-mapping>


     <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-mapping>
          <servlet-name>adminservlet</servlet-name>
          <url-pattern>/servlet/adminservlet</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>
    你现在可以在网址里输入http://localhost/webservicetest/servlet/testservlet 看到了吗?axis是使用axis.jar包里的org.apache.axis.transport.http.axisservlet对应用程序进行处理的,基本配置就讲到这里。
三、接着我们来说axis中的内核。
1)不使用tomcat引擎运行axis。
       先建立一个脚步文件,对环境变量classpath进行设置要把lib下的那些包文件的路径全都包括进去,运行:java  org.apache.axis.transport.http.simpleaxisserver  <port>
 2)内部服务处理程序是org.apache.axis.providers.java.rpcprovider,标志出服务所需的方法,然后提供从soap请求消息组成部分的参数。
 3)axis的应用程序端管理功能:
       java  org.apache.axis.client.adminclient 就会列出参数,可供你选择。我们的例子是:java  org.apache.axis.client.adminclient  -l http://localhost/webservicetest/servlet/testservlet  list 就会显示出服务列表,返回的是xml文件
4)wsdl2java应用程序可以把wsdl文件创建基于java的程序,如占位程序等
     java  org.apache.axis.wsdl.wsdl2java  <url>
axis的基本内容说到这里
四、具体例子
 1)编写逻辑程序,简单如:soaptest.java
    public class soaptest{
        public string getstr(string name){
            return "hello,"+name;
        }
    }
  2) 部署服务,编写wsdd文件soaptest_deploy.wsdd:
     <deployment name="simapletest" xmlns="http://xml.apache.org/axis/wsdd/"
         xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
         xmlns:xsd="http://www.w3.org/2000/10/xmlschema"
         xmlns:xsi="http://www.w3.org/2000/10/xmlschema-instance">
             <service name="soaptest" provider="java:rpc">
                  <parameter name="classname" value="soaptest"/>
                  <parameter name="allowedmethods" value="getstr"/>
             </service>
    </deployment>
    其中classname参数是你的想部署的类名(全名),allowedmethods是调用的服务的方法,如果有多个方法的话可以用空格分开(如: <parameter name="allowedmethods" value="getstr  getmoney"/>),当用*的时候表示全部。
     好了现在准备部署了,确保环境路径classpath设置正确,运行:
        java  org.apache.axis.client.adminclient  -l  http://localhost/webservicetest/servlet/testservlet  soaptest_deploy.wsdd
     (这里不懂的话,请参考以上的说明) 
 ok,呵呵,至此,我们已经完成了一个web服务的部署:测试http://localhost/webservicetest/servlet/testservlet  看里面是否多了一个选择soaptest服务?
      如果不想要服务了那重新编写一个wsdd文件,内容改为:
<deployment name="simapletest" xmlns="http://xml.apache.org/axis/wsdd/"
         xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
         xmlns:xsd="http://www.w3.org/2000/10/xmlschema"
         xmlns:xsi="http://www.w3.org/2000/10/xmlschema-instance">
            <service name="soaptest"/>
</deployment>
和上面一样,对比一下就ok了。
五、客户端测试:
     客户端我们也可以使用java来进行测试,网上也有资料的,你可以去学习,很简单的。现在为了体现web服务的魅力,我用.net平台来测试吧,客户端使用c#编写(先要安装.net framework sdk):
    1)通过wsdl生成web服务代理,在net平台下运行:
      wsdl  /l:cs  /protocol:soap  /out:soaptestclient.cs  http://localhost/webservicetest/services/soaptest?wsdl  
        我们通过wsdl得到了一个cs文件soaptestclient.cs(当前目录),你可以打开cs文件,研究一下里面的代码,那个getstr(string name)就是我们需要调用的方法,我们的客户端通过调用该方法就可以调用服务器端的方法,内部的转化wsdl.exe工具已经帮我们完成了,axis下的wsdl2java工具也是一样的功能,可以参考我上面所说的关于axis的内核内容
   2)编译cs文件成程序集dll:
      csc /target:library /r:system.web.services.dll  /r:system.xml.dll soaptestclient.cs
      最后我们等到了一个dll文件soaptestclient.dll,客户端程序通过调用它就行了
   3)编写客户端应用程序soaptestclientapp.cs
      using system;
      
      namespache  jws.client{
         public class soaptestclientapp{
            public soaptestclientapp(){
            }
            public static void main(string[] args){
                if(args.length!=1){
                    console.writeline("usage:soaptestclientapp <name>");
                    environment.exit(1);
                }
                soaptestservice  st_service=new soaptestservice();
                st_service.getstr("wang wenyin");
           }
        } 
     }
4)编译文件csc  /r:soaptestclient.dll  soaptestclientapp.cs
    运行soaptestclientapp
输出结果:
     hello,wang wenyin
与预期结果相符。

好了,关于soap开发web服务就说到这里了,希望这篇文章能对大家有所帮助,谢谢了:)有问题的话可以留言,也可以跟我联系 [email protected]

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表