一、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开发(一)入门案例的更多相关文章

  1. CXF-JAX-RS开发(一)入门案例

    一.简介 资源驱动.基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据. 二.quickstart 1.创建maven project[Packaging:jar] ...

  2. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

  3. 转载 WebService 的CXF框架 WS方式Spring开发

    WebService 的CXF框架 WS方式Spring开发   1.建项目,导包. 1 <project xmlns="http://maven.apache.org/POM/4.0 ...

  4. WebService 的CXF框架 WS方式Spring开发

    1.建项目,导包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  5. Django 入门案例开发

    Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...

  6. Java开发学习(十五)----AOP入门案例及其工作流程解析

    一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...

  7. Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制

    一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...

  8. Java开发学习(四十)----MyBatisPlus入门案例与简介

    一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...

  9. Java开发学习(二)----IOC、DI入门案例

    一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...

随机推荐

  1. PAT 1104 Sum of Number Segments

    Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For exam ...

  2. BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  3. padding填充与box-sizing: border-box配合使用

    不管伸缩盒还是浮动盒子,只要使用到padding,就必须使用 box-sizing: border-box;     有图片的时候,需摇与其他文字对齐的时候,在图片的外层加个:vertical-ali ...

  4. 清北学堂模拟赛d5t5 exLCS

    分析:比较巧妙的一道题.经典的LCS算法复杂度是O(nm)的,理论上没有比这个复杂度更低的算法,除非题目有一些限制.这道题中两个字符串的长度不一样,f[i][j]如果表示第一个串前i个,第二个串前j个 ...

  5. ggplot画基本图形类型

    df<-data.frame( x=c(3,1,5), y=c(2,4,6), label=c("a","b","c"))p<- ...

  6. javac compiling error ( mising package)

    javac 编译java源文件时,提示 package does not exist 的错误 Test.java import java.security.MessageDigest; import ...

  7. POJ题目1947 Rebuilding Roads(树形dp)

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9957   Accepted: 4537 ...

  8. 最全Linux 与 Linux Windows 文件共享

    前提说明: windows主机信息:192.168.1.100 帐号:abc password:123 共享目录:share linux主机信息:192.168.1.200 帐号:def passwo ...

  9. Realm Update failed - Android

    Realm Update failed - Android Ask Question up vote 0 down vote favorite I'm using realm for my andro ...

  10. 在ubuntu中安装photoshop cs6

    对于很多专业的PS高手来说,真心难以找到顺手的且可以完美替代PS的软件,所以我们这里的解决办法就是用wine来安装. 虽然网上有很多的wine安装ps的方法,但是在使用过程往住会发生莫名其妙的崩溃,体 ...