WebService学习笔记
来源:http://www.7dit.com 作者:7dit 发布日期:2008-10-14 01:38:56 点击量:205
一. 关于WebService
WebService是基于“无缝集成”提出的新概念,是一种跨语言的技术
二. 涉及:
1. XML (可扩展标记语言)
为“跨语言”奠定了基础,不同的语言可以通过相应的IO操作,对传输的XML文档进行拆分与解释,从而进行数据的传送。
为“跨语言”奠定了基础,不同的语言可以通过相应的IO操作,对传输的XML文档进行拆分与解释,从而进行数据的传送。
个人理解:
正如对超文本的传输需要http协议与html语言解释标准一样,要真正实现基于这种XML文档的跨平台,跨语言数据传送,需要两方面的标准。
一是协议标准,二是语言标准,只有规范了这两个标准,才能让XML的数据对于不同平台与不同语言更加兼语和易于操作。
2.SOAP(simple object access protocol) 简单对象访问协议, 这就是基于XML传输的一种标准协议,有了SOAP,才能实现XML通过webservice进行标准的传输,实现数据以及简单
对象的访问。而这种协议是一种轻量级协议(即不是基于底层的传输协议),它可以运行于任何其他协议上,因此通过SOAP协议,就可以实现数据在HTTP,SOCKET等不同协议上的
传输, 从而实现跨平台,跨语言的目的。
3.WSDL Web服务描述语言
这是XML解释的一种标准化文档,用于描述具体Web服务的用途,以及使用方法,简单点理解就是,WSDL是一种“说明书”,不同的语言系统需要先读懂不同Web服务的“说明书”,
这是XML解释的一种标准化文档,用于描述具体Web服务的用途,以及使用方法,简单点理解就是,WSDL是一种“说明书”,不同的语言系统需要先读懂不同Web服务的“说明书”,
再让程序根据说明书提供的标准进行调用服务。而WSDL正是规定了这种说明书的书写标准与规范。
三. 应用
真正应用webservice,除了需要通过SOAP获取XML数据外,最重要的是需要根据WSDL的描述,进行解释整个Web服务,从而进行相关调用。 WSDL真正全手动进行解释,需要很多准备
真正应用webservice,除了需要通过SOAP获取XML数据外,最重要的是需要根据WSDL的描述,进行解释整个Web服务,从而进行相关调用。 WSDL真正全手动进行解释,需要很多准备
工具,除了对XML文档对象的操作外,需要完整的了解WSDL的整个语法规范。 为了简化这些工作,J2EE有了一个很方便的API。 XFire
四. XFire
A. Server端
步骤
1. 通常需要规定的是服务的接口,当然这个不是必需的,但是接口编程是OO中很重要的思想, 就使得在提供相应类或方法时,需要先制定一套规范,WebService也不例外。
2. 创建一个类,实现接口中的相关方法。 方法一般需要一个返回值,当然可以无返回值, 但哪怕是数据的写入操作,也通常需要返回一个boolean型来通知客户端对webservice
1. 通常需要规定的是服务的接口,当然这个不是必需的,但是接口编程是OO中很重要的思想, 就使得在提供相应类或方法时,需要先制定一套规范,WebService也不例外。
2. 创建一个类,实现接口中的相关方法。 方法一般需要一个返回值,当然可以无返回值, 但哪怕是数据的写入操作,也通常需要返回一个boolean型来通知客户端对webservice
的操作结果。PS: 基于SOAP与WSDL,返回值完全可以是一个java bean对象,这才是WebService的真正优点。
3. 配置services.xml 这是XFire的配置文档,就像servlet一样,需要一个XML对该服务(实例)进行初始化
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MyWeather</name> -- 服务的实例名,通过该名字可以调用该用务
<namespace>www.7dit.com/MyWeather</namespace> -- 命名空间,这只是方便客户端的一些快捷工具进行重构服务,对Java来说,client再次生成的包名就来自
3. 配置services.xml 这是XFire的配置文档,就像servlet一样,需要一个XML对该服务(实例)进行初始化
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MyWeather</name> -- 服务的实例名,通过该名字可以调用该用务
<namespace>www.7dit.com/MyWeather</namespace> -- 命名空间,这只是方便客户端的一些快捷工具进行重构服务,对Java来说,client再次生成的包名就来自
这里
<serviceClass>serverPack.WeatherService</serviceClass> -- 服务的接口
<implementationClass>serverPack.WeatherServiceImp</implementationClass> -- 实现类
</service>
</beans>
<serviceClass>serverPack.WeatherService</serviceClass> -- 服务的接口
<implementationClass>serverPack.WeatherServiceImp</implementationClass> -- 实现类
</service>
</beans>
4. 配置好services.xml 后,理论上MyWeather服务就可以根据这个文档配置进行启动实例了。 但还差一步,XFire发布的WebService需要由Servlet来启动它。这个Servlet的类由
XFire的API封装好了,我们只需对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"
<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">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> -- 这个就是XFire用于创建web服务的servlet类
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> -- 这个就是XFire用于创建web服务的servlet类
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
5. 测试
到此为止,将web项目布署应用后,就可以访问web服务了。容器将先创建servlet, 在其基础上我们可以访问所创建的web服务,该服务在这就就是一个接口的实例,即天气
MyWeather接口。 上述例子,假设web项目的路径为 http://localhost:8080/webservice/ 则该webservice的服务URL为http://localhost:8080/webservice/services/MyWeather
可以输入http://localhost:8080/webservice/services/MyWeather?wsdl 查看该服务的wsdl文档,同样可以把该文档交由相应的客户端工具处理,从而实现远程的服务调用。
B.client端
在Server端提供服务后,我们就可以在client端获取其传输来的数据,这个数据是什么? 实际上就是由SOAP协议封装的XML数据,经过WSDL的解释后,还原服务实例,并且通过调
在Server端提供服务后,我们就可以在client端获取其传输来的数据,这个数据是什么? 实际上就是由SOAP协议封装的XML数据,经过WSDL的解释后,还原服务实例,并且通过调
用服务,获得数据或者提交数据。
具体方法
在J2EE中,仍然使用XFire的API,操作就简洁的多了。
1.建立一个servlet
导入包:
import java.net.MalformedURLException; //该异常用于在调用服务时手动抛出的异常,表示客户端通过接口,调用远程的服务实例失败。
import org.codehaus.xfire.XFire; // API的BEAN类
import org.codehaus.xfire.XFireFactory; //用于生成XFire的工厂类
import org.codehaus.xfire.client.XFireProxyFactory; //工厂的代理,用该代理调用XFire的实例创建一个服务工厂(这个需要去关注一下Proxy的概念)
import org.codehaus.xfire.service.Service; //webService的基类,做法是通过反射服务接口生成服务的对象实例
import org.codehaus.xfire.service.binding.ObjectServiceFactory; //生成服务对象的工厂类
import java.net.MalformedURLException; //该异常用于在调用服务时手动抛出的异常,表示客户端通过接口,调用远程的服务实例失败。
import org.codehaus.xfire.XFire; // API的BEAN类
import org.codehaus.xfire.XFireFactory; //用于生成XFire的工厂类
import org.codehaus.xfire.client.XFireProxyFactory; //工厂的代理,用该代理调用XFire的实例创建一个服务工厂(这个需要去关注一下Proxy的概念)
import org.codehaus.xfire.service.Service; //webService的基类,做法是通过反射服务接口生成服务的对象实例
import org.codehaus.xfire.service.binding.ObjectServiceFactory; //生成服务对象的工厂类
具体代码,当然需要先定义好接口以及相关实体的类。 直接的办法可以自己分析,WSDL中的描述,建立相应的接口与实体类。 当然很多IDE工具可以自动解析WSDL,建立出相应的
工程。 但缺点时不同的IDE工具在解析时难免会遇到一些无法解释的数据,这时只能通过手动的方法对数据类型进行分析建模了。
以下代码暂时只关注如何,在得到服务模型说相关接口模型后调用该服务
Service serviceModel = new ObjectServiceFactory().create(WeatherService.class); //由服务的工厂创建出服务的模型
System.out.println("返回了服务的模型");
XFire xfire = XFireFactory.newInstance().getXFire(); //工厂的单例模式创建一个xfire
XFireProxyFactory factory = new XFireProxyFactory(xfire); //再由工厂的代理来真正创建一个服务工厂
String serviceUrl = "http://localhost:8086/WebService/services/MyWeather"; //web服务的URL
WeatherService ws = null; //定义接口的原型,即服务的原型
ws = (WeatherService)factory.create(serviceModel,serviceUrl); //通过服务的工厂远程调用该服务,并且转换为相应的服务实例
Weather wt = ws.getWeather("福州"); //这样,就可以在本地调用该服务对象,以及其间的相关方法, 实现远程调用
System.out.println("返回了服务的模型");
XFire xfire = XFireFactory.newInstance().getXFire(); //工厂的单例模式创建一个xfire
XFireProxyFactory factory = new XFireProxyFactory(xfire); //再由工厂的代理来真正创建一个服务工厂
String serviceUrl = "http://localhost:8086/WebService/services/MyWeather"; //web服务的URL
WeatherService ws = null; //定义接口的原型,即服务的原型
ws = (WeatherService)factory.create(serviceModel,serviceUrl); //通过服务的工厂远程调用该服务,并且转换为相应的服务实例
Weather wt = ws.getWeather("福州"); //这样,就可以在本地调用该服务对象,以及其间的相关方法, 实现远程调用
Copyright © 2005 奇点中文网--7dit.com
闽ICP备05001292号
闽ICP备05001292号
