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

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

Webservice 服务学习

1.认识webservice

什么是服务

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

  • 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。
  • 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。
  • 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!

复杂的网络应用

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

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- 相关服务访问点的集合。

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查看消息体

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.监听器

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

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上面。

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的支持

CXF_HOME

ANT_HOME

CATALINA_HOME

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

3.执行ant client

4. 执行ant war

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

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

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

6.卸载部署包

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

7.清理构建目录

ant clean

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

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();
}
  • 生成客户端代码
  • 调用客户端
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>

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏weixuqin 的专栏

使用代理爬取微信文章

3927
来自专栏Kevin-ZhangCG

[ Java面试题 ]JavaWeb篇

3628
来自专栏软件开发 -- 分享 互助 成长

linux下进程相关操作

一、定义和理解 狭义定义:进程是正在运行的程序的实例。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 进程的概念主要有两点: 第一...

2475
来自专栏SDNLAB

POF技术分享(二):POF交换机源码结构

一:函数调用关系图 POF交换机先会进行基本配置的初始化、交换机资源初始化等,然后开启交换机与控制器通信进程,建立连接进行通信,最后开启基于流表的数据包匹配与处...

3767
来自专栏北京马哥教育

29 条运维工程师必会实用 Linux 命令

虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单...

3169
来自专栏步履前行

Spring Retry

  在我们的业务场景中,经常要调用其他的API来获取信息,比如我们的业务场景需要依赖个人信息来处理,这个时候调用个人信息服务的API,但是由于可能同一时段多方在...

3923
来自专栏Elasticsearch实验室

Elasticsearch 底层系列之分片恢复解析

我们是基础架构部,腾讯云 CES/CTSDB 产品后台服务的支持团队,我们拥有专业的ES开发运维能力,为大家提供稳定、高性能的服务,欢迎有需求的童鞋接入...

7545
来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 + 项目准备

REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络...

1.2K6
来自专栏张善友的专栏

利用Windows性能计数器(PerformanceCounter)监控

一、概述 性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种...

3399
来自专栏aoho求索

Spring Cloud Bus中的事件的订阅与发布(二)

在之前的文章Spring Cloud Bus中的事件的订阅与发布(一)介绍了消息总线的相关事件。本文主要介绍消息总线的事件监听器以及消息的订阅与发布。 事件监听...

4587

扫码关注云+社区

领取腾讯云代金券