xfire和Spring良好的结合,促使我将原有的axis方式改造到xfire方式。下面将整个过程简述一下,首先看一下如何配置xfire。在Web.xml中有两种方式来配置xfire,
一种是通过spring提供的org.springframework.web.servlet.DispatcherServlet来实现,配置方法是这样的:
1、web.xml中配置
-
<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>/*</url-pattern>??
-
???? </servlet-mapping>??
<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>/*</url-pattern> </servlet-mapping>
2、WEB-INF下添加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>??
-
???? <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">??
-
???????? <property name="urlMap">??
-
???????????? <map>??
-
???????????????? <entry key="/EchoService"> <!-- 这里是WebService的名称 -->??
-
???????????????????? <ref bean="echo"/>???
-
???????????????? </entry>??
-
???????????? </map>??
-
???????? </property>??
-
???? </bean>??
-
??????
-
???? <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">??
-
???????? <property name="serviceFactory">??
-
???????????? <ref bean="xfire.serviceFactory"/>??
-
???????? </property>??
-
???????? <property name="xfire">??
-
???????????? <ref bean="xfire"/>??
-
???????? </property>??
-
???????? <property name="serviceBean">??
-
???????????? <ref bean="echoBean"/>??
-
???????? </property>??
-
???????? <property name="serviceClass">??
-
???????????? <value>xxx.com.webservice.Echo</value>??
-
???????? </property>??
-
???? </bean>??
-
</beans>??
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/EchoService"> <!-- 这里是WebService的名称 --> <ref bean="echo"/> </entry> </map> </property> </bean> <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter"> <property name="serviceFactory"> <ref bean="xfire.serviceFactory"/> </property> <property name="xfire"> <ref bean="xfire"/> </property> <property name="serviceBean"> <ref bean="echoBean"/> </property> <property name="serviceClass"> <value>xxx.com.webservice.Echo</value> </property> </bean> </beans>
配置完成后,定义一个接口,然后启动Server,通过client可实现WebService的访问。
同时,xfire提供了另外一种阅读性更好,更符合spring配置习惯的配置方法,配置方法如下:
1、web.xml
-
<servlet>??
-
???????? <servlet-name>XFireServlet</servlet-name>??
-
???????? <servlet-class>??
-
???????????? org.codehaus.xfire.spring.XFireSpringServlet??
-
???????? </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>/service/*</url-pattern>??
-
???? </servlet-mapping>??
<servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class> org.codehaus.xfire.spring.XFireSpringServlet </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>/service/*</url-pattern> </servlet-mapping>
这种方式不需要单独配置一个xfire-servlet.xml文件,只需要在spring的applicationContext文件中进行配置就能实现WebService的配置
2、applicationContext.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下面这个xml文件 -->??
-
???? <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />??
-
??????
-
???? <!-- WebService Impl?? WebService接口的实现类-->??
-
???? <bean id="accountWebServiceImpl" class="xxx.com.account.webservice.impl.AccountWebServiceImpl" autowire="byName" />??
-
???? <!-- end -->??
-
??????
-
???? <!-- 下面的配置是WebService的标准配置 -->??
-
???? <bean id="AccountWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter"> <!-- WebService的名字 -->??
-
???????? <property name="xfire" ref="xfire" />??
-
???????? <property name="serviceBean" ref="accountWebServiceImpl" /> <!-- WebService的实现类bean -->??
-
???????? <property name="serviceClass" value="xxx.com.account.webservice.AccountWebService" />??
-
???????? <property name="inHandlers" ref="authenticationHandler"/> <!--普通的用户名密码的方式进行WebService的验证-->??
-
???? </bean>??
-
???? <bean id="authenticationHandler"??
-
??????????class="xxx.com.account.webservice.authentcation.AuthenticationHandler"/>??
-
</beans>??
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 需要import下面这个xml文件 --> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /> <!-- WebService Impl WebService接口的实现类--> <bean id="accountWebServiceImpl" class="xxx.com.account.webservice.impl.AccountWebServiceImpl" autowire="byName" /> <!-- end --> <!-- 下面的配置是WebService的标准配置 --> <bean id="AccountWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter"> <!-- WebService的名字 --> <property name="xfire" ref="xfire" /> <property name="serviceBean" ref="accountWebServiceImpl" /> <!-- WebService的实现类bean --> <property name="serviceClass" value="xxx.com.account.webservice.AccountWebService" /> <property name="inHandlers" ref="authenticationHandler"/> <!--普通的用户名密码的方式进行WebService的验证--> </bean> <bean id="authenticationHandler" class="xxx.com.account.webservice.authentcation.AuthenticationHandler"/> </beans>
通过上面的配置,就可以将Spring的bean和xfire的WebService很好的结合起来了,以上的方式在WebService上只是做了简单的密码验证,并不能保证WebService的安全性,下面将详细描述如何通过WSS4J的方式来实现WebService的数字证书的加密验证,这里大量的参考了SpringSide,非常感谢!