一、开发规范
JAVA 中共有三种WebService 规范,JAX-WS、JAX-RS、JAXM&SAAJ(很少用)。
服务端的规范:
-
JAX-WS
规范的服务:仅支持传输XML数据格式,有SOAP协议(如XML格式,有head、body等)和WSDL说明书。 -
JAX-RS
规范的服务:支持XML和JSON格式的传输,只有WADL说明书,没有协议约束。
JAX-RS服务与常见的Controller服务用法区别:暂时看来JAX-RS有个wadl说明书,而Controller没有,既然这样谁还用什么JAX-RS?
客户端的实现:
可以有多种途径,一般使用HTTP工具类调用,这样可以适应 Web-WS Services、Web-RS Services和Controller这样三种形式的Web Services。
第一种方式:使用 JDK 的工具生成服务端代码,在本地调用即可。仅支持SOAP1.1。
wsimport -s . -p com.ws.transHello http://127.0.0.1:8081/hello?wsdl
该种方式,会分两次调用服务端,第一次是GET请求,获取WSDL文件说明书;第二次是POST请求,发送客户端请求。
第二和第三种方式,是直接发送请求。前提已知WSDL。
第二种方式:HttpURLConnection
。
第三种方式:HttpClient
。建议采用soap1.1方式调用。
第四、五、六、七种是JDK自带的不需要引入其他框架。
第四种:Payload方式
第五种:Message方式
第六种:Proxy方式
第七种:RPC方式
二、ApacheCXF发布JAX-WS和JAX-RS服务
1.核心pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.4.7</version>
</dependency>
<!--jaxrs引入的包开始-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-service-description</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.1.1</version>
</dependency>
<!--jaxrs引入的包结束-->
</dependencies>
2.CXF的配置类
@Configuration
@ImportResource("classpath:ws/ws-cxf.xml")
public class WsInterceptorConfig{
ean(name = "wsServlet")
public ServletRegistrationBean dispatcherServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/ws/*");
return servletRegistrationBean;
}
}
3.ws-cxf.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">
<jaxws:endpoint id="DemoWsServiceImpl" implementor="com.example.ws.impl.MsgWsServicesImpl" address="/msg-ws"/>
<jaxrs:server address="/msg-rs">
<jaxrs:serviceBeans>
<bean class="com.example.rs.MsgRsServicesImpl"></bean>
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
4.服务发布结果
SpringBoot源码地址:https://www.aliyundrive.com/s/YTmX9XD1Vhh
三、 JDK的JAX-WS服务发布
服务端通常使用CXF等框架发布,使用JDK的方式比较少。
1.定义接口和实现
@WebService
public interface WebServiceI {
@WebMethod
String sayHello(String name);
}
@WebService
public class WebServiceImpl implements WebServiceI {
@Override
public String sayHello(String name) {
System.out.println("WebService sayHello "+name);
return "sayHello "+name;
}
}
2.发布服务
public class WebServicePublish {
public static void main(String[] args) {
String address = "http://127.0.0.1:8989/myservice";
Endpoint.publish(address , new WebServiceImpl());
System.out.println("发布webservice成功!");
}
}