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 ...
随机推荐
- oi的小转折
2018.6.4,衡水中学oier——Yu-shi,真正的走入了外网领域. 从最开始的连scanf都不打取地址,到现在懂了好多以前不敢去看的东西,心态逐渐的成长了.也许有过特别迷茫的时候,也许将来会有 ...
- hdu2002 计算球体积【C++】
计算球体积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 【郑轻邀请赛 I】这里是天堂!
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2135 [题意] [题解] 答案应该为C(n,a)∗C(m,b)/C(n+m,a+b) ...
- 【codeforces 509A】Maximum in Table
[题目链接]:http://codeforces.com/contest/509/problem/A [题意] 给你一个递推式f[i][j] = f[i-1][j]+f[i][j-1]; 让你求f[i ...
- debug jdk source can't watch variable what it is
https://www.cnblogs.com/shuaiqing/p/7525841.html https://stackoverflow.com/questions/18255474/debug- ...
- Mac OSX:安装zsh
想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...
- DSP、Media、AdExchanger之间的关系及交互流程
广告商,如以下的樱花日语,淘宝卖家.其须要推广自己的产品. Zampdsp(晶赞) 是DSP平台.其与非常多广告商合作,广告商在平台上公布广告创意,并托付平台代为投放. tanx.com 是adExc ...
- css3中 弹性盒模型布局之box-flex
box-flex:也就是让子容器针对父容器的宽高属性依照一定的规则来划分 Eg: html代码: <div class="wrap"> <div class=&q ...
- Ejb in action(四)——购物车实例演示有状态会话Bean
前面.我们介绍了一个入门实例.事实上那就是无状态回话Bean的经常使用情况. 上一篇文章中.我们介绍了无状态会话Bean和有状态会话Bean的相关概念.为了加深大家对它们的理解,我们一起来实现一个有状 ...
- 【Nginx】模块化设计
高度模块化的设计是Nginx的架构基础.全部模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法.它们负责模块的初始化和退出.commands成员是一个包括有ngx_comma ...