上一篇我已经介绍了SSH+Xfire+Proxool的第一种整合方式,当然了这里主要体现了Xfire跟spring的整合。这里还拿前面的例子来说一下Xfire跟Spring的另外一种结合方式,代码基本上和上面一样,不同的地方主要体现在几个配置文件上,下面做些说明:
1、在web-inf /的根目录下添加 xfire-servlet.xml 文件,用来定义webservice需要提供的接口。第一种结合方式不需要这个配置文件,而是把接口直接定义到了applicationContext.xml 里面的。
2、在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>/services/*</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>/services/*</url-pattern>
</servlet-mapping>
在Spring MVC框架中,每个DispatcherServlet有它自己的WebApplicationContext,这个context继承了根ApplicationContext的所有bean定义。在DispatcherServlet的初始化过程中,Spring会在web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml的配置文件,生成文件中定义的bean。上面例子的Spring默认配置文件为xfire-servlet.xml。
3、关于org/codehaus/xfire/spring/xfire.xml文件的导入
这个可以写到web.xml 文件里面: classpath:org/codehaus/xfire/spring/xfire.xml
还可以在xfire —servlet.xml 文件里面: <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
还可以在applicationContext.xml 里面:<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
本例中是吧xfire.xml 的声明定义到了web.xml中了
上一篇是定义到了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>
<!-- 引入XFire预配置信息 这一句也可添加到web.xml 的上下文中,tomcat 开启时进行加载
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />-->
<!--定义访问的url-->
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/Login"><!--此为服务名,即调用接口的名称http://*Login?WSDL-->
<ref bean="login" />
</entry>
</map>
</property>
</bean>
<!-- 这里一般都使用XFire导出器,但是本程序中没有这么做,原因可能是因为webservice只开放了一个接口
要是提供多个接口的话,用xfire的导出器还是比较方便的等省不少代码,这个在webservice04中有所体现 -->
<bean id="login"
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="LoginDAOImpl" /><!--在 applicationContext.xml 中装配的类-->
</property>
<property name="serviceClass">
<value>com.easylife.dao.ILoginDAO</value><!-- 接口-->
</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是不一样的。
<bean id="login" parent="baseWebService">
业务服务bean
<property name="serviceBean" ref="LoginDAOImpl" />
业务服务bean的窄接口类
<property name="serviceClass" value="com.easylife.ILoginDAO" />
</bean>
-->
</beans>
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>
<bean name="/login" class="com.easylife.action.LoginAction"></bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.dbs" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<!--加载tomcat的时候进行自动创建表,不加默认不会创建-->
<!--<prop key="hibernate.hbm2ddl.auto">create</prop>
-->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.connection.release_mode">after_statement</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/easylife/model/User.hbm.xml</value></list>
</property>
</bean>
<bean id="LoginDAOImpl" class="com.easylife.dao.LoginDAOImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--连接池proxool服务配置 start-->
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>/WEB-INF/classes/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--观察连接池proxool 管理信息,可以不用加载-->
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<!--连接池proxool服务配置 end-->
<!--spring服务配置 start-->
<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!--spring服务配置 end-->
<!--初始化系统配置文件 start-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml,
classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
</context-param>
<!--初始化系统配置文件 end-->
<!--struts 的配置 start-->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--struts 的配置 end-->
<!--xfire 和 sping 的结合 start-->
<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>/services/*</url-pattern>
</servlet-mapping>
<!--xfire 和 sping 的结合 end-->
</web-app>
上面关于spring是否会根据** 的名称去web-inf/下面去找相应的**-servlet.xml 的xfire的这个配置文件,我在另一个项目按照上面的配置方法来做老是报找不到**-servlet .xml 文件的异常,后来把
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext-*.xml,
/WEB-INF/xfire-servlet.xml
</param-value>
</context-param>
问题解决。