java框架复习——webservice

概述

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

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

既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!
在这里插入图片描述
WebService定义: 顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用

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

WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。

相关概念

XML

Extensible Markup Language -扩展性标记语言

XML,用于传输格式化的数据,是Web服务的基础。
namespace-命名空间。
xmlns=“http://itcast.cn” 使用默认命名空间。
xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。

WSDL

WebService Description Language – Web服务描述语言

通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。
服务端给客户端提供的一个说明书
约束了客户端和服务端之间通信的消息格式

SOAP

Simple Object Access Protocol - 简单对象访问协议

SOAP作为一个基于XML语言的协议用于有网上传输数据。
SOAP = 在HTTP的基础上+XML数据。
SOAP是基于HTTP的。
SOAP的组成如下:
	Envelope – 必须的部分。以XML的根元素出现。
	Headers – 可选的。
	Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

webservice服务网址

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

HTTP和SOAP的区别

webservice使用的协议是soap的协议,这种协议是在HTTP的协议上做的,和HTTP协议的区别主要是soap协议传输的内容是xml
在这里插入图片描述
下面的就相当于soap协议

WSDL解析

Wsdl文档从下往上读

  • service:服务访问点的集合元素,元素的name属性很重要,调用时需要使用。
  • port:服务访问点元素的name属性调用时需要使用, binding属性指定了服务访问点和服务类绑定元素
  • binding:把服务访问点和服务类绑定在一起,不需要关系元素的内部,要关心的就是他的type属性,这个属性指定了绑定的服务类xml元素(portType)
  • portType:具体的服务类 的元素,在portType内部有n个operation
  • operation:就是服务类中的方法
  • message:输入输出的消息体,分别对应着服务端接收的参数和响应的返回值,我们前面说了消息是以soap为协议,这个协议是http方式的请求,请求体式xml,这个xml不能随便写,需要约束使用schema。
  • types:对输入输出的消息体的约束schema。

在这里插入图片描述
下面就是一个webservice的wsdl页面
在这里插入图片描述
下面则是webservice的输入和返回参数的xml格式的schema
在这里插入图片描述
下面是调用的websevice方法的参数通过message用xml传输
在这里插入图片描述
下面则是调用的websevice方法的返回值通过message用xml传输
在这里插入图片描述

消息体

SOAP1.1请求消息体

可以看出就是一个http的post请求,只不过正文是xml格式的

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="	">
  <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>

通过jdk生成和调用webservice客户端代码

wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具。

当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码,服务器端用什么写的并不重要。

wsimport.exe位于JAVA_HOME\bin目录下
在这里插入图片描述
wsimport命令的相关参数

  • -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客户端代码及调用步骤

1.找一个空文件夹

通过命令行,切换到空文件夹目录,执行:

wsimport -s . -p  com.xxx.xx  http://192.168.15.82:8099/hello?wsdl

2.把代码拷贝到客户端的工程中

3.服务端的调用

	public static void main(String[] args) {
		//1.创建服务访问点集合对象
		PersonServiceService pss = new PersonServiceService();
		//2.获得服务点绑定的类,使用get加上port的名字(PersonServicePort), getPersonServicePort
		PersonService ps = pss.getPersonServicePort();
		//3.调用服务端的方法
		String result = ps.sayHello("周星刺");
		System.out.println(result);	
	}

jdk发布webservice服务

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

在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。JAX-WS是指Java Api for XML – WebService。与Web服务相关的类,都位于javax.xml.ws.*包中。

需要注意的是jdk发布的webservice只能支持实例类的服务,对于接口并没有很好的支持。

webservice相关的API

@WebService

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

Endpoint

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

在给定地址处针对指定的实现者对象创建并发布端点。

static Endpoint.publish(String address, Object implementor)

stop方法用于停止服务。

  1. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。
  2. 如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
  3. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
  4. 服务类中不能没有方法
  5. @WebMethod(exclude=true)屏蔽方法

发布示例

需要发布的服务
/**
 * 
 * webservice的服务类中必须至少有一个方法
 * jdk发布webservice服务的时候服务类上必须需要加@webService注解
 */
@WebService
public class PersonService {
	
	/**
	 * 1.不能是静态的
	 * 2.不能是final
	 * @param name
	 * @return
	 */
	public String sayHello(String name){
		return name + " hello";
	}
	
	@WebMethod(exclude=true)//可以禁用某个方法
	public String sayLove(String name){
		return name + "love you";
	}

}
发布webservice服务
	public static void main(String[] args) {
		//第一个参数:服务的地址,第二个参数服务类的对象
	/*	Endpoint.publish("http://192.168.15.82:8099/hello", new PersonService());
		System.out.println("发布成功");*/
		publishHell();
	}
	
	public static void publishHell(){
		Endpoint.publish("http://192.168.15.82:8098/hell", new PersonService());
		System.out.println("发布成功");
	}

其他调用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());
	}

复杂消息请求

实体类
public class Person {
	
	private int id;
	
	private String name;
	
	private String address;
	
	private int gender;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public int getGender() {
		return gender;
	}

