首页 > 代码库 > 上课笔记_Web服务,XFire的一个例子

上课笔记_Web服务,XFire的一个例子

Web服务优点

互操作性:实现不同系统间的相互调用(语言无关、平台无关)


Web服务是什么

Web 服务是一类应用程序,是能够用编程的方法通过Web调用来实现某个功能的应用程序


Web服务的体系结构


Web服务需要遵守的技术标准

1. XML(描述WEB服务数据的标准方法)
2. SOAP(表示WEB服务信息交换的协议)
3. WSDL(WEB服务描述语言)
4. UDDI(统一描述发现和集成)


这里关于WebService就不多加详细介绍了,如果有兴趣可以查看百度百科 WebService,我这里收藏了一份:
http://pan.baidu.com/s/1bnpLo43

Java中比较流行的两种Web服务开源框架axis和XFire比较


使用Web服务的一个例子

添加XFire用户库

点击工具Window→Preferences

Add JARs添加lib下的所以jar包和xfire-all-1.2.6.jar;

客户端调用Web服务

训练要点:
掌握利用XFire创建客户端,调用Web服务
需求说明:
任意输入一个数字n,返回1+2+…+n的累加和, 并在控制台显示出来
实现思路:
1、创建服务接口SumService.java
2、创建客户端调用类Client.java
3、运行求数字累加和Web服务
4、运行客户端调用服务,传入参数,获得运行结果

创建Web Service Project

点击新建 Web Service Project :SumWebService 
WebService选择第二个REST 点击Next
现在User Libraries 选择刚刚创建的XFire完成

配置web.xml
  <servlet>
  	<display-name>XFireServlet</display-name>
  	<servlet-name>XFireServlet</servlet-name>
  	<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
  	<init-param>
  		<param-name>config</param-name>
  		<param-value>services.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>XFireServlet</servlet-name>
  	<url-pattern>/services/*</url-pattern>
  </servlet-mapping>

新建接口和实现类:

新建接口:

cn.edu.hqu.service下SumService;

package cn.edu.hqu.service;

public interface SumService {
	/**
	 * 返回1-n的累加和
	 * @param n
	 * @return
	 */
	public int getSum(int n);
}
新建实现类 实现 SumService
cn.edu.hqu.service.impl下SumServiceImpl:
package cn.edu.hqu.service.impl;

import com.service.SumService;

public class SumServiceImpl implements SumService {

	public int getSum(int n) {
		int sum = 0;
		for (int i = 1; i <= n; i++) {
			sum += i;
		}
		return sum;
	}

}

在src下新建services.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
	<service>
		<name>SumService</name>
		<serviceClass>cn.edu.hqu.service.SumService</serviceClass>
		<implementationClass>cn.edu.hqu.service.impl.SumServiceImpl</implementationClass>
		<style>wrapped</style>
		<use>literal</use>
		<scope>application</scope>
	</service>
</beans>

部署到tomcat启动,访问localhost:8080/SumWebService/services 

Web服务的调用


获取有效WSDL地址

新建一个客户端Web project: Client
引入服务端那个项目SumWebService
右击项目,Properties 


引入自己建的XFire标签库:右击项目 build path →add libra..→User Library Next 选择XFire完成;
 
Client新建SumClinet类
	public static void main(String[] args) throws Exception {
		//加载xfire
		//创建服务
		Service service =  new ObjectServiceFactory().create(SumService.class);
		//WSDL地址
		String url = "http://localhost:8080/SumWebService/services/SumService";
		XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
		SumService sumService = (SumService) factory.create(service, url);
		//保证服务端有开启
		System.out.println(sumService.getSum(100));
	}
运行之前,webService服务端(SumWebService)要先部署启动;
运行main,控制台输出5050 ;

 但是这样两个项目耦合在一起了;
另外一种方式 SumClinet:

	public static void main(String[] args) throws Exception {
				String wsdlLocation = "http://localhost:8080/SumWebService/services/SumService?wsdl";
		Client client = new Client(new URL(wsdlLocation));
		Object[] o =client.invoke("getSum",new Object[]{100});
		System.out.println(o[0]);
	}
运行main输出结果;

补充说明:点击web.xml 
下的org.codehaus.xfire.transport.http.XfireConfigurableServlet进到该类:
我们可以看到
private final static String CONFIG_FILE = "META-INF/xfire/services.xml";
默认路径是在META-INF/xfire/services.xml
源码里:
private String getConfigPath()
    {
        if (configPath == null || configPath.length() == 0)
        {
            return CONFIG_FILE;
        }
        return configPath;
    }

一开始会得到这个路径,如果路径为空的话,就会使用默认的路径;

所以我们在wen.xml里买指定 configPath路径,src下直接写文件名

  	<init-param>
  		<param-name>config</param-name>
  		<param-value>services.xml</param-value>
  	</init-param>
这样就不会报错了,或者可以将services.xml放在新建的META-INF/xfire/services.xml下;

Xfire下载:http://pan.baidu.com/s/1ntx8yLF
代码:http://pan.baidu.com/s/1vmXtG