Web-第三十一天 WebService学习【悟空教程】

Web-第三十一天 WebService学习【悟空教程】_java


Webservice  服务学习

1.认识webservice

什么是服务

简单的网络应用使用单一语言写成,它的唯一外部程序就是它所依赖的数据库。大家想想是不是这样呢?

Web-第三十一天 WebService学习【悟空教程】_xml_02

  • 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。

  • 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。

  • 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!


复杂的网络应用

更为复杂的应用除了自己内部调用之外有可能还会对外部程序提供服务,更或是调用其他应用。

Web-第三十一天 WebService学习【悟空教程】_java_03 

WebService定义: 顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。

Webservice理解:我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下服务器上的一段代码而已。WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。


2.Webservice调用

2.1学习webservice调用的预备知识

名词1:XML. Extensible Markup Language -扩展性标记语言 

XML,用于传输格式化的数据,是Web服务的基础。

namespace-命名空间。

xmlns=“http://javahelp.com.cn” 使用默认命名空间。

xmlns:javahelp=“http://javahelp.com.cn”使用指定名称的命名空间。


名词2:WSDL – WebService Description Language – Web服务描述语言。

通过XML形式说明服务在什么地方-地址。

通过XML形式说明服务提供什么样的方法 – 如何调用。


名词3:SOAP-Simple Object Access Protocol(简单对象访问协议)

SOAP作为一个基于XML语言的协议用于有网上传输数据。

SOAP = 在HTTP的基础上+XML数据。

SOAP是基于HTTP的。

SOAP的组成如下:

Envelope – 必须的部分。以XML的根元素出现。

Headers – 可选的。

Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。


2.2 webservice服务网址

Webservice服务网站:http://www.webxml.com.cn


2.3 WSDL解析

Wsdl文档从下往上读

Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。(入参和出参的数据类型) 
Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。 
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。 
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。 
Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。 
Port - 定义为webservice单个服务访问点。 
Service相关服务访问点的集合。

Web-第三十一天 WebService学习【悟空教程】_xml_04 

2.4生成客户端代码

  • wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.

  • wsimport.exe位于JAVA_HOME\bin目录下.

  • 常用参数为:-d<目录>  - 将生成.class文件。默认参数。

-s<目录>  - 将生成.java文件和class文件。

-p<生成的新包名> -将生成的类,放于指定的包下。

 wsdlurl - http://server:port/service?wsdl,必须的参数。

示例:

C:/> wsimport –s . http://192.168.0.100/one?wsdl 

注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。

如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。

调用webservice步骤

  • 打开WSDL文档

  • 从下往上读WSDL文档,先找到Services(服务访问点集合),根据Services里面binding属性找到binding元素,再根据binding元素的type属性找到绑定的portType(服务类)

  • 根据WSDL的地址生成客户端代码wsimport -s . -p com.rl.trans d:/wsCode/EnglishChinese.wsdl

  • 把客户端代码拷贝到项目中

  • 创建服务访问点集合对象

  • 根据服务访问点获得服务类

  • 调用服务类的方法

2.5消息体

  • SOAP1.1请求消息体

POST /WebServices/MobileCodeWS.asmx HTTP/1.1

Host: webservice.webxml.com.cn

Content-Type: text/xml; charset=utf-8

Content-Length: length

SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">

      <mobileCode>string</mobileCode>

      <userID>string</userID>

    </getMobileCodeInfo>

  </soap:Body>

</soap:Envelope>

  • SOAP1.1相应消息体 

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>

    </getMobileCodeInfoResponse>

  </soap:Body>

</soap:Envelope>


3.jdk发布webservice服务

注意:用Jdk1.6.0_21以后的版本发布一个WebService服务.

说明:在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。JAX-WS是指Java Api for XML – WebService.

与Web服务相关的类,都位于javax.xml.ws.*包中。

主要类有:

@WebService - 它是一个注解,用在类上指定将此类发布成一个webservice服务.

Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。Endpoint是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。

static Endpoint.publish(String address, Object implementor) 在给定地址处针对指定的实现者对象创建并发布端点。stop方法用于停止服务。

