风行天下

JAVA太极
posts - 4, comments - 10, trackbacks - 0, articles - 55
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

利用XFire开发一个简单的WebService

Posted on 2006-12-03 17:08 风太少 阅读(1073) 评论(0)  编辑  收藏 所属分类: java编程spring
你将了解到如何将一个普通的java文件转换为一个web服务,services.xml文件是如何定义的,如何发布这个web服务、如何获得这个服务的WSDL。
首先打开Eclipse,创建一个普通的java工程,将xfire所需的jar和xfire的jar加入到工程所需的类库引用中。创建一个简单的java文件,这个java文件简单到只提供一个add方法。
版本:xfire-all-1.1.2.jar
web.xml
 1<!-- Context Param Configuration -->
 2    <context-param>
 3        <param-name>contextConfigLocation</param-name>
 4        <param-value>
 5            /WEB-INF/spring/basic-context.xml, 
 6            /WEB-INF/spring/security-context.xml, 
 7            /WEB-INF/spring/lookup-context.xml,
 8            /WEB-INF/struts/security/security-action-bean.xml
 9            classpath:org/codehaus/xfire/spring/xfire.xml
10        </param-value>
11    </context-param>
红色字是我们要添加的,而且必须这么写。
还有映射,也是web.xml
1<servlet>
2        <servlet-name>xfire</servlet-name>
3        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4    </servlet>
5
6    <servlet-mapping>
7        <servlet-name>xfire</servlet-name>
8        <url-pattern>/xfire/*</url-pattern>
9    </servlet-mapping>

然后在WEB-INF下新增一个文件
xfire-servlet.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 3<beans>
 4    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 5        <property name="urlMap">
 6            <map>
 7                <entry key="/mathBean">
 8                    <ref bean="math"/>
 9                </entry>
10            </map>
11        </property>
12    </bean>
13    
14    <!-- Declare a parent bean with all properties common to both services -->
15    <bean id="math" class="org.codehaus.xfire.spring.remoting.XFireExporter">
16        <property name="serviceFactory">
17            <ref bean="xfire.serviceFactory"/>
18        </property>
19        <property name="xfire">
20            <ref bean="xfire"/>
21        </property>
22        <property name="serviceBean">
23            <ref bean="mathBean"/>
24        </property>
25        <property name="serviceClass">
26            <value>cn.redstoneinfo.oss.security.inteface.MathService</value>
27        </property>
28    </bean>
29    
30
31</beans>
这里的<property name="xfire">
                   <ref bean="xfire"/>
          </property>
就这么写,不用想别的,而
           <property name="serviceBean">
            <ref bean="mathBean"/>
        </property>
需要调用你自己的实现类bean的声明。我的是:
1<bean id="mathBean" class="cn.redstoneinfo.oss.security.util.MathServiceImpl"/>

接口:
 1package cn.redstoneinfo.oss.security.inteface;
 2
 3/**
 4 * define the MathService.java
 5 * Create at 2006-9-14 下午02:59:59
 6 *  
 7 * @version 1.0
 8 * @author zhangli
 9 */

10public interface MathService 
11
12
13
14  public long add(int p1, int p2); 
15
16}
 
实现类:
 1package cn.redstoneinfo.oss.security.util;
 2
 3import cn.redstoneinfo.oss.security.inteface.MathService;
 4
 5/**
 6 * define the MathServiceImpl.java
 7 * Create at 2006-9-14 下午03:00:40
 8 *  
 9 * @version 1.0
10 * @author zhangli
11 */

12public class MathServiceImpl implements MathService 
13
14
15
16  public long add(int p1, int p2) 
17
18  
19
20    return p1 + p2; 
21
22  }
 
23
24}
 
配置完成后,启动tomcat,用http://127.0.0.1:8080/nextoss1/xfire/mathBean?wsdl可以看到wsdl的描述。

 1<?xml version="1.0" encoding="UTF-8"?>
 2<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://inteface.security.oss.redstoneinfo.cn" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://inteface.security.oss.redstoneinfo.cn">
 3  <wsdl:types>
 4    <xsd:schema targetNamespace="http://inteface.security.oss.redstoneinfo.cn" elementFormDefault="qualified" attributeFormDefault="qualified">
 5      <xsd:element name="add">
 6        <xsd:complexType>
 7          <xsd:sequence>
 8            <xsd:element name="in0" type="xsd:int" minOccurs="1" maxOccurs="1" />
 9            <xsd:element name="in1" type="xsd:int" minOccurs="1" maxOccurs="1" />
10          </xsd:sequence>
11        </xsd:complexType>
12      </xsd:element>
13      <xsd:element name="addResponse">
14        <xsd:complexType>
15          <xsd:sequence>
16            <xsd:element name="out" type="xsd:long" minOccurs="1" maxOccurs="1" />
17          </xsd:sequence>
18        </xsd:complexType>
19      </xsd:element>
20    </xsd:schema>
21  </wsdl:types>
22  <wsdl:message name="addResponse">
23    <wsdl:part element="tns:addResponse" name="parameters" />
24  </wsdl:message>
25  <wsdl:message name="addRequest">
26    <wsdl:part element="tns:add" name="parameters" />
27  </wsdl:message>
28  <wsdl:portType name="MathServicePortType">
29    <wsdl:operation name="add">
30      <wsdl:input message="tns:addRequest" name="addRequest" />
31      <wsdl:output message="tns:addResponse" name="addResponse" />
32    </wsdl:operation>
33  </wsdl:portType>
34  <wsdl:binding name="MathServiceHttpBinding" type="tns:MathServicePortType">
35    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
36    <wsdl:operation name="add">
37      <wsdlsoap:operation soapAction="" />
38      <wsdl:input name="addRequest">
39        <wsdlsoap:body use="literal" />
40      </wsdl:input>
41      <wsdl:output name="addResponse">
42        <wsdlsoap:body use="literal" />
43      </wsdl:output>
44    </wsdl:operation>
45  </wsdl:binding>
46  <wsdl:service name="MathService">
47    <wsdl:port binding="tns:MathServiceHttpBinding" name="MathServiceHttpPort">
48      <wsdlsoap:address location="http://127.0.0.1:8080/nextoss1/xfire/mathBean" />
49    </wsdl:port>
50  </wsdl:service>
51</wsdl:definitions>
52
53

Web服务定义语言(Web Services Definition Language,WSDL)是一个建议性标准,用于描 述Web服务的技术调用语法。WSDL定义了一套基于 XML的语法,将Web服务描述为能够进行消息交换的服务访问点的集合,从而满足了这种需求。WSDL服务定义为分布式系统提供了可机器识别的SDK文档,并且可用于描述自动执行应用程序通信中所涉及的细节。WSDL的当前版本是1.1,规范可以从http://www.w3.org/TR/wsdl获得。

  WSDL就是描述XMLWeb服务的标准XML格式,WSDL由Ariba、Intel、IBM微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。就其定义来说,你还不能把WSDL当作一种对象接 口定义语言,例如,CORBA或COM等应用程序体系结构就会用到对象接口定义语言。 WSDL保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的联系。

  WSDL服务描述是一个XML文档,它与WSDL模式(schema)的定义一致。WSDL文档并不是完整的服务描述,而只包括了服务描述任务的较低层次,即:服务接口的原始技术描述。WSDL是Web服务的接口定义语言IDL(Interface Definition Language,),本质上,WSDL描述说明的是Web服务的以下三个基本属性:

  服务做些什么--服务所提供的操作(方法)。
  如何访问服务--数据格式详情以及访问服务操作的必要协议。
  服务位于何处--由特定协议决定的网络地址,如URL。

1、WSDL信息模型

  WSDL信息模型充分利用了抽象规范与规范具体实现的分离,也就是分离了服务接口定义(抽象接口)与服务实现定义(具体端点)。 抽象接口规范描述了终端的处理能力,它在WSDL中表示为portType。束定机制 (binding mechanism)在WSDL中表示为binding元素,它使用特定的通信协议、数据编码模型和底层通信协议,将Web服务的抽象定义映射至特定实现。若束定结合了实现的访问地址,抽象端点也就成为可供服务请求者调用的具体端点(concrete endpoint),WSDL的port元素表示了这一结合。

  抽象接口可以支持任何数量的操作(operations)。操作是由一组消息(messages)定义,消息定义了操作的交互定式。与抽象的消息、操作概念相对应的具体实现是由binding元素指定。与XML应用相同,WSDL模式定义了几个高层元素,或称为主要元素。在WSDL中,Web服务描述中的主要元素如下:

  Types,定义了Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。它使用某种类型系统(一般地使用XMLSchema中的类型系统)。
  Message,通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
  Operation,对服务中所支持操作的抽象描述。一般单个Operation描述了一个访问入口的请求/响应消息对。
  PortType,对于某个访问入口点类型所支持操作的抽象集合。这些操作可以由一个或多个服务访问点来支持。
  Binding,包含了如何将抽象接口的元素(portType)转变为具体表示的细节,具体表示也就是指特定的数据格式和协议的结合;特定端口类型的具体协议和数据格式规范的绑定。
  Port,定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
  Service,这是一个粗糙命名的元素,代表端口的集合;相关服务访问点的集合。

  因此,portType(与message和type元素的细节相结合)描述了Web服务是什么,binding元素描述了如何使用Web服务,port及service元素描述了Web服务的位置。
2、WSDL对象结构图

  从图2所示的WSDL对象结构图可知,一个WSDL文档中可以包含一个Types,多个Message、PortType、Binding和Service。


 

  其中,Types是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义。

  Message具体定义了在通信中使用的消息的数据结构,Message元素包含了一组Part元素,每个Part元素都是最终消息的一个组成部分,每个Part都会引用一个DataType来表示它的结构。Part元素不支持嵌套(可以使用DataType来完成这方面的需要),都是并列出现。

  PortType具体定义了一种服务访问入口的类型(传入/传出消息的模式及其格式),一个PortType可以包含若干个Operation,而一个Operation则是指访问入口支持的一种类型的调用。在WSDL里面支持四种访问入口调用的模式:1) 单请求; 2) 单响应; 3) 请求/响应; 4) 响应/请求。在这里请求指的是从客户端到Web服务端,而响应指的是从Web服务端到客户端。PortType的定义中会引用消息定义部分的一个到两个消息,作为请求或响应消息的格式。

  Service描述的是一个具体的被部署的Web服务所提供的所有访问入口的部署细节,一个Service往往会包含多个服务访问入口,而每个访问入口都会使用一个Port元素来描述。

  Port描述的是一个服务访问入口的部署细节,包括通过哪个Web地址(URL)来访问,应当使用怎样的消息调用模式来访问等。其中消息调用模式则是使用Binding结构来表示。

  Binding结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定,从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定,也可以将PortType与MIME/SMTP相绑定等。


 


只有注册用户登录后才能发表评论。


网站导航: