XFire在spring中应用

xfirespring的应用:

 

 

xfirespring的应用:
一:目录结构介绍:
首先从官方网址
http://xfire.codehaus.org下载最新的1.2.6版本(截至2007-9-9)。从网站上下载xfire-distribution-1.2.6.zip文件,解压缩后得到如下的目录结构:

api:
主要是javadoc文档资料;
examples:xfire
自带的例子程序;
lib:xfire
所需的jar文件;
manual:xfire
模块
xfire-all-1.2.6.jar:
xfire提供的整体jar包。
二:在应用服务器下面配置XFire
本文在tomcat下面配置xfire的环境,所使用的环境是:
jdk:1.5
tomcat:5.5.9
1
、在tomcat下面按照如下的目录结构新建文件或者文件夹:
webapp
|--xfire
|--WEB-INF
   |--lib
   |--web.xml
   |--classes
   |--META-INF
      |--xfire
        |--services.xml
2
、将解压缩后XFire中的内容按照下面的要求放置
xfire-1.2.6lib下面的内容拷贝到jakarta-tomcat-5.5.9webappsxfireWEB-INFlib目录中
xfire-1.2.6xfire-all-1.2.6.jar拷贝到jakarta-tomcat-5.5.9webappsxfireWEB-INFlib目录中
3
web.xmlservices.xml文件内容设置
web.xml
文件内容放置如下内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- START SNIPPET: webxml -->
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "
http://java.sun.com/dtd/web-app_2_3.dtd">
   
<web-app>
<servlet>
    <servlet-name>XFireServlet</servlet-name>
    <display-name>XFire Servlet</display-name>
    <servlet-class>
        org.codehaus.xfire.transport.http.XFireConfigurableServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
<!-- END SNIPPET: webxml -->
services.xml
文件内容如下:
<!-- START SNIPPET: services -->
<beans xmlns="
http://xfire.codehaus.org/config/1.0">
  
</beans>
<!-- END SNIPPET: services -->
4
、配置好上面的内容后,启动tomcat应用服务器;打开IE浏览器;访问如下的网址:
http://localhost:8080/xfire/services/
如能正确的显示成功页面,说明我们的xfire配置成功了。下面就可基于xfire进行Web Service开发了。

xfirespring下的开发:

1 MyEclipse中新建Web工程,名为webservice_helloworld。选择该工程后,点击右键选择MyEclipse->Add Web Service Capabilities,弹出Add Web Service Capabilities对话框,点击“Next”,弹出Project Library Configuration对话框,默认选择Core Libraries,点击“Finish”按钮,完成XFire核心包的添加。为了后续的客户端的测试,还需读者加入commons-httpclient.jar包到WEB-INF/lib下。
部署后可看到此时WEB-INF/libjar包列表如下:
activation-1.1.jar
commons-beanutils-1.7.0.jarcommons-codec-1.3.jarcommons-httpclient.jarcommons-logging-1.0.4.jarjaxen-1.1-beta-9.jarjaxws-api-2.0.jarjdom-1.0.jarjsr173_api-1.0.jarmail-1.4.jarsaaj-api-1.3.jarsaaj-impl-1.3.jarspring-1.2.6.jarstax-api-1.0.1.jarwsdl4j-1.5.2.jarwstx-asl-3.0.1.jarxbean-2.1.0.jarxbean-spring-2.5.jar
xfire-aegis-1.2.2.jar
xfire-annotations-1.2.2.jarxfire-core-1.2.2.jarxfire-java5-1.2.2.jarxfire-jaxws-1.2.2.jarxfire-jsr181-api-1.0-M1.jarxfire-spring-1.2.2.jarXmlSchema-1.1.jar
别忘了,还要加入spring开发包,我加入了core\web\aop,对spring不是很熟悉所以有可能多加了。
2
Web Service实现的编写

1web.xml的配置
一般情况下,我们通过HTTP作为Web Service的传输协议,这样我们只需启动一个Web服务器(Tomcat,在本例中使用的是Tomcat5.5.20),这样客户端就可以通过HTTP访问到Web Service服务。为了集成Spring容器,XFire专门提供一个XFireSpringServlet,我们可以在web.xml中配置该Servlet,将Spring容器中定义的Web Service在某个URI下发布。
为了能正确使用XFire,需在web.xml中进行相应配置,在该文件中配置XFireservletservlet-mapping。同时因为本实例需要将XFire集成到Spring中,因而需要在web.xml文件中加载Spring的相应配置文件。在本实例中,我们首先在WEB-INF下建立两个配置Spring配置文件,一个为applicationContext.xml,该文件用来定义本工程的bean,一个为xfire-servlet.xml,用来配置XFire的相关bean。修改后的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/applicationContext.xml,/WEB-INF/xfire-servlet.xml
   </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><!-- end Spring
配置 --><!-- 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>
(2)
package com.webservice;

import javax.jws.WebParam;
import javax.jws.WebService;