其他注意事项:

  • 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。

  • 如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。

  • 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。

  • 服务类中不能没有方法

  • @WebMethod(exclude=true)屏蔽方法

使用myeclipse查看消息体

Web-第三十一天 WebService学习【悟空教程】_xml_05 

4.其他调用webservice的方式

  • 使用ajax调用

var ​xhr;

function ​invoke(){

if​(window.ActiveXObject){

xhr = ​new ​ActiveXObject("Microsoft.XMLHTTP");

}​else​{

xhr = ​new ​XMLHttpRequest();

}

//指定请求地址

var ​url = "http://127.0.0.1:7777/hello?wsdl";

//定义请求类型和地址和异步

xhr.open("POST", url, ​true​);

//设置Content-Type

xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");

//指定回调方法

xhr.onreadystatechange = back;


var ​textVal = document.getElementById("mytext").value;

//组装消息体的数据

var ​data = \'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.hm.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'

+\'<soapenv:Body>\'

+\'<q0:sayHello>\'

+\'<arg0>\'+textVal+\'</arg0>\'

+\'</q0:sayHello>\'

+\'</soapenv:Body>\'

+\'</soapenv:Envelope>\';

xhr.send(data);


}

function ​back(){

if​(xhr.readyState == 4){

if​(xhr.status == 200){

var ​doc = xhr.responseXML;

alert(doc);

alert(xhr.responseText);

var ​tag = doc.getElementsByTagName("return")[0];

alert(tag)

}

}

}

  • 通过URLConnection调用

//创建url地址

URL url = ​new​ URL("http://192.168.1.104:8080/hello");

//打开连接

URLConnection conn = url.openConnection();

//换成HttpURL

HttpURLConnection httpConn = (HttpURLConnection) conn;

//打开输入输出的开关

httpConn.setDoInput(​true​);

httpConn.setDoOutput(​true​);

//设置请求方式

httpConn.setRequestMethod("POST");

//设置请求的头信息

httpConn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");

//拼接请求消息

String data = "<soapenv:Envelope xmlns:soapenv=" +

"\"http://schemas.xmlsoap.org/soap/envelope/\" " +

"xmlns:q0=\"http://server.rl.com/\" " +

"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +

"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"

+"<soapenv:Body>"

+"<q0:sayHello>"

+"<arg0>renliang</arg0> "

  +"</q0:sayHello>"

  +"</soapenv:Body>"

  +"</soapenv:Envelope>";

//获得输出流

OutputStream out = httpConn.getOutputStream();

//发送数据

out.write(data.getBytes());

//判断请求成功

if​(httpConn.getResponseCode() == 200){

//获得输入流

InputStream in = httpConn.getInputStream();

//使用输入流的缓冲区

BufferedReader reader = ​new​ BufferedReader(​new​ InputStreamReader(in));

StringBuffer sb = ​new​ StringBuffer();

String line = ​null​;

//读取输入流

while​((line = reader.readLine()) != ​null​){

sb.append(line);

}

//创建sax的读取器

SAXReader saxReader = ​new​ SAXReader();

//创建文档对象

Document doc = saxReader.read(​new​ StringReader(sb.toString()));

//获得请求响应return元素

List<Element> eles = ​doc.selectNodes("//return")​;

for​(Element ele : eles){

System.​out​.println(ele.getText());

}


6.复杂消息请求

@WebService

public​ ​class​ TestComplexServer {

List<Person> pList = ​new​ ArrayList<Person>();

public​ ​void​ addPerson(Person person){

pList.add(person);

}

public​ List<Person> getPersonList(){

return​ pList;

}

public​ ​static​ ​void​ main(String[] args) {

Endpoint.​publish​("http://192.168.1.104:8888/person", ​new​ TestComplexServer());

}

}


7.监听器

用于查看请求和相应的消息

Web-第三十一天 WebService学习【悟空教程】_xml_06


8.wsdl文档元素名称修改

自动生成的文档的名字有时不规范,可以手动进行修改。

@WebService(

portName="myHelloService",修改端口名字

serviceName="HelloServices",修改服务访问点集合名字

name="HelloService",修改服务类的名字

targetNamespace="hello.rl.com" 修改命名空间名字

)


@WebResult(name="sirHello")修改返回值的元素的父标签名字

@WebParam(name="sir")修改传入参数的元素的父标签名字


9.什么是cxf

Apache CXF = Celtix + Xfire

支持多种协议:

  • SOAP1.1,1,2

  • HTTP

  • CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)

  • 并可以与Spring进行快速无缝的整合

  • 灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。