	public void setGender(int gender) {
		this.gender = gender;
	}
}
需要发布的webservice服务
@WebService
public class PersonService {
	private List<Person> pList = new ArrayList<Person>();
	public void addPerson(Person p){
		pList.add(p);
	}
	public void deletePerson(int personId){
		for(int i = 0 ; i < pList.size(); i ++){
			Person p = pList.get(i);
			if(p.getId() == personId){
				pList.remove(p);
			}
		}
	}
	public List<Person> listPerson(){
		return pList;
	}
}
发布
	public static void main(String[] args) {
		
		Endpoint.publish("http://192.168.15.82:6666/person", new PersonService());
		System.out.println("发布成功");
	}

监听器

在这里插入图片描述
创建代理服务器
在这里插入图片描述
发布并调用webservice服务
在这里插入图片描述
查看消息
在这里插入图片描述

wsdl文档元素名称修改

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

@WebService(
portName="myHelloService",修改端口名字
serviceName="HelloServices",修改服务访问点集合名字
name="HelloService",修改服务类的名字
targetNamespace="hello.rl.com" 修改命名空间名字
)


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

SOAP12和SOAP11的区别

消息体

其中标红的就是区别所在,可以说区别很小,而且在使用中意义不大
在这里插入图片描述
在这里插入图片描述

客户端和服务端

可以看到soap可以向下兼容,soap12的服务端可以接收客户端发送的soap11和soap12的消息体。

但是客户端发送的soap12的消息体只能由服务端soap12接收。

所以建议发布服务的时候使用SOAP1.2,客户端调用的时候使用SOAP1.1。
在这里插入图片描述

发布服务

在使用@webservice发布服务时默认使用的是soap11,如果想要使用soap12发布服务必须得配置一些参数

可以使用@BindingType指定发布的服务的soap类型

@WebService
@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)
public class HelloService {

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

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上面
  • cxf可以在接口上加@webservice注解,对接口的支持比较好

在这里插入图片描述
在这里插入图片描述
目录的结构详情如下:

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 的文件来详细了解示例的编译与运行的步骤。

环境搭建

需要jdk的支持
在这里插入图片描述
配置环境变量CXF_HOME
在这里插入图片描述
需要ant的支持,配置ANT_HOME
在这里插入图片描述
配置环境变量CATALINA_HOME
在这里插入图片描述
配置环境变量Path

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

配置环境变量CLASSPATH

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

cxf示例

1.创建java项目

2.引入所有依赖包

3.创建服务类

@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";
	}
}

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

5.调用webservice服务

wsdl2java(重要)

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

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

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

  • -d参数,指定代码生成的目录。
  • -p参数,指定生成的新的包结构。

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

示例:
在这里插入图片描述

JaxWsServerFactoryBean

JaxWsServerFactoryBean和ServerFactoryBean的区别

ServerFactoryBean

  • 服务类上不需要加注解
  • 服务类中没有发布的方法不会报错
  • 缺点:生成的wsdl的文档的命名不规范,很重要

JaxWsServerFactoryBean

  • 发布的服务类上必须要加@WebService
  • 服务类中没有发布的方法不会报错但是wsdl无效
  • 生成的wsdl的文档是规范的
	public static void publishWSWithServerFactoryBean(){
		//创建cxf发布的服务对象
		ServerFactoryBean sfb = new ServerFactoryBean();
		//设置服务的类
		sfb.setServiceClass(PersonService.class);
		//设置服务地址
		sfb.setAddress("http://localhost:5555/hello");
		//设置服务类对象
		//sfb.setServiceBean(new PersonService());
		//发布
		sfb.create();
	}
	
	public static void publishWSWithJaxWsServerFactoryBean(){
		//创建cxf发布的服务对象
		JaxWsServerFactoryBean sfb = new JaxWsServerFactoryBean();
		//设置服务的类
		sfb.setServiceClass(PersonService1.class);
		//设置服务地址
		sfb.setAddress("http://localhost:6666/hello");
		//设置服务类对象
		sfb.setServiceBean(new PersonService1());
		//发布
		sfb.create();
	}
使用JaxWsServerFactoryBean调用接口服务类

1.创建服务接口

@WebService//注意注解加在接口上
public interface HI {
	public String sayHi(String name);
}

2.创建接口实现类

public class HIImpl implements HI {
	@Override
	public String sayHi(String name) {
		// TODO Auto-generated method stub
		return name + " hello";
	}
}

3.创建发布服务类

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();
	}

4.生成客户端代码
在这里插入图片描述
5.调用客户端

public class Client {
	public static void main(String[] args) {
		HIService hs = new HIService();
		HI serviceClass = hs.getHIPort();
		System.out.println(serviceClass.sayHi("张三"));
	}
}
拦截输入输出消息
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();
	}
}

在web项目中创建类的cxf服务(重点)

1.创建web项目

2.导入所有包

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

4.创建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>

5.配置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>

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

1.创建服务接口在接口上加@webservice

2.创建服务接口的实现类

3.在web.xml中配置CXFServlet

4.配置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>

5.使用wsdl2java生成客户端代码

6.调用webservice

修改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>

使用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");
					}
				})
		})
	})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值