public interface HelloWorld {
String sayHello(String name);
}
package com.webservice;
import javax.jws.WebService;
public class HelloWorldImp implements HelloWorld {

public String sayHello(String name) {
   return "hello "+name;
}

}
3
Spring配置文件applicationContext.xmlxfire-servlet.xml(spring默认的配置文件是这个)的配置
首先我们在applicationContext.xml文件中配置对应的bean——HelloWorldBean,该xml文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="HelloWorldBean" class="com.webservice.HelloWorldImp" />
</beans>
    XFire
Spring提供了方便易用的导出器XFireExporter,借助该导出器的支持,我们可以在Spring容器中将一个POJO导出为Web ServiceHelloWorld是业务服务类,在此拥有一个sayHelloWorld的方法,我们希望将此方法开放为Web Service。在实际应用中,如果某个类具有众多的方法,而其中的某些方法不需要开放为Web Service的情况下,我们可以定义一个窄接口,该接口中只需定义那些开放为Web Service的业务方法。
将一个业务类所有需要开放为Web Service的方法通过一个窄接口来描述是值得推荐的作法,这让Web Service的接口显得很干净。其次,XFire的导出器也需要服务接口的支持,因为它采用基于接口的动态代理技术。
窄接口中的方法在真实的系统中可能需要引用其它的业务类或DAO获取数据库中的真实数据,为了简化实例,我们在此简化了实例。
下面让我们看看在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" />
<bean
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="urlMap">
    <map>
     <entry key="/HelloWorldService.ws">
      <ref bean="HelloWorldService" />
     </entry>
    </map>
   </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="com.webservice.HelloWorld" />
</bean>
</beans>
   
在上面的配置中,我们可以看到,在该配置文件中引入了xfire.xml这个Spring配置文件。它是在XFire核心JAR包中拥有一个预定义的Spring配置文件,它定义了XFireSpring中必须用到的一些Bean和资源,需要引入这个预定义的配置文件。从该配置文件中可以看出,我们通过XFireExporter将业务类导出为Web Service,对于任何导出器,我们都需要引入XFire环境,即serviceFactoryxfire,这是标准的配置。ServiceFactoryXFire的核心类,它可以将一个POJO生成为一个Web Service
在本实例中,我们通过定义一个baseWebService,其余的webService配置都将该bean作为父bean,这样可以简化Spring的配置,不需要多次引入serviceFactoryxfire

访问: http://ip:port/project_name/service/HelloWorldService.ws

 

 

使用JSR 181注解导出Web Service

如果有很多需要导出为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的命名空间就可以了:
(1)
在上面的工程中继续添加:
package com.webservice.jsr181;

import javax.jws.WebService;
//
指定soap的命名空间
@WebService(targetNamespace = "
http://localhost:8007/test2")
public interface BbtForumService {
int getRefinedTopicCount(int lastDay);
}
package com.webservice.jsr181;

import javax.jws.WebService;

@WebService(serviceName = "BbtForumService",

endpointInterface = "com.webservice.jsr181.BbtForumService")

public class BbtFormServiceImp implements BbtForumService {
public int getRefinedTopicCount(int lastDay) {
   return 0;
}
}
(2)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/applicationContext.xml,/WEB-INF/xfire-servlet.xml
   </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><!-- end Spring
配置 --><!-- 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>
(3)applicationContext.xml
文件:这里将不再需要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>
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<!-- ①
Bean获取Spring容器中所有标注@WebServiceBean -->
<bean id="webAnnotations"
   class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations" />
<!-- ②
对标注@WebServiceBean进行处理,完成导出工作 -->
<bean id="jsr181HandlerMapping"
   class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">

   <property name="xfire" ref="xfire" />

   <property name="webAnnotations" ref="webAnnotations" />

</bean>
<bean id="bbtForum" class="com.webservice.jsr181.BbtFormServiceImp" />
</beans>

使用jrs是在实现类的@WebService(serviceName = "BbtForumService"指定访问路径
使用普通方式是在handler中指定访问路径:
<bean
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="urlMap">
    <map>
     <entry key="/HelloWorldService.ws">
      <ref bean="HelloWorldService" />
     </entry>
    </map>
   </property>
</bean>

花了我整整一天的时间才搞明白。网上资料倒是挺多,但要真组合到一起,就费事了。而且还出了很多错。对了,今天发现tomcat的一个缺点:报错太烂了。就报一错误,详细信息没有。只有借助于log4j了。设置方式是:

在工程路径下建立一个文件:log4j.properties
   log4j.rootLogger=info,stdout

   log4j.appender.stdout=org.apache.log4j.ConsoleAppender
   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
   log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}\t %-5p \t%m%n
web.xml文件中:
   <context-param>

           <param-name>log4jConfigLocation</param-name>

           <param-value>/WEB-INF/log4j.properties</param-value>

      </context-param>
   <listener>

           <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

    </listener>
希望和我一样郁闷的人能够坚持下来。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值