CXF-JAX-WS开发(一)入门案例
一、Web Service
1、定义
W3C定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。
2、作用
多系统间数据通信
二、CXF是什么?
CXF是目前最主流Web Service 开源的开发框架 ,由Apache提供。支持JAX-WS 和 JAX-RS。
三、CXF-JAX-WS入门案例
1、简介
方法驱动。基于SOAP协议[SOAP=HTTP+XML ]以XML格式传输数据。
2、quickstart
2.1、创建maven project[Packaging:jar]
<groupId>org.cxf.maven</groupId>
<artifactId>cxf_ws_helloworld</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>cxf_ws_helloworld</name>
<description>CXF开发(一)JAX-WS快速入门</description>
2.2、添加依赖
<dependencies>
<!-- JAX-WS -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<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>
</dependencies>
2.3、引入 log4j.properties ,放置到resoiurces下
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout
2.4、搭建服务端
2.4.1、导入实体bean
①Car.java
package org.cxf_ws.domain; public class Car {
private Integer id;
private String carName;
private Double price; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getCarName() {
return carName;
} public void setCarName(String carName) {
this.carName = carName;
} public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} @Override
public String toString() {
return "Car [id=" + id + ", carName=" + carName + ", price=" + price + "]";
} }
②User.java
package org.cxf_ws.domain; import java.util.ArrayList;
import java.util.List; public class User {
private Integer id;
private String username;
private String city; private List<Car> cars = new ArrayList<Car>(); public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} public List<Car> getCars() {
return cars;
} public void setCars(List<Car> cars) {
this.cars = cars;
} }
2.4.2、构建服务bean
①IUserService.java
package org.cxf_ws.service; import java.util.List; import javax.jws.WebMethod;
import javax.jws.WebService; import org.cxf_ws.domain.Car;
import org.cxf_ws.domain.User; @WebService
// @WebService,该注解使用在类上面,标记类是WebService服务提供对象(必须填写)
public interface IUserService {
@WebMethod
// 传递字符串的名称,返回字符串的值
public String sayHello(String name); // @WebMethod,该注解使用在方法上面,标记方法是WebService服务提供的方法(可省略)
// 传递User对象,返回当前用户拥有的车
public List<Car> findCarsByUser(User user);
}
②UserServiceImpl.java
package org.cxf_ws.service; import java.util.ArrayList;
import java.util.List; import javax.jws.WebService; import org.cxf_ws.domain.Car;
import org.cxf_ws.domain.User; @WebService(endpointInterface/* 接口服务完整类名 */= "org.cxf_ws.service.IUserService", serviceName/* 服务名称 */= "userService")
public class UserServiceImpl implements IUserService { public String sayHello(String name) {
// 执行查询数据库的逻辑
return "Hello," + name;
} public List<Car> findCarsByUser(User user) {
// 执行查询数据库的逻辑
// 这里本应该查询数据库的,为了演示,做一些假数据
if ("xiaoming".equals(user.getUsername())) {
List<Car> cars = new ArrayList<Car>();
Car car1 = new Car();
car1.setId(1);
car1.setCarName("大众");
car1.setPrice(200000d);
cars.add(car1);
Car car2 = new Car();
car2.setId(2);
car2.setCarName("现代");
car2.setPrice(170000d);
cars.add(car2);
return cars;
} else {
return null;
}
}
}
2.4.3、配置jre环境1.5以上[使注解@WebService和@WebMethod生效]
①方案一、在pom.xml中配置plugin(本文采用)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
②方案二、eclipse配置
(1)全局配置
(2)项目配置
2.5、发布服务
2.5.1、方案一、Jdk
package org.cxf_ws.server; import javax.xml.ws.Endpoint; import org.cxf_ws.service.IUserService;
import org.cxf_ws.service.UserServiceImpl; public class JAX_WS_Server_Jdk { /**
* JDK发布webservice
* * 生成客户端的代码wsimport
*/
public static void main(String[] args) {
// 1、创建服务实现类对象
IUserService userService = new UserServiceImpl();
// 2、定义服务地址
String address = "http://localhost:9999/userService";
// 3、发布服务
Endpoint.publish(address, userService);
// 4、打印信息
System.out.println("helloService 服务已经启动 ...");
}
}
2.5.2、案二、CXF_JaxWsServerFactoryBean
package org.cxf_ws.server; import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.cxf_ws.service.IUserService;
import org.cxf_ws.service.UserServiceImpl; public class JAX_WS_Server_JaxWsServerFactoryBean { /**
* CXF发布
*/
public static void main(String[] args) {
// 1、创建服务实现类 对象
IUserService userService = new UserServiceImpl();
// 2、定义服务地址
String address = "http://localhost:9999/userService";
// 3、创建JaxWsServer对象
JaxWsServerFactoryBean jaxWsServer = new JaxWsServerFactoryBean();
jaxWsServer.setServiceBean(userService);
jaxWsServer.setAddress(address);
// 4、打印日志,可以让我们看到传输的数据,SOAP协议=HTTP协议+XML数据
jaxWsServer.getInInterceptors().add(new LoggingInInterceptor());
jaxWsServer.getOutInterceptors().add(new LoggingOutInterceptor());
// 5、发布服务
jaxWsServer.create();
// 6、打印信息
System.out.println("CXF服务发布成功!");
}
}
2.5.3、测试发布服务是否成功(webservice的使用说明书)
输入地址localhost:9999/userService?wsdl
2.6、搭建客户端
2.6.1、JDK的wsimport命令生成本地调用WebService服务的代码
使用wsimport命令解析WSDL文档:wsimport -s . http://localhost:9999/userService?wsdl[webservice说明书地址]
名称 | 含义 |
wsimport |
JDK命令 |
-s |
生成代码 |
. |
当前路径,I.e. D:\testcxf |
http://localhost:9999/userService?wsdl |
webservice说明书地址 |
2.6.2、创建客户端maven project[Packaing:jar]
<groupId>org.cxf.maven</groupId>
<artifactId>cxf_ws_helloworld_client</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>cxf_ws_helloworld_client</name>
<description>CXF开发(一)JAX-WS快速入门之客户端</description>
2.6.3、复制调用WebService服务的代码到客户端工程
2.7、测试客户端工程访问服务端工程
2.7.1、JDK-TestWebService.java
package org.cxf_ws.service; import java.util.List; /**
* 基于JDK提供的wsimport命令解析WSDL文档生成本地代码
* 使用本地代码生成一个代理对象,通过代理对象可以发送HTTP请求
* 请求webservice服务
*/
public class TestWebService {
public static void main(String[] args) {
UserService userService = new UserService();
IUserService proxy = userService.getUserServiceImplPort();
System.out.println(proxy.sayHello("张无忌"));
User user = new User();
user.setUsername("xiaoming");
List<Car> list = proxy.findCarsByUser(user);
for (Car car : list) {
System.out.println(car.getId() + ":" + car.getCarName() + ":" + car.getPrice());
}
}
}
2.7.2、CXF
①引入依赖
<dependencies>
<!-- JAX-WS -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<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>
</dependencies>
②CXF测试类
package org.cxf_ws.service; import java.util.List; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; /**
* 基于JDK提供的wsimport命令解析WSDL文档生成本地代码
* 使用本地代码生成一个代理对象,通过代理对象可以发送HTTP请求
* 请求webservice服务
*/
public class CXF_JAX_WS_Client {
public static void main(String[] args) {
// 1、编写客户端调用发布webservice的服务
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setServiceClass(IUserService.class);
jaxWsProxyFactoryBean.setAddress("http://localhost:9999/userService");
// 2、创建调用远程服务的代理对象
IUserService proxy = (IUserService) jaxWsProxyFactoryBean.create();
// 3、调用远程服务上的sayHello方法
System.out.println(proxy.sayHello("CXF_JAX_WS"));
// 4、调用远程服务上的findCarsByUser方法
User user = new User();
user.setUsername("xiaoming");
List<Car> list =proxy.findCarsByUser(user);
for (Car car : list) {
System.out.println(car.getId() + ":" + car.getCarName() + ":" + car.getPrice());
}
}
}
2.7.3、用日志查看soap协议内容
3、JAX-WS 原理
CXF-JAX-WS开发(一)入门案例的更多相关文章
- CXF-JAX-RS开发(一)入门案例
一.简介 资源驱动.基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据. 二.quickstart 1.创建maven project[Packaging:jar] ...
- Django 入门案例开发(上)
Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...
- 转载 WebService 的CXF框架 WS方式Spring开发
WebService 的CXF框架 WS方式Spring开发 1.建项目,导包. 1 <project xmlns="http://maven.apache.org/POM/4.0 ...
- WebService 的CXF框架 WS方式Spring开发
1.建项目,导包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- Django 入门案例开发
Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...
- Java开发学习(十五)----AOP入门案例及其工作流程解析
一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...
- Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制
一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...
- Java开发学习(四十)----MyBatisPlus入门案例与简介
一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...
- Java开发学习(二)----IOC、DI入门案例
一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...
随机推荐
- PAT 1104 Sum of Number Segments
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For exam ...
- BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
- padding填充与box-sizing: border-box配合使用
不管伸缩盒还是浮动盒子,只要使用到padding,就必须使用 box-sizing: border-box; 有图片的时候,需摇与其他文字对齐的时候,在图片的外层加个:vertical-ali ...
- 清北学堂模拟赛d5t5 exLCS
分析:比较巧妙的一道题.经典的LCS算法复杂度是O(nm)的,理论上没有比这个复杂度更低的算法,除非题目有一些限制.这道题中两个字符串的长度不一样,f[i][j]如果表示第一个串前i个,第二个串前j个 ...
- ggplot画基本图形类型
df<-data.frame( x=c(3,1,5), y=c(2,4,6), label=c("a","b","c"))p<- ...
- javac compiling error ( mising package)
javac 编译java源文件时,提示 package does not exist 的错误 Test.java import java.security.MessageDigest; import ...
- POJ题目1947 Rebuilding Roads(树形dp)
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9957 Accepted: 4537 ...
- 最全Linux 与 Linux Windows 文件共享
前提说明: windows主机信息:192.168.1.100 帐号:abc password:123 共享目录:share linux主机信息:192.168.1.200 帐号:def passwo ...
- Realm Update failed - Android
Realm Update failed - Android Ask Question up vote 0 down vote favorite I'm using realm for my andro ...
- 在ubuntu中安装photoshop cs6
对于很多专业的PS高手来说,真心难以找到顺手的且可以完美替代PS的软件,所以我们这里的解决办法就是用wine来安装. 虽然网上有很多的wine安装ps的方法,但是在使用过程往住会发生莫名其妙的崩溃,体 ...