本篇介绍XFire + Spring构建Web Services服务器端的第二种办法。
两种办法的不同之处在于:
第一种办法的ServletClass是org.codehaus.xfire.spring.XFireSpringServlet,这种办法服务的声明在Spring配置文件中完成,即applicationContext.xml文件中。
第二种办法的ServletClass是org.springframework.web.servlet.DispatcherServlet,这种办法需要另外在WEB-INF文件夹下新建一个XFireServlet-servlet.xml,服务声明在该文件中(和applicationContext.xml,web.xml在同一目录下),这里的XFireServlet是web.xml文件中servlet的名字,需要保持一致。
1、web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/XFireServlet-servlet.xml,
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</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>
<servlet>中的servlet-name可自己设定,但是{servlet-name}-servlet必须为新建xml文件的名字,如程序中servlet-name为XFireServlet,则新建的xml文件的名字为:XFireServlet-servlet.xml,而且该文件的路径需要加入<context-param>下面的<param-value>中。(这个地方见到有的例子并没有加入这个文件的路径,而是:classpath:org/codehaus/xfire/spring/xfire.xml,这点我没写例子实践。)
2、接口类和实现类
package webservice;
/**
*HelloWorld的接口类.
*/
public interface HelloWorld {
/**
*对名字为name的人打招呼.
*@paramname名字
*@return返回打招呼的字符串
*/
String sayHelloWorld(String name);
}
我们还需要建立一个对应的实现类,来实现sayHelloWorld的功能,该实现类即为HelloWorldImpl.java。该类的详细内容如下:
package webservice;
/**
*HelloWorld的实现类.
*/
public class HelloWorldImpl implements HelloWorld {
public String sayHelloWorld(String name) {
String helloWorld = " hello, " + name;
return helloWorld;
}
}
这个没什么特别的
3、配置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 id ="HelloWorldBean" class ="webservice.HelloWorldImpl" />
</ beans >
4、配置服务(XFireServlet-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 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 ="webservice.HelloWorld" />
</ bean >
</ beans >
如果有多个服务,添加多个<entry></entry>即可
配置完成在浏览器中输入http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl 测试一下是否正常