WebService专题培训Word格式.docx
《WebService专题培训Word格式.docx》由会员分享,可在线阅读,更多相关《WebService专题培训Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
感谢主要的IT开发商近年来的努力,大多数的人们和企业拥有了宽带连接,并越来越多地使用Web。
最重要的事情是协同工作,于所有主要的平台均可通过Web浏览器来访问Web,不同的平台可以借此进行交互。
为了让这些平台协同工作,Web应用程序被开发了出来。
Web应用程序是运行在Web上的简易应用程序。
它们围绕Web浏览器标准被进行构建,几乎可被任何平台之上的任何浏览器来使用。
Webservices把Web应用程序提升到了另外一个层面
通过使用Webservices,您的应用程序可向全世界发布功能或消息。
Webservices使用XML来编解码数据,并使用SOAP借由开放的协议来传输数据。
Webservices有两种类型的应用
●可重复使用的应用程序组件
有一些功能是不同的应用程序常常会用到的。
那么为什么要周而复始地开发它们呢?
Webservices可以把应用程序组件作为服务来提供,比如汇率转换、天气预报或者甚至是语言翻译等等。
比较理想的情况是,每种应用程序组件只有一个最优秀的版本,这样任何人都可以在其应用程序中使用它。
●连接现有的软件
通过为不同的应用程序提供一种链接其数据的途径,Webservices有助于解决协同工作的问题。
通过使用Webservices,您可以在不同的应用程序与平台之间来交换数据。
WebServices拥有三种基本的元素。
它们是:
SOAP、WSDL以及UDDI。
什么是SOAP?
●SOAP指简易对象访问协议
●SOAP是一种通信协议
●SOAP用于应用程序之间的通信
●SOAP是一种用于发送消息的格式
●SOAP被设计用来通过因特网进行通信
●SOAP独立于平台
●SOAP独立于语言
●SOAP基于XML
●SOAP很简单并可扩展
●SOAP允许您绕过防火墙
●SOAP将作为W3C标准来发展
什么是WSDL
WSDL是基于XML的用于描述WebServices以及如何访问WebServices的语言。
●WSDL指网络服务描述语言
●WSDL使用XML编写
●WSDL是一种XML文档
●WSDL用于描述网络服务
●WSDL也可用于定位网络服务
●WSDL还不是W3C标准
什么是UDDI?
UDDI是一种目录服务,通过它,企业可注册并搜索Webservices。
●UDDI指通用的描述、发现以及整合(UniversalDescription,DiscoveryandIntegration)。
●UDDI是一种用于存储有关webservices的信息的目录。
●UDDI是一种由WSDL描述的网络服务接口目录。
●UDDI经由SOAP进行通迅。
●UDDI被构建于Microsoft.NET平台之中。
任何应用程序都可拥有WebService组件。
WebServices的创建与编程语言的种类无关。
二、WebService框架的比较
在SOA领域,我们认为WebService是SOA体系的构建单元(buildingblock)。
对于服务开发人员来说,AXIS和CXF一定都不会陌生。
这两个产品都是Apache孵化器下面的WebService开源开发工具。
Axis2的最新版本是1.6.2,CXF最新版本是2.7.0。
这两个框架都是从已有的开源项目发展起来的。
Axis2是从Axis1.x系列发展而来。
CXF则是XFire和Celtix项目的结合产品。
Axis2是从底层全部重新实现,使用了新的扩展性更好模块架构。
CXF也重新的深化了XFire和Celtix这两个开发工具。
新产品的推出导致了几个问题。
是不是现有的使用Axis1.x,XFire和Celix的应用需要迁移的新的版本上。
如果一个开发人员确定要迁移它的应用到新的框架上,那么他应该选择哪一个呢?
相反的,如果一个开发者决定从头开发一个新的WebService,他应该使用哪个呢?
这两个框架哪一个更好一些呢?
对于系统迁移来说,也许迁移到新的框架并不难。
Axis和CXF都提供了迁移的指导。
能够给开发者一些迁移的技巧和经验。
但是对于这样迁移,这两个开源项目都没有提供迁移的工具。
对于这样的迁移工作,尽管很值得去寻找所有的可行方案。
Axis2和CXF都有各自不同的WebService开发方法,每个方法都有相当数量拥护者。
通过一个比较矩阵来比较Axis2和CXF变得有现实的意义。
这两个项目都开发不够成熟,但是最主要的区别在以下几个方面:
1.CXF支持WS-Addressing,WS-Policy,WS-RM,WS-Security和WS-IBasicProfile。
Axis2不支持WS-Policy,但是承诺在下面的版本支持。
2.CXF可以很好支持Spring。
Axis2不能。
3.AXIS2支持更广泛的数据并对,如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。
注意JaxME和JaxBRI都还是试验性的。
CXF只支持JAXB和Aegis。
4.Axis2支持多语言-除了Java,他还支持C/C++版本。
比较这两个框架的WebService开发方法与比较它们的特性同样重要。
从开发者的角度,两个框架的特性相当的不同。
Axis2的开发方式类似一个小型的应用服务器,Axis2的开发包要以WAR的形式部署到Servlet容器中,比如Tomcat,通过这些容器可以对工作中的WebService进行很好的监控和管理。
Axis2的Webadministrion模块可以让我们动态的配置Axis2。
一个新的服务可以上载,激活,使之失效,修改web服务的参数。
管理UI也可以管理一个或者多个处于运行状态的服务。
这种界面化管理方式的一个弊端是所有在运行时修改的参数没有办法保存,因为在重启动之后,你所做的修改就会全部失效。
Axis2允许自己作为独立的应用来发布WebService,并提供了大量的功能和一个很好的模型,这个模型可以通过它本身的架构(modulararchitecture)不断添加新的功能。
有些开发人员认为这种方式对于他们的需求太过于繁琐。
这些开发人员会更喜欢CXF。
CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。
大多数配置都可以API来完成,替代了比较繁琐的XML配置文件,Spring的集成性经常的被提及,CXF支持Spring3.0和CXF'
sAPI和Spring的配置文件可以非常好的对应。
CXF强调代码优先的设计方式(code-firstdesign),使用了简单的API使得从现有的应用开发服务变得方便。
不过你选择Axis2还是CXF,你都可以从开源社区得到大量的帮助。
这两个框架都有商业公司提供服务,WSO2提供AXIS2的支持,Iona提供CXF的支持。
这两公司都有很活跃的开发者社区。
Axis2出现的时间较早,CXF的追赶速度快。
建议:
如果你需要多语言的支持,你应该选择AXIS2。
如果你需要把你的实现侧重JAVA并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。
如果你觉得这两个框架的新特性对于你并没有太大的用处,你会觉得Axis1也是不错的选择,你应该继续使用它,直到你有充分的理由去更换它。
三、CXF
3.1CXF+Spring+Tomcat实例
异构系统进行交互时,一种良好的方式便是调用WebService,本实基于Apache的CXF,为了方便起见特将PC终端JAVA版客户端与服务端在同一个工程下测试使用,实际项目中是不可能的,但是客户端却依赖于服务端的WebService接口,那么可以通过导出jar的方式。
最后,测试功后,将在Android手机应用程序中调用WebService的实例。
环境:
●Eclipse3.3
●JDK6
●Tomcat7
●CXF2.7
●Spring3.2
实例项目结构图:
其中为简单起见:
将apache-cxf-2.7.0\lib下所有jar复制到lib目录下,在项目发布时可精简。
精简后的jar包见下图:
(注CXF支持最新的Spring3.2)
代码:
1、在项目工程src相应包下建WebService接口类:
IXmlHandlerService.java
packagecom.writchie.webservice;
importjavax.jws.WebParam;
importjavax.jws.WebService;
@WebService
publicinterfaceIXmlHandlerService{
publicbooleanlogin(@WebParam(name="
username"
)Stringusername,@WebParam(name="
password"
)Stringpassword);
publicStringgenerateXmlByAppNo(StringappNo);
publicStringgetName(@WebParam(name="
)Stringusername,@WebParam(name="
//注:
参数必须加@WebParam(name="
xxx"
)
}
2、在项目工程src相应包下建WebService接口的实现类:
XmlHandlerServiceImpl.java
packagecom.writchie.webservice.impl;
importcom.writchie.webservice.IXmlHandlerService;
@WebService(endpointInterface="
com.writchie.webservice.IXmlHandlerService"
serviceName="
xmlHandlerService"
publicclassXmlHandlerServiceImplimplementsIXmlHandlerService{
@Override
publicbooleanlogin(Stringusername,Stringpassword){
booleanflag=false;
if("
admin"
.equalsIgnoreCase(username)&
&
"
1"
.equals(password))
flag=true;
returnflag;
}
publicStringgenerateXmlByAppNo(StringappNo){
Stringxml="
;
//dbfindbyappNo
xml=
"
<
?
xmlversion=\"
1.0\"
encoding=\"
UTF-8\"
>
rootElement>
+
DataBo>
code>
051204780500<
/code>
flowName>
测试<
/flowName>
id>
1<
/id>
linkName>
测试名称<
/linkName>
name>
吴理琪<
/name>
/DataBo>
051204780501<
2<
李四<
051204780502<
3<
wRitchie<
051204780503<
4<
王五<
"
/rootElement>
returnxml;
publicStringgetName(Stringusername,Stringpassword){
return"
您输入的用户名为:
+username+"
\t密码为:
"
+password;
3、在项目工程src建立服务端的spring的xml:
applicationContext-server.xml
xmlversion="
1.0"
encoding="
UTF-8"
beansxmlns="
http:
//www.springframework.org/schema/beans"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
jaxws="
//cxf.apache.org/jaxws"
xsi:
schemaLocation="
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans.xsd
//cxf.apache.org/jaxwshttp:
//cxf.apache.org/schemas/jaxws.xsd"
jaxws:
endpointid="
implementor="
com.writchie.webservice.impl.XmlHandlerServiceImpl"
address="
/xmlHandlerService"
/>
//❶
/beans>
4、在项目工程src建立客户端的spring的xml(可选):
applicationContext-client.xml
beanid="
xmlHandlerServiceClient"
class="
factory-bean="
clientFactory"
factory-method="
create"
/bean>
org.apache.cxf.jaxws.JaxWsProxyFactoryBean"
<
propertyname="
serviceClass"
value="
address"
//10.85.24.173:
9080/mwmp/cxf/xmlHandlerService"
//注:
此处与applicationContext-server.xml❶的名称xmlHandlerService一致
5、在项目工程src相应包下建客户端测试类(可选):
Test.java
packageclient;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassTest{
publicstaticvoidmain(String[]args){
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("
applicationContext-client.xml"
);
IXmlHandlerServicexmlHandlerService=(IXmlHandlerService)applicationContext.getBean("
booleanflag=xmlHandlerService.login("
"
System.out.println("
登录成功标记:
+flag);
Stringxml=xmlHandlerService.generateXmlByAppNo("
返回的xml:
+xml);
System.out.println(xmlHandlerService.getName("
吴理琪"
"
));
6、修改WebContent/WEB-INF/web.xml文件:
web.xml
web-appxmlns:
xmlns="
web="
id="
WebApp_ID"
version="
3.0"
display-name>
mwmp<
/display-name>
context-param>
param-name>
contextConfigLocation<
/param-name>
param-value>
classpath:
applicationContext-server.xml<
/param-value>
/context-param>
listener>
listener-class>
org.springframework.web.context.ContextLoaderListener<
/listener-class>
/listener>
servlet>
servlet-name>
CXFServlet<
/servlet-name>
servlet-class>
org.apache.cxf.transport.servlet.CXFServlet<
/servlet-class>
load-on-startup>
/load-on-startup>
/servlet>
servlet-mapping>
url-pattern>
/cxf/*<
/url-pattern>
/servlet-mapping>
welcome-file-list>
welcome-file>
/cxf<
/welcome-file>
index.html<
index.htm<
index.jsp<
default.html<
default.htm<
default.jsp<
/w