看了网上有很多关于xfir + spring 开发webservice服务的例子,本人进行了总结在这里介绍一个较完整的例子:
1、 在myeclipse中新建一个web工程xfireWS,导入需要的spring和xfire支持包,
[img]http://zhouyangchenrui.iteye.com/upload/attachment/125764/241f7fbb-0ecb-3b1f-822a-251d425c0c71.jpg[/img]
2、创建包及所需要的类文件
[img]http://zhouyangchenrui.iteye.com/upload/attachment/125766/ee8f08dd-900e-3119-9427-6f807a7a4ed8.jpg[/img]
其中IDataService.java为服务接口类,IDataServiceImpl.java为接口实现类,TestServlet.java为测试用servlet类,IDataService.aegis.xml和IDataService.doc.xml为接口方法描述文件,名称应与接口名匹配,由xfire-aegis包支持。下面是类的具体代码:
IDataService.java
package com.ws.test;
/**
* WebService服务接口
* @author zhouyang
* 2009-7-16
*/
public interface IDataService {
/**
* 从WebService服务器上获取xml数据
* @param user
* @param pwd
* @return String xml数据
*/
public String getXmlData(String userName, String pwd);
/**
* 发送xml数据到WebService服务器
* @param user
* @param pwd
* @param xmlData 转型为byte[]类型的xml数据
* @return String 发送成功或失败信息
*/
public String sendXmlData(String userName, String pwd, byte[] xmlData);
}
IDataServiceImpl.java
public class DataServiceImpl implements IDataService {
public String getXmlData(String userName, String pwd) {
//这里给出该方法的简单实现,你可以写更复杂的业务逻辑
String xmlData = "";
if("123".equals(userName) && "123".equals(pwd)){
xmlData = "";
xmlData += "Thinking In Java"
+ "Java & PatternEffective Java";
}else{
xmlData = "用户名和密码错误";
}
return xmlData;
}
public String sendXmlData(String userName, String pwd, byte[] xmlData) {
return null;
}
}
TestServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.xfire.client.Client;
/**
* 通过get方式请求webservice,这里用servlet进行客户端调用处理
*
*/
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String userName = req.getParameter("userName"); //用户名
String pwd = req.getParameter("pwd"); //密码
String ip = req.getLocalAddr();
int port = req.getServerPort();
String url = "http://" + ip + ":" + port + "/xfireWS/testService.ws?wsdl"; //wsdl描述文件路径
//调用客户端方法
String result =wsClient(url, "getXmlData", new Object[]{userName,pwd});
if(result.indexOf("=0) //设置输出格式,如果是异常信息则以html格式输出
resp.setContentType("text/xml");
else
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out=resp.getWriter();
out.write(result);
out.flush();
}
/**
* webservice客户端调用方法
* @param url wsdl描述文件路径
* @param methodName 服务方法名
* @param obj 服务方法参数数组
* @return String
*/
private String wsClient(String url, String methodName, Object[] obj) {
Client client;
try {
client = new Client(new URL(url));
Object[] results = client.invoke(methodName, obj);
return (String)results[0];
} catch (Exception e) {
e.printStackTrace();
return "服务请求失败";
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
IDataService.aegis.xml
xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">
IDataService.doc.xml
用户名
密码
获取的xml数据
用户名
密码
转型为byte数组发送的xml数据
发送成功或失败信息
applicationContext.xml
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
3、web.xml文件和xfire-sevlet.xml文件,“xfire”与web.xml文件中servlet-name对应。
web.xml 内容
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
webservice demo
contextConfigLocation
classpath:applicationContext.xml
classpath:org/codehaus/xfire/spring/xfire.xml
org.springframework.web.context.ContextLoaderListener
xfire
org.springframework.web.servlet.DispatcherServlet
xfire
*.ws
test
com.ws.test.TestServlet
test
/testService.ws/getXmlData/*
test
/testService.ws/sendXmlData/*
index.jsp
xfire-sevlet.xml内容
com.ws.test.IDataService
4、发布到tomcat服务器,启动服务器成功后,输入
http://localhost:8080/xfireWS/testService.ws?wsdl可以查看wsdl描述文件,
[img]http://zhouyangchenrui.iteye.com/upload/attachment/125768/3cb4818d-a28c-3935-b1c6-eed50e18d829.jpg[/img]
输入
http://localhost:8080/xfireWS/testService.ws/getXmlData?userName=123&pwd=123可以得到webservice服务提供的返回值,为一个xml数据,
[img]http://zhouyangchenrui.iteye.com/upload/attachment/125772/a66e8d54-87a8-396b-ab6a-d3fa1ff461ac.jpg[/img]
如果输入用户名和密码错误则有错误提示。
关于web.xml文件和xfire-sevlet.xml文件的配置这里不在重述,如有疑问可以在网上找到答案。