web Service(spring+xfire+hibernate+web service)简单实现

 

 

3.处理进行工作的系统,这意味着XFire不是将整个SOAP文档缓存在内存中,而是以管道的方式接收SOAP流数据。这种工作方式的转变带来了可观的性能回报,同时节省了内存的占用。

 

4.在SOAP请求消息对Web Service发起真正调用之前,分别会经过传输(Transport)、预转发(PreDispatch)、转发(Dispatch)、策略实施(Policy)、用户信息处理(User)、预调用(PreInvoke)、服务调用(Service Invocation)等阶段。当,Web Service调用后,XFire生成响应SOAP消息并通过管道发送给客户端请求者,这一过程会先后经历调用后(PostInvoke)、用户信息处理(User)、策略实施(Policy)、传输(Transport)这四个阶段。每一个阶段都是一个可控点,通过编写并注册一些相应的Handler就可以实施一些额外处理逻辑,如审计、SOAP消息加密、签名、压缩等。

 

5.XFire为Spring提供了方便易用的导出器XFireExporter,借助XFireExporter的支持,我们可以在Spring容器中将一个POJO导出为Web Service。BbtForum是Baobaotao论坛业务服务类,它拥有众多的业务方法,我们现在希望将其提供查询最近几天精华帖子数的业务方法开放为Web Service。为了避免过多地开放不必要的接口方法,需要定义了一个BbtForumService窄接口,它定义那些需要开放为Web Service的业务方法:

   服务器:

一:声明接口:

package webService;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
/**
* HelloWorld的接口类.
*/

public interface HelloWorld {
/**
* 对名字为name的人打招呼.
* @param name 名字
* @return 返回打招呼的字符串
*/
String sayHelloWorld(String name);

}

 

二:实现类:

package webService;

public class HelloWorldImpl implements HelloWorld {
 public String sayHelloWorld(String name) {
  String helloWorld = "hello------>:" + name;
  return helloWorld;
 }
}


三:在spring配置文件中注入实现类

applicationContext.xml

<bean id="HelloWorldBean" class="webService.HelloWorldImpl"/>

 

四:建立xfire-servlet.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 引入XFire预配置信息 -->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<!--  定义访问的url-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
 <!--<map>
 <entry key="/HelloWorldService.ws">
 <ref bean="HelloWorldService" />
 </entry>
 </map>
 -->                                                    
 <props>
  <prop key="/HelloWorldService.ws">HelloWorldService</prop>
 </props>
</property>
</bean>
<!-- 使用XFire导出器 -->
<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true">
<!-- 引用xfire.xml中定义的工厂 -->
<property name="serviceFactory" ref="xfire.serviceFactory" />
<!-- 引用xfire.xml中的xfire实例 -->
<property name="xfire" ref="xfire" />
</bean>
<bean id="HelloWorldService" parent="baseWebService">
<!-- 业务服务bean -->
<property name="serviceBean" ref="HelloWorldBean"/>
<!-- 业务服务bean的窄接口类 -->
<property name="serviceClass" value="webservice.HelloWorld"/>
</bean>
</beans>

 

五:配置web.xml文件

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


<display-name>XFireService</display-name>
<!-- begin Spring配置 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/classes/applicationContext.xml,/WEB-INF/classes/xfire-servlet.xml</param-value>
 </context-param>
    <context-param>     
        <param-name>log4jConfigLocation</param-name>     
        <param-value>classpath:log4j.properties</param-value>     
    </context-param>  
      
    <listener>  
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    </listener>  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
    <listener>  
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
    </listener>
 <listener>
  <listener-class>
   org.springframework.web.util.IntrospectorCleanupListener
  </listener-class>
 </listener>
<!-- end Spring配置 -->


<!--
  <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>
  --><welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
     <!-- begin XFire 配置 -->
<servlet>
<servlet-name>xfire</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfire</servlet-name>
<url-pattern>*.ws</url-pattern>
</servlet-mapping>
<servlet>
<!--  配合Spring容器中XFire一起工作的Servlet-->
<servlet-name>xfireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfireServlet</servlet-name>
<!-- 在这个URI下开放Web Service服务 -->
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<!-- end XFire 配置 -->
</web-app>

 

 

所需的jar包

 

