您的位置:首页 > 编程语言 > Java开发

使用xFire和Spring构建WebService

2010-07-29 16:17 459 查看
首先感谢阿蜜果,多谢其写的文章,本文几乎完全参考自其文。

使用xFireSpring开发WebService
要下载xFire和Spring,我用的xFire为1.2.6版,不要只下载xFire这一个jar,下载zip的发布版,这样其他依赖的jar包就都包含了。Spring我用的是2.5.6版的。Eclipse我用的3.5的含J2EE的。
先构建Server端,新建Dynamic Web Project,将以下jar包加入到lib中:activation-1.1.jar、commons-codec-1.3.jar、commons-httpclient-3.0.jar、commons-logging-1.0.4.jar、jaxen-1.1-beta-9.jar、jdom-1.0.jar、mail-1.4.jar、servlet-api-2.3.jar、stax-api-1.0.1.jar、wsdl4j-1.6.1.jar、xfire-all-1.2.6.jar、XmlSchema-1.1.jar以及spring-2.5.6.jar和spring-webmvc.jar。
配置web.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>WebServiceServer</display-name>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<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.context.ContextLoaderListener
</listener-class>
</listener>

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

<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>
</web-app>
文件中已指出Spring和xFire的配置文件位置,这两个配置文件如下:
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="userService" class="com.viewsky.service.UserServiceImpl" />
</beans>
*******************************************************************************
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 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/userService.ws">
<ref bean="userWebService" />
</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="userWebService" parent="baseWebService">
<property name="serviceBean" ref="userService" />
<property name="serviceClass" value="com.viewsky.service.IUserService" />
</bean>
</beans>
配置文件写好了,需要的类如下:
User.java

package com.viewsky.bean;

public class User
{
private String username;
private int age;
private String hobby;

public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}

public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}

public String getHobby()
{
return hobby;
}
public void setHobby(String hobby)
{
this.hobby = hobby;
}

public String toString()
{
return "用户:" + username +
",年龄" + age +
"时,爱好:" + hobby;
}
}
*******************************************************************************
IuserService.java

package com.viewsky.service;

import com.viewsky.bean.User;

public interface IUserService
{
public abstract User findUserHobby(User user) throws Exception;
}
*******************************************************************************
UserServiceImpl.java

package com.viewsky.service;

import java.util.HashMap;
import java.util.Map;

import com.viewsky.bean.User;

public class UserServiceImpl implements IUserService
{
private static final Map<String, String> mapUser =
new HashMap<String, String>();

static
{
mapUser.put("jg.sun", "篮球");
mapUser.put("lcrystal", "足球");
mapUser.put("s0meb0dy", "游泳");
mapUser.put("猫来猫去", "睡觉");
mapUser.put("小刚", "唱歌");
}

public User findUserHobby(User user) throws Exception
{
if(user == null)
{
return null;
}

String hobby = mapUser.get(user.getUsername());

if(hobby == null)
{
user.setHobby("无");
}
else
{
user.setHobby(hobby);
}

return user;
}
}
一切都好了,只差一个index.jsp了,其代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Server</title>
</head>
<body>
<%response.sendRedirect("userService.ws?wsdl"); %>
</body>
</html>
现在发布应用,就可以看到相应的wsdl文件了。
编写客户端,导入同样的jar文件,只是额外多一个对刚建的server打的jar包。web.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>WebServiceClientWeb</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/client.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.viewsky.ws.servlet.TestUserServiceServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
对应的Spring配置文件为client.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="testWebService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean">
<property name="serviceClass">
<value>com.viewsky.service.IUserService</value>
</property>

<property name="wsdlDocumentUrl">
<value>http://10.227.1.39:8080/WebServiceServer/userService.ws?wsdl</value>
</property>
</bean>
</beans>
现在只需要一个servlet就一切OK了,TestUserServiceServlet.java内容如下:
package com.viewsky.ws.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.viewsky.bean.User;
import com.viewsky.service.IUserService;

public class TestUserServiceServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
resp.setCharacterEncoding("GBK");

ServletContext application;
WebApplicationContext wac;
application = getServletContext();
wac = WebApplicationContextUtils.getWebApplicationContext(application);

IUserService userService = (IUserService) wac.getBean("testWebService");
User user = new User();
user.setUsername("lcrystal");
user.setAge(27);
try
{
user = userService.findUserHobby(user);
}
catch(Exception e)
{
e.printStackTrace();
}
PrintWriter out = resp.getWriter();
out.println(user);
}
}
发布客户端就可以看到利用WebService提供的服务了。需要特别说明的是,在我自己的机子上,同时发布Server和Cient是不成功的,只能把Server和Client部署到不同的机器上,这样就可以看到效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: