网站风格: 红 | 蓝
搜索:  全站?
首页 |  Java开发 |  DOTNET开发 |  PHP开发 |  ASP技术 |  Web开发 |  数据库应用 |  网络文摘 |  作品集 |  下载 |  留言
文章聚合
  J2EE  |   框架技术  |   Javascript  |   AJAX  |   J2ee Server  |   J2ME  |
  WinForm开发  |   Asp.net  |   C#语言  |   服务器  |   第三方控件  |
  PHP笔记  |   Linux  |   第三方代码  |
  ASP教程  |   ASP实用代码  |   ASP笔记  |   服务器  |
  CSS样式表  |   Photoshop设计  |   Flash  |   HTML 小技巧  |   Dreamweaver  |   XML技术  |
  SQL Server  |   Oracle  |   MySQL  |
  散文  |   幽默  |   杂文  |
  Web 项目  |   杂七杂八  |
  第三方代码  |   实用工具  |   作品下载  |   帮助文档  |
奇点网 - Java开发 - J2EE - WebService学习笔记
WebService学习笔记
来源:http://www.7dit.com     作者:7dit     发布日期:2008-10-14 01:38:56   点击量:205
一. 关于WebService

WebService是基于“无缝集成”提出的新概念,是一种跨语言的技术

二. 涉及:

1. 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服务的“说明书”,

再让程序根据说明书提供的标准进行调用服务。而WSDL正是规定了这种说明书的书写标准与规范。

三. 应用
真正应用webservice,除了需要通过SOAP获取XML数据外,最重要的是需要根据WSDL的描述,进行解释整个Web服务,从而进行相关调用。 WSDL真正全手动进行解释,需要很多准备

工具,除了对XML文档对象的操作外,需要完整的了解WSDL的整个语法规范。 为了简化这些工作,J2EE有了一个很方便的API。 XFire


四. XFire

A. Server端

步骤
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再次生成的包名就来自

这里
  <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"

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>

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的解释后,还原服务实例,并且通过调

用服务,获得数据或者提交数据。

具体方法

在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; //生成服务对象的工厂类

具体代码,当然需要先定义好接口以及相关实体的类。 直接的办法可以自己分析,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("福州"); //这样,就可以在本地调用该服务对象,以及其间的相关方法, 实现远程调用

 

 

 
标签:   WebService  |  XML  |  SOAP  |  XML  |
留言 | 链接 | 标签 | 风格: 红 蓝   
Copyright © 2005 奇点中文网--7dit.com
闽ICP备05001292号