Web-第三十一天 WebService学习【悟空教程】_xml_07

Web-第三十一天 WebService学习【悟空教程】_xml_08

Web-第三十一天 WebService学习【悟空教程】_xml_09

bin(目录) 
bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具(可执行命令) 

docs(目录) 
​CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。 

etc(目录) 
​包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。 

lib(目录) 
​lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可 
以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。 
其中 cxf-2.0.2-incubator.jar 是 CXF 框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar 是列表清单文件 manifest jar 。 


以下的 jar 包是所有 CXF 项目所必需的:​ ​
cxf.jar
​ ​
commons-logging.jar
​ ​
geronimo-activation.jar (Or the Sun equivalent)
​ ​
geronimo-annotation.jar (Or the Sun equivalent)
​ ​
geronimo-javamail.jar (Or the Sun equivalent)
​ ​
neethi.jar
​ ​
jaxb-api.jar
​ ​
jaxb-impl.jar
​ ​
stax-api.jar
​ ​
XmlSchema.jar
​ ​
wstx-asl.jar
​ ​
xml-resolver.jar
​ ​

对于 Java2WSDL 和 WSDL2Java,除了必需的之外,还需要再增加如下 jar 包:​ ​
jaxb-xjc.jar
​ ​
veliocity.jar
​ ​
velocity-dep.jar
​ ​

为了支持 JAX-WS ,除了必需的之外,还需要再增加如下 jar 包:​ ​
jaxws-api.jar
​ ​
saaj-api.jar
​ ​
saaj-impl.jar
​ ​
asm.jar (可选的,但是可以提升包装类型的性能)
​ ​

为了支持 XML 配置,除了必需的之外,还需要再增加如下 jar 包:aopalliance.jar​ ​
spring-beans.jar
​ ​
spring-context.jar
​ ​
spring-core.jar
​ ​
spring.web.jar
​ ​

为了独立的 HTTP 服务支持,除了必需的之外,还需要再增加如下 jar 包:geronimo-servlet.jar​ ​
jetty.jar
​ ​
jetty-sslengine.jar
​ ​
jetty-util.jar
​ ​
sl4j.jar & sl4j-jdk14.jar (可选的,但是可以提升日志 logging)
​ ​

为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包:​ ​
jaxen.jar
​ ​
jdom.jar
​ ​
stax-utils.jar
​ ​

为了支持 WS-Security ,除了必需的之外,还需要再增加如下 jar 包:bcprov-jdk14.jar​ ​
wss4j.jar
​ ​
xalan.jar
​ ​
xmlsec.jar
​ ​

为了支持 HTTP Binding ,除了必需的之外,还需要再增加如下 jar 包:jra.jar​ ​
jettison.jar (仅为 JSON 服务所需的)
​ ​

licenses(目录)​ ​
列表了引用第三方 jar 包的相关许可协议。
​ ​

modules(目录)​ ​
modules 目录中包含了 CXF 框架根据不同特性分开进行编译的二进制包文件。发布基于 CXF 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 lib 目
​ ​录中的 cxf-2.0.2-incubator.jar 文件。​ ​

samples(目录)​ ​
samples 目录中包含了所有随 CXF 二进制包发布的示例,包含这些示例的源代码和相关 Web 应用配置文件,可以方便地用 Ant 来编译运行测试这些示例,来了解 CXF 的开发和
​ ​

使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。
​ 


10.环境搭建

JAVA_HOME  需要jdk的支持

Web-第三十一天 WebService学习【悟空教程】_java_10CXF_HOME

Web-第三十一天 WebService学习【悟空教程】_xml_11

ANT_HOME

Web-第三十一天 WebService学习【悟空教程】_xml_12CATALINA_HOME