XmlSchema-1.0.3.jar  activation-1.1.jar
bcprov-jdk15-133.jar
commons-attributes-api-2.1.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-discovery-0.2.jar
commons-httpclient-3.0.jar
commons-logging-1.0.4.jar
jaxb-api-1.0.jar
jaxb-api-2.0EA3.jar
jaxb-impl-1.0.5.jar
jaxb-impl-2.0EA3.jar
jaxb-xjc-2.0EA3.jar
jaxen-1.1-beta-8.jar
jdom-1.0.jar
jmock-1.0.1.jar
junit-3.8.1.jar
log4j-1.2.6.jar
mail-1.4.jar
opensaml-1.0.1.jar
org.mortbay.jetty-5.1.3.jar
relaxngDatatype-20050913.jar
spring-1.2.6.jar
stax-api-1.0.1.jar
stax-utils-snapshot-20040917.jar
sun-jaxws-api-2.0-ea3.jar
sun-saaj-api-2.0-ea3.jar
sun-saaj-impl-2.0-ea3.jar
wsdl4j-1.5.2.jar
wss4j-1.5.0.jar
wstx-asl-2.9.3.jar
xbean-2.1.0.jar
xbean-spring-2.3.jar
xercesImpl-2.6.2.jar
xfire-aegis-1.1.jar
xfire-annotations-1.1.jar
xfire-core-1.1.jar
xfire-distribution-1.1.jar
xfire-generator-1.1.jar
xfire-java5-1.1.jar
xfire-jaxb-1.1.jar
xfire-jaxb2-1.1.jar
xfire-jaxws-1.1.jar
xfire-jsr181-api-1.0-M1.jar
xfire-spring-1.1.jar
xfire-ws-security-1.1.jar
xfire-xmlbeans-1.1.jar
xml-apis-1.0.b2.jar
xmlsec-1.3.0.jar
xsdlib-20050913.jar

 

明:如果在你的项目lib中有asm-2.2.2.jar,可能会引起jar包冲突,换成asm.jar就可以了。

 

 

最后启动Tomcat容器,如何一切正常

键入http://localhost:8080/webService/HelloWorldService.ws?wsdl,你将可以看到HelloWorldService对应的WSDL

 

 

 

使用JSR 181注解导出Web Service

前面两小节中,我们领教了XFireExporter导出器的威力。在需要导出为Web Service的业务类数目不大时,XFireExporter的配置方式非常优雅。但是,如果有很多需要导出为Web Service的业务类,你必须分别为它们配置一个XFireExporter,这让我们回忆起了TransactionProxyFactoryBean(每一个需要事务功能的业务类需要分别配置)。在学习过@Transaction注解后,我们自然而然地希望使用类似注解技术完成Web Service导出的工作。

JSR 181就是为此目的而提出的,它是BEA领导的一个Web Service规范。XFire已经支持JSR 181 2.0,你既可以使用JDK 5.0的注解,也可以在JDK 5.0之前的版本中使用commons-attributes注解。

使用JSR 181的明显好处是,你仅需在业务类和窄接口标注JSR 181注解,不管你有多少需要导出为Web Service的业务类,仅须在Spring中配置一个XFire提供的JSR 181注解增强Bean就可以了。

注解增强处理器会对Spring容器中所有标注JSR 181注解的业务类进行处理,并分别将它们导出为Web Service。使用JSR 181时,必须将XFire的依赖类库xfire-jsr181-api-1.0-M1.jar添加到类路径中。

如果输入、输出的对象类型仅包括基本类型的属性,仅需要在业务类和窄接口中分别使用@WebService注解进行简单的配置就可以了,XFire将根据默认约定导出Web Service。

窄接口仅需要定义一个@WebService注解,并指定SOAP的命名空间就可以了:

 

 

 

 

使用WSDL文件构造客户端程序

并不是任何时候都可以获得Web Service服务端的窄接口类,但我们必然可以获取Web Service对应的WSDL文档。XFire允许我们仅通过Web Service对应的WSDL文件构造客户端访问程序。

 

客户断测试类:

package webService;

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import webService.HelloWorld;
/**
* Copyright 2007 GuangZhou Amigo.
* All right reserved.
* HelloWorld的webservice的测试类.
* @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
* @version 1.0
* Creation date: 2007-9-16 - 下午05:36:05
*/
public class WebServiceClientTest {
 HelloWorld helloWorld = null;
 public static void main(String[] args) throws Exception {
  WebServiceClientTest test = new WebServiceClientTest();
  System.out.println(test.testClient());
 }
 public String testClient() throws Exception {
  
  Service serviceModel=new ObjectServiceFactory().create(HelloWorld.class);
  String serviceURL="http://localhost:8080/webService/HelloWorldService.ws";
  HelloWorld helloWorld=null;
  try{
   
   helloWorld=(HelloWorld)new XFireProxyFactory().create(serviceModel,serviceURL);
  }catch(Exception e){
   throw new RuntimeException(e);
   
  }
  return helloWorld.sayHelloWorld("挖出");
 }
}

 

当然还有如过编写并注册一些相应的Handler就可以实施一些额外处理逻辑,如审计、SOAP消息加密、签名、压缩等技术需要填补,有时间在说.

 

安装Eclipse XFire 插件

1.Help->Software Updates->Find and Install...

2.选择“Search for new features to install”,并点击Next;

3.选择“New Remote Site...”,创建一个Name为XFire,URL为

http://dist.codehaus.org/xfire/update/的网站;

 

webService工作流程图

 

1.XFire Web Service请求和响应的过程

 

2.XFire是完全基于流数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值