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 ...
随机推荐
- 远程连接Ubuntu的桌面
参考:http://www.linuxidc.com/Linux/2016-06/132442.htm http://teliute.org/linux/TeUbt/lesson52/lesson52 ...
- 【DEBUG】 Visual Studio 2005 DEBUG集
一. fatal error C1083: 无法打开包括文件:"stdint.h": No such file or directory stdint.h是c99标准的头文件,vc ...
- [bzoj3747][POI2015]Kinoman_线段树
Kinoman bzoj-3747 POI-2015 题目大意:有m部电影,第i部电影的好看值为w[i].现在放了n天电影,请你选择一段区间l~r使得l到r之间的好看值总和最大.特别地,如果同一种电影 ...
- 洛谷 P2195 HXY造公园
P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...
- Linux C程序存储空间的逻辑布局
原文:http://blog.chinaunix.net/uid-20692625-id-3057053.html ------------------------------------------ ...
- 【转】storm 开发系列一 第一个程序
原文: http://blog.csdn.net/csfreebird/article/details/49104777 --------------------------------------- ...
- Nginx配置httpsserver
配置HTTPS主机.必须在server配置块中打开SSL协议,还须要指定服务器端证书和密钥文件的位置: server { listen 443; #要加密的域名 server_name www.te ...
- POJ 3653 & ZOJ 2935 & HDU 2722 Here We Go(relians) Again(最短路dijstra)
题目链接: PKU:http://poj.org/problem? id=3653 ZJU:problemId=1934" target="_blank">http ...
- Spring发送邮件_javax.mail.AuthenticationFailedException异常已解决
在Spring项目中须要增加监控功能.监控过程中发现异常时.须要邮件报警.最初选择用javamail发送,代码量比較大(相对于spring发送).终于选择Spring邮件发送~ 以下贴一下实现的代码以 ...
- Ext.tree.Panel实现单选,多选
Extjs var productCategoryTreeLookUpFn = function(callback) { var productCategoryLookUpWindow; var pr ...