Web-第三十一天 WebService学习【悟空教程】_xml_13 

Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin

CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes


11.运行cxf例子

1.拷贝例子中的common_build.xml和java_first_pojo到没有中文目录的下

2. 执行ant server

Web-第三十一天 WebService学习【悟空教程】_xml_14

3.执行ant client

Web-第三十一天 WebService学习【悟空教程】_jar_15

4. 执行ant war

Web-第三十一天 WebService学习【悟空教程】_jar_16

5.​ ​执行ant deploy –Dtomcat=true将项目发布到tomcat的服务器上。

Web-第三十一天 WebService学习【悟空教程】_jar_17

发布到tomcat中:访问http://localhost:8080/helloworld/services/hello_world?wsdl

服务路径由cxf-servlet.xml来配置 

6.卸载部署包

停止tomcat后卸载应用:ant undeploy –Dtomcat=true

Web-第三十一天 WebService学习【悟空教程】_xml_18

7.清理构建目录

ant clean

Web-第三十一天 WebService学习【悟空教程】_java_19 

12.实现cxf第一个示例

  • 创建java项目

  • 引入所有依赖包

  • 创建服务类

用两个不同的类发布应用: 

ServerFactoryBean(不需要使用@webservice)   生成的文档不规范,不建议使用

JaxWsServerFactoryBean(建议使用此类,需要使用@webservice) 生成的文档不规范,可以发布SOAP1.1,SOAP1.2的协议,当cxf的服务类中没有方法时也可以发布成功,不报错。如果使用SOAP1.2需要用@bindType注解指定

当使用SOAP1.2时wsimport命令失效,需要使用cxf的wsdl2java

建议:发布服务的时候使用SOAP1.2,客户端调用的时候使用SOAP1.1


@WebService

@BindingType(value=javax.xml.ws.soap.SOAPBinding.​SOAP11HTTP_BINDING​)

