项目基于B站的黑马程序员的webservice项目。
项目使用ApacheCXF框架,利用 Frontend 编程 API 来构建和 开发 Services ,像 JAX-WS。
本文不是Springboot项目。
分别创建服务端和客户端模块。
依赖配置如下:
<dependencies>
<!-- 要进行jaxws 服务开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty web服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
创建service包,写服务接口HelloService.
package com.itheima.service;
import javax.jws.WebService;
/**
* 对外发布服务的接口
*/
@WebService
public interface HelloService {
/**
* 对外发布服务的接口的方法
*/
public String sayHello(String name);
}
创建服务接口实现类。
package com.itheima.service.impl;
import com.itheima.service.HelloService;
public class HelloServiceImpl implements HelloService{
public String sayHello(String name) {
return name+"Welcome to itheima!";
}
把log4j.properties复制到resources文件夹下。改变resources文件夹属性为resources。
在test文件夹下,创建测试类Server,发布服务。
package com.itheima.service.impl;
import com.itheima.service.HelloService;
public class HelloServiceImpl implements HelloService{
public String sayHello(String name) {
return name+"Welcome to itheima!";
}
}
运行Server类,服务发布成功。
浏览器输入测试地址。访问成功。
浏览器输入WSDL说明书地址。localhost:8000/ws/hello?wsdl
访问成功。
写客户端之前要先明确: 1. 服务端地址 2. 服务端接口、接口方法(方法参数、返回值)。
创建模块:02_jaxws_client。
客户端依赖与服务端项目依赖一致。
创建服务接口 HelloService。和服务端的接口保持一致。
package com.itheima.service;
import javax.jws.WebService;
/**
* 对外发布服务的接口
*/
@WebService
public interface HelloService {
/**
* 对外发布服务的接口的方法
*/
public String sayHello(String name);
}
创建测试类Client,远程访问服务端。
package com.itheima;
import com.itheima.service.HelloService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class Client {
public static void main(String[] args) {
//服务接口访问地址:http://localhost:8000/ws/hello
//创建cxf代理工厂
JaxWsProxyFactoryBean factory=new JaxWsProxyFactoryBean();
//设置远程访问服务端地址
factory.setAddress("http://localhost:8000/ws/hello");
//设置接口类型
factory.setServiceClass(HelloService.class);
//对接口生成代理对象
HelloService helloService = factory.create(HelloService.class);
//代理对象类型: class com.sun.proxy.$Proxy34 {java代理:静态,动态{jdk接口代理,cglib子类代理}} $CGLIB123
System.out.println(helloService.getClass());
//远程访问服务端方法:返回值接收
String content = helloService.sayHello("Jet,");
System.out.println(content);
}
}
添加日志拦截器,观察soap协议内容。
服务端加上如下代码:
//添加日志输入,输出拦截器,观察SOAP请求以及SOAP响应内容
factory.getInInterceptors().add(new LoggingInInterceptor());//日志输入
factory.getOutInterceptors().add(new LoggingOutInterceptor());//日志输出
客户端调用,观察服务端的日志。
第一部分是服务端发送POST请求。
ID: 4
Address: http://localhost:8000/ws/hello
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[195], content-type=[text/xml; charset=UTF-8], Host=[localhost:8000], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 3.1.12]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://service.itheima.com/"><arg0>Jet,</arg0></ns2:sayHello></soap:Body></soap:Envelope>
第二部分是服务端的响应。
ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://service.itheima.com/"><return>Jet,, Welcome to itheima!</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
测试 完成。