WebService

WebService通过HTTP POST方式接受客户的请求

WebService与客户端之间一般使用SOAP协议传输XML数据

它本身就是为了跨平台或跨语言而设计的

网络上提供的服务:

http://webxml.com.cn/



XML 版 HTTP

SOAP 简单对象访问协议

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

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

SOAP是基于HTTP的。

SOAP的组成如下:

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

Headers – 可选的。

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


WSDL web服务描述语言

就是一个文档 用于描述当前服务的一些信息

服务名称 service 标签的name

服务的发布地址  address 标签的location

服务提供懂得方法 operatioin 标签的name

方法的参数类型 

方法的返回值类型


发布一个WebService服务

第一步:创建一个Java项目

第二步:创建一个类,加入Webservice注解

第三步:提供一个方法sayHello

第四步:在main方法中调用jdk提供的发布服务的方法

第五步:访问服务的wsdl文档(服务的发布地址+?wsdl)http://172.29.20.5:8080/hello?wsdl

package webservice;

import javax.jws.WebService;

import javax.xml.ws.Endpoint;

@WebService

public class HolleWebService {

public String sayHello(String name,int i){

System.out.println("服务端的sayHello方法被调用了。。。。");

return "helle" + name;

}

public static void main(String[] args) {

String address = "http://172.29.20.5:8080/hello";

Object implementor = new HolleWebService();

Endpoint.publish(address, implementor);

}

}


jdk中wsimport命令使用

作用:解析wsdl文件,生成客户端本地代码

 

客户端调用

使用wsimport命令解析wsdl文件生成本地代码

通过本地代码创建一个代理对象

通过代理对象实现远程调用

package webservice;


public class App {

public static void main(String[] args) {

HolleWebServiceService holleWebServiceService = new HolleWebServiceService();

HolleWebService proxy = holleWebServiceService.getHolleWebServicePort();

String sayHello = proxy.sayHello("stevezong", 1);

System.out.println(sayHello);

}

}




CXF


支持多种协议:

SOAP1.1,1.2

XML/HTTP

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

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

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

CXF 服务端 开发 spring + cxf

第一步:创建动态web项目

第二步:导入CXF相关jar包

第三步:在web.xml中配置CXF框架提供的一个Servlet

第四步:在类路径下提供cxf.xml

第五步:开发一个接口和实现类

第六步:在cxf.xml中注册服务

2

maven

3.0.1

org.apache.cxf

cxf-rt-frontend-jaxws

${cxf.version}

org.apache.cxf

cxf-rt-transports-http

${cxf.version}

org.apache.cxf

cxf-rt-transports-http-jetty

${cxf.version}




3

wel

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

version="2.5">

cxf

index.html

index.htm

index.jsp

default.html

default.htm

default.jsp


cxf

org.apache.cxf.transport.servlet.CXFServlet

config-location

classpath:cxf.xml

1

cxf

/service/*





3

cxf

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

xmlns:jaxws="http://cxf.apache.org/jaxws"

xmlns:soap="http://cxf.apache.org/bindings/soap"

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

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

http://cxf.apache.org/bindings/soap 

http://cxf.apache.org/schemas/configuration/soap.xsd

http://cxf.apache.org/jaxws 

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



4

java

package com.stevezong.cxf;


import javax.jws.WebService;


@WebService

public interface HelloService {

public String sayHello(String name);

}


package com.stevezong.cxf;


public class HelloServiceImpl implements HelloService{


public String sayHello(String name) {

System.out.println("cxf的sayHello");

return name + " name ";


}






CXF 客户端 


方式一:使用jdk提供的wsimport命令生成本地代码完成调用


方式二:使用CXF提供的方式(重点)

第一步:创建Java项目并导入CXF相关jar包

第二步:使用wsimport或者CXF提供wsdl2java生成本地代码,只需要生成接口文件

第三步:将接口文件复制到项目中

第四步:提供spring配置文件,注册客户端代理对象

第五步:读取spring配置文件,创建spring工厂,从工厂中获取代理对象,实现远程调用

1

maven

导包

2

C:\Program Files\Java\jdk1.8.0_111\bin>wsimport.exe -s \test http://127.0.0.1:80

80/cxf/service/cfxService?wsdl

正在解析 WSDL...

正在生成代码...

正在编译代码...


3

package com.stevezong.cxf;


import javax.jws.WebService;


@WebService

public interface HelloService {

public String sayHello(String name);

}

4

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

xmlns:jaxws="http://cxf.apache.org/jaxws"

xmlns:soap="http://cxf.apache.org/bindings/soap"

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

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

http://cxf.apache.org/bindings/soap 

http://cxf.apache.org/schemas/configuration/soap.xsd

http://cxf.apache.org/jaxws 

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


5

package cxf;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test2 {

public static void main(String[] args) {

ApplicationContext ctx  = new ClassPathXmlApplicationContext("cxf2.xml");

HelloService proxy =  (HelloService) ctx.getBean("myClient");

System.out.println(proxy.sayHello("stevezong"));

}

}