public​ ​class​ HelloService {


public​ ​static​ ​void​ main(String[] args) {

//创建服务工厂对象

//ServerFactoryBean sfb = ​new​ ServerFactoryBean();

JaxWsServerFactoryBean sfb = ​new​ JaxWsServerFactoryBean ();

//设置服务地址

sfb.setAddress("http://127.0.0.1:7777/hello");

//设置服务类

sfb.setServiceClass(HelloService.​class​);

//设置服务对象的实例

sfb.setServiceBean(​new​ HelloService());

//发布服务

sfb.create();

}


public​ String sayHello(String name){

return​ name+ " hello";

}

  • 通过wsimport(SOAP1.1)生成客户端代码

  • 调用webservice

13.wsdl2java

在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。

先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。既可以生成SOAP1.1也可以生成SOAP1.2

此工具位于cxf_home/bin目录下。参数与wsimport有所不同。

它包含以下参数:

  • -d参数,指定代码生成的目录。

  • -p参数,指定生成的新的包结构。

需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。

在命令行执行:

wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl

Web-第三十一天 WebService学习【悟空教程】_xml_20 

SOAP1.2消息

POST /WebServices/MobileCodeWS.asmx HTTP/1.1

Host: webservice.webxml.com.cn

Content-Type: application/soap+xml; charset=utf-8

Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">

  <soap12:Body>

    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">

      <mobileCode>string</mobileCode>

      <userID>string</userID>

    </getMobileCodeInfo>

  </soap12:Body>

</soap12:Envelope>

HTTP/1.1 200 OK

Content-Type: application/soap+xml; charset=utf-8

Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">

  <soap12:Body>

    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>

    </getMobileCodeInfoResponse>

  </soap12:Body>

</soap12:Envelope>


14.使用JaxWsServerFactoryBean调用接口服务类

  • 创建服务接口

@WebService//注意注解加在接口上

public​ ​interface​ HI {

public​ String sayHi(String name);

}

  • 创建接口实现类

public​ ​class​ HIImpl ​implements​ HI {

@Override

public​ String sayHi(String name) {

// ​TODO​ Auto-generated method stub

return​ name + " hello";

}


}

  • 创建发布服务类

public​ ​static​ ​void​ main(String[] args) {

JaxWsServerFactoryBean jf = ​new​ JaxWsServerFactoryBean();

jf.setAddress("http://127.0.0.1:5555/hi");

jf.setServiceClass(HI.​class​);

jf.setServiceBean(​new​ HIImpl());

jf.create();

}

  • 生成客户端代码

Web-第三十一天 WebService学习【悟空教程】_xml_21

  • 调用客户端

public​ ​class​ Client {


public​ ​static​ ​void​ main(String[] args) {

HIService hs = ​new​ HIService();

HI serviceClass = hs.getHIPort();

System.​out​.println(serviceClass.sayHi("张三"));

}

}


15.拦截输入输出消息

LoggingInInterceptor – 信息输入时的拦截器 –请求

LoggingOutInterceptor –信息输出时的拦截器-响应

public​ ​class​ InterServer {


public​ ​static​ ​void​ main(String[] args) {

JaxWsServerFactoryBean jf = ​new​ JaxWsServerFactoryBean();

jf.getInInterceptors().add(​new​ LoggingInInterceptor());

jf.getOutInterceptors().add(​new​ LoggingOutInterceptor());

jf.setAddress("http://127.0.0.1:5555/hi");

jf.setServiceClass(HI.​class​);

jf.setServiceBean(​new​ HIImpl());

jf.create();

}

}


16.在web项目中创建类的cxf服务

  • 创建web项目

  • 导入所有包

  • 创建服务类,必须指定注解@webService

  • 配置web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <servlet>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

    <session-config>

        <session-timeout>60</session-timeout>

    </session-config>

</web-app>

  • 创建cxf的核心配置文件cxf-servlet.xml

<?xml version=​"1.0"​ encoding=​"UTF-8"​?>

<beans xmlns=​"http://www.springframework.org/schema/beans"

xmlns:xsi=​"http://www.w3.org/2001/XMLSchema-instance"​ xmlns:jaxws=​"http://cxf.apache.org/jaxws"

xmlns:jaxrs=​"http://cxf.apache.org/jaxrs"​ xmlns:cxf=​"http://cxf.apache.org/core"

xsi:schemaLocation=​"http://www.springframework.org/schema/beans

          http://www.springframework.org/schema/beans/spring-beans.xsd

            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd

            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd

            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"​>

<!-- 引入CXF Bean定义如下,早期的版本中使用 -->

<import resource=​"classpath:META-INF/cxf/cxf.xml"​ />

<import resource=​"classpath:META-INF/cxf/cxf-extension-soap.xml"​ />

<import resource=​"classpath:META-INF/cxf/cxf-servlet.xml"​ />

<jaxws:endpoint id=​"hello"​ address=​"/hello"​ implementor=​"com.rl.cxf.web.server.HelloService"​>

<jaxws:outInterceptors>

<bean class=​"org.apache.cxf.interceptor.LoggingInInterceptor"​></bean>

</jaxws:outInterceptors>

<jaxws:inInterceptors>

<bean class=​"org.apache.cxf.interceptor.LoggingOutInterceptor"​></bean>

</jaxws:inInterceptors>

</jaxws:endpoint>

</beans>


17.修改cxf-servlet.xml的位置和文件名

  • 第一种方式

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <servlet>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>


        <init-param>

<param-name>config-location</param-name>

<param-value>classpath:cxf.xml</param-value>

</init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/services/*</url-pattern>

    </servlet-mapping>


</web-app>


  • 第二种方式

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<listener>

     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <context-param>

     <param-name>contextConfigLocation</param-name>

     <param-value>classpath:cxf.xml</param-value>

    </context-param>

     <servlet>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

</web-app>


18.在web项目中创建接口的cxf服务

  • 创建服务接口在接口上加@webservice

  • 创建服务接口的实现类

  • 在web.xml中配置CXFServlet

  • 配置cxf-servlet.xml

<jaxws:server id=​"bye"​ address=​"/bye"​ serviceClass=​"com.rl.cxf.web.inter.ByeInter"​>

<jaxws:serviceBean>

<bean class=​"com.rl.cxf.web.inter.ByeInterImpl"​></bean>

</jaxws:serviceBean>

<jaxws:outInterceptors>

<bean class=​"org.apache.cxf.interceptor.LoggingInInterceptor"​></bean>

</jaxws:outInterceptors>

<jaxws:inInterceptors>

<bean class=​"org.apache.cxf.interceptor.LoggingOutInterceptor"​></bean>

</jaxws:inInterceptors>

</jaxws:server>

  • 使用wsdl2java生成客户端代码

  • 调用webservice


19.使用jquery调用cxf

$(​function​(){

$("#mybutton").click(​function​(){

var ​data = \'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.web.cxf.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'

  +\'<soapenv:Body>\'

  +\'<q0:sayHello>\'

  +\'   <arg0>sss</arg0>\'

  +\' </q0:sayHello>\'

  +\'</soapenv:Body>\'

  +\'</soapenv:Envelope>\';


$.ajax({

url:\'http://localhost:8080/cxf-web-server/services/hello\',

type:\'post\',

dataType:\'xml\',

contentType:\'text/xml;charset=UTF-8\',

data:data,

success:​function​(responseText){

alert($(responseText).find(\'return\').text());

},

error:​function​(){

alert("error");

}

})

})

})


20.jquery调用cxf的ws小练习

实现添加人,和查询人。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

<script type="text/javascript" src="js/jquery-1.6.2.js"></script>

<script type="text/javascript">

$(function(){


//保存用户

$("#save").click(function(){

var name = $("#name").val();

var age = $("#age").val();

var gender = $("#gender").val();

$.ajax({

url:"http://localhost:8080/cxf_web_server/services/person",

type:"POST",

dataType:"xml",

contentType:"text/xml;charset=UTF-8",

data:\'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:q0="http://server.javahelp.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'

+\'<soapenv:Body>\'

+\'<q0:addPerson>\'

+\'<arg0>\'

+\'<age>\'+age+\'</age> \'

+\'<gender>\'+gender+\'</gender> \'

+\'<name>\'+name+\'</name> \'

+\'</arg0>\'

+\'</q0:addPerson>\'

+\'</soapenv:Body>\'

+\'</soapenv:Envelope>\',

success:function(data){

alert(\'保存成功\');

},

error:function(){

alert("system error");

}

});

});


//查询用户

$("#query").click(function(){


$.ajax({

url:"http://localhost:8080/cxf_web_server/services/person",

type:"POST",

dataType:"xml",

contentType:"text/xml;charset=UTF-8",

data:\'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:q0="http://server.javahelp.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'

+\' <soapenv:Body>\'

+\' <q0:queryPersonAll /> \'

+\' </soapenv:Body>\'

+\' </soapenv:Envelope>\',

success:function(data){

var doc = $(data).find(\'return\');

$("#mydiv").empty();

var result = \'\';

doc.each(function(){

var name = $(this).find(\'name\').text();

var age = $(this).find(\'age\').text();

var gender = $(this).find(\'gender\').text();


result = result + name + "   "+ age + "   " + gender + "<br>";


});

$("#mydiv").append(result);


},

error:function(){

alert("system error");

}

});

});

});

</script>

</head>

<body>

姓名:<input id="name" type="text"><br>

年龄:<input id="age" type="text"><br>

性别:<input id="gender" type="text"><br>

<input id="save" type="button" value="保存"><input id="query" type="button" value="查询"><br>

<div id="mydiv" style="width:300px;height:300px; border:1px solid;">

</div>

</body>

</html>


Web-第三十一天 WebService学习【悟空教程】_java_22

Web-第三十一天 WebService学习【悟空教程】_jar_23Web-第三十一天 WebService学习【悟空教程】_java_24

长按指纹,识别二维码,一键关注Java,大数据

Web-第三十一天 WebService学习【悟空教程】_jar_25Web-第三十一天 WebService学习【悟空教程】_java_24

长按指纹,识别二维码,一键关注Python

Web-第三十一天 WebService学习【悟空教程】_java_27Web-第三十一天 WebService学习【悟空教程】_java_24

长按指纹,识别二维码,一键关注九点编程