一、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]

      

  1. <groupId>org.cxf.maven</groupId>
  2. <artifactId>cxf_ws_helloworld</artifactId>
  3. <version>1.0.0-SNAPSHOT</version>
  4. <name>cxf_ws_helloworld</name>
  5. <description>CXF开发(一)JAX-WS快速入门</description>

   2.2、添加依赖

  1. <dependencies>
  2. <!-- JAX-WS -->
  3. <dependency>
  4. <groupId>org.apache.cxf</groupId>
  5. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  6. <version>3.0.1</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.cxf</groupId>
  10. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  11. <version>3.0.1</version>
  12. </dependency>
  13. <!-- 日志 -->
  14. <dependency>
  15. <groupId>org.slf4j</groupId>
  16. <artifactId>slf4j-log4j12</artifactId>
  17. <version>1.7.12</version>
  18. </dependency>
  19. </dependencies>

    2.3、引入 log4j.properties  ,放置到resoiurces下

    

  1. ### direct log messages to stdout ###
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.Target=System.out
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
  6.  
  7. ### direct messages to file mylog.log ###
  8. log4j.appender.file=org.apache.log4j.FileAppender
  9. log4j.appender.file.File=c:/mylog.log
  10. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  11. log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
  12.  
  13. ### set log levels - for more verbose logging change 'info' to 'debug' ###
  14.  
  15. log4j.rootLogger=info, stdout

    2.4、搭建服务端

        

      2.4.1、导入实体bean

        

        ①Car.java

  1. package org.cxf_ws.domain;
  2.  
  3. public class Car {
  4. private Integer id;
  5. private String carName;
  6. private Double price;
  7.  
  8. public Integer getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15.  
  16. public String getCarName() {
  17. return carName;
  18. }
  19.  
  20. public void setCarName(String carName) {
  21. this.carName = carName;
  22. }
  23.  
  24. public Double getPrice() {
  25. return price;
  26. }
  27.  
  28. public void setPrice(Double price) {
  29. this.price = price;
  30. }
  31.  
  32. @Override
  33. public String toString() {
  34. return "Car [id=" + id + ", carName=" + carName + ", price=" + price + "]";
  35. }
  36.  
  37. }

        ②User.java

  1. package org.cxf_ws.domain;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class User {
  7. private Integer id;
  8. private String username;
  9. private String city;
  10.  
  11. private List<Car> cars = new ArrayList<Car>();
  12.  
  13. public Integer getId() {
  14. return id;
  15. }
  16.  
  17. public void setId(Integer id) {
  18. this.id = id;
  19. }
  20.  
  21. public String getUsername() {
  22. return username;
  23. }
  24.  
  25. public void setUsername(String username) {
  26. this.username = username;
  27. }
  28.  
  29. public String getCity() {
  30. return city;
  31. }
  32.  
  33. public void setCity(String city) {
  34. this.city = city;
  35. }
  36.  
  37. public List<Car> getCars() {
  38. return cars;
  39. }
  40.  
  41. public void setCars(List<Car> cars) {
  42. this.cars = cars;
  43. }
  44.  
  45. }

      2.4.2、构建服务bean

        ①IUserService.java

  1. package org.cxf_ws.service;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.jws.WebMethod;
  6. import javax.jws.WebService;
  7.  
  8. import org.cxf_ws.domain.Car;
  9. import org.cxf_ws.domain.User;
  10.  
  11. @WebService
  12. // @WebService,该注解使用在类上面,标记类是WebService服务提供对象(必须填写)
  13. public interface IUserService {
  14. @WebMethod
  15. // 传递字符串的名称,返回字符串的值
  16. public String sayHello(String name);
  17.  
  18. // @WebMethod,该注解使用在方法上面,标记方法是WebService服务提供的方法(可省略)
  19. // 传递User对象,返回当前用户拥有的车
  20. public List<Car> findCarsByUser(User user);
  21. }

        ②UserServiceImpl.java

  1. package org.cxf_ws.service;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javax.jws.WebService;
  7.  
  8. import org.cxf_ws.domain.Car;
  9. import org.cxf_ws.domain.User;
  10.  
  11. @WebService(endpointInterface/* 接口服务完整类名 */= "org.cxf_ws.service.IUserService", serviceName/* 服务名称 */= "userService")
  12. public class UserServiceImpl implements IUserService {
  13.  
  14. public String sayHello(String name) {
  15. // 执行查询数据库的逻辑
  16. return "Hello," + name;
  17. }
  18.  
  19. public List<Car> findCarsByUser(User user) {
  20. // 执行查询数据库的逻辑
  21. // 这里本应该查询数据库的,为了演示,做一些假数据
  22. if ("xiaoming".equals(user.getUsername())) {
  23. List<Car> cars = new ArrayList<Car>();
  24. Car car1 = new Car();
  25. car1.setId(1);
  26. car1.setCarName("大众");
  27. car1.setPrice(200000d);
  28. cars.add(car1);
  29. Car car2 = new Car();
  30. car2.setId(2);
  31. car2.setCarName("现代");
  32. car2.setPrice(170000d);
  33. cars.add(car2);
  34. return cars;
  35. } else {
  36. return null;
  37. }
  38. }
  39. }

      2.4.3、配置jre环境1.5以上[使注解@WebService和@WebMethod生效]

        ①方案一、在pom.xml中配置plugin(本文采用)

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <version>2.3.2</version>
  7. <configuration>
  8. <source>1.7</source>
  9. <target>1.7</target>
  10. </configuration>
  11. </plugin>
  12. </plugins>
  13. </build>

        ②方案二、eclipse配置

          (1)全局配置

            

          (2)项目配置

            

    2.5、发布服务

      2.5.1、方案一、Jdk  

  1. package org.cxf_ws.server;
  2.  
  3. import javax.xml.ws.Endpoint;
  4.  
  5. import org.cxf_ws.service.IUserService;
  6. import org.cxf_ws.service.UserServiceImpl;
  7.  
  8. public class JAX_WS_Server_Jdk {
  9.  
  10. /**
  11. * JDK发布webservice
  12. * * 生成客户端的代码wsimport
  13. */
  14. public static void main(String[] args) {
  15. // 1、创建服务实现类对象
  16. IUserService userService = new UserServiceImpl();
  17. // 2、定义服务地址
  18. String address = "http://localhost:9999/userService";
  19. // 3、发布服务
  20. Endpoint.publish(address, userService);
  21. // 4、打印信息
  22. System.out.println("helloService 服务已经启动 ...");
  23. }
  24. }

      2.5.2、案二、CXF_JaxWsServerFactoryBean

  1. package org.cxf_ws.server;
  2.  
  3. import org.apache.cxf.interceptor.LoggingInInterceptor;
  4. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  5. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  6. import org.cxf_ws.service.IUserService;
  7. import org.cxf_ws.service.UserServiceImpl;
  8.  
  9. public class JAX_WS_Server_JaxWsServerFactoryBean {
  10.  
  11. /**
  12. * CXF发布
  13. */
  14. public static void main(String[] args) {
  15. // 1、创建服务实现类 对象
  16. IUserService userService = new UserServiceImpl();
  17. // 2、定义服务地址
  18. String address = "http://localhost:9999/userService";
  19. // 3、创建JaxWsServer对象
  20. JaxWsServerFactoryBean jaxWsServer = new JaxWsServerFactoryBean();
  21. jaxWsServer.setServiceBean(userService);
  22. jaxWsServer.setAddress(address);
  23. // 4、打印日志,可以让我们看到传输的数据,SOAP协议=HTTP协议+XML数据
  24. jaxWsServer.getInInterceptors().add(new LoggingInInterceptor());
  25. jaxWsServer.getOutInterceptors().add(new LoggingOutInterceptor());
  26. // 5、发布服务
  27. jaxWsServer.create();
  28. // 6、打印信息
  29. System.out.println("CXF服务发布成功!");
  30. }
  31. }

      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]

        

  1. <groupId>org.cxf.maven</groupId>
  2. <artifactId>cxf_ws_helloworld_client</artifactId>
  3. <version>1.0.0-SNAPSHOT</version>
  4. <name>cxf_ws_helloworld_client</name>
  5. <description>CXF开发(一)JAX-WS快速入门之客户端</description>

      2.6.3、复制调用WebService服务的代码到客户端工程

        

    2.7、测试客户端工程访问服务端工程

      2.7.1、JDK-TestWebService.java

  1. package org.cxf_ws.service;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * 基于JDK提供的wsimport命令解析WSDL文档生成本地代码
  7. * 使用本地代码生成一个代理对象,通过代理对象可以发送HTTP请求
  8. * 请求webservice服务
  9. */
  10. public class TestWebService {
  11. public static void main(String[] args) {
  12. UserService userService = new UserService();
  13. IUserService proxy = userService.getUserServiceImplPort();
  14. System.out.println(proxy.sayHello("张无忌"));
  15. User user = new User();
  16. user.setUsername("xiaoming");
  17. List<Car> list = proxy.findCarsByUser(user);
  18. for (Car car : list) {
  19. System.out.println(car.getId() + ":" + car.getCarName() + ":" + car.getPrice());
  20. }
  21. }
  22. }

        

      2.7.2、CXF

        ①引入依赖

  1. <dependencies>
  2. <!-- JAX-WS -->
  3. <dependency>
  4. <groupId>org.apache.cxf</groupId>
  5. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  6. <version>3.0.1</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.cxf</groupId>
  10. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  11. <version>3.0.1</version>
  12. </dependency>
  13. <!-- 日志 -->
  14. <dependency>
  15. <groupId>org.slf4j</groupId>
  16. <artifactId>slf4j-log4j12</artifactId>
  17. <version>1.7.12</version>
  18. </dependency>
  19. </dependencies>

        ②CXF测试类

           

  1. package org.cxf_ws.service;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  6.  
  7. /**
  8. * 基于JDK提供的wsimport命令解析WSDL文档生成本地代码
  9. * 使用本地代码生成一个代理对象,通过代理对象可以发送HTTP请求
  10. * 请求webservice服务
  11. */
  12. public class CXF_JAX_WS_Client {
  13. public static void main(String[] args) {
  14. // 1、编写客户端调用发布webservice的服务
  15. JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
  16. jaxWsProxyFactoryBean.setServiceClass(IUserService.class);
  17. jaxWsProxyFactoryBean.setAddress("http://localhost:9999/userService");
  18. // 2、创建调用远程服务的代理对象
  19. IUserService proxy = (IUserService) jaxWsProxyFactoryBean.create();
  20. // 3、调用远程服务上的sayHello方法
  21. System.out.println(proxy.sayHello("CXF_JAX_WS"));
  22. // 4、调用远程服务上的findCarsByUser方法
  23. User user = new User();
  24. user.setUsername("xiaoming");
  25. List<Car> list =proxy.findCarsByUser(user);
  26. for (Car car : list) {
  27. System.out.println(car.getId() + ":" + car.getCarName() + ":" + car.getPrice());
  28. }
  29. }
  30. }

      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. oi的小转折

    2018.6.4,衡水中学oier——Yu-shi,真正的走入了外网领域. 从最开始的连scanf都不打取地址,到现在懂了好多以前不敢去看的东西,心态逐渐的成长了.也许有过特别迷茫的时候,也许将来会有 ...

  2. hdu2002 计算球体积【C++】

    计算球体积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. 【郑轻邀请赛 I】这里是天堂!

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2135 [题意] [题解] 答案应该为C(n,a)∗C(m,b)/C(n+m,a+b) ...

  4. 【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 ...

  5. debug jdk source can't watch variable what it is

    https://www.cnblogs.com/shuaiqing/p/7525841.html https://stackoverflow.com/questions/18255474/debug- ...

  6. Mac OSX:安装zsh

    想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...

  7. DSP、Media、AdExchanger之间的关系及交互流程

    广告商,如以下的樱花日语,淘宝卖家.其须要推广自己的产品. Zampdsp(晶赞) 是DSP平台.其与非常多广告商合作,广告商在平台上公布广告创意,并托付平台代为投放. tanx.com 是adExc ...

  8. css3中 弹性盒模型布局之box-flex

    box-flex:也就是让子容器针对父容器的宽高属性依照一定的规则来划分 Eg: html代码: <div class="wrap"> <div class=&q ...

  9. Ejb in action(四)——购物车实例演示有状态会话Bean

    前面.我们介绍了一个入门实例.事实上那就是无状态回话Bean的经常使用情况. 上一篇文章中.我们介绍了无状态会话Bean和有状态会话Bean的相关概念.为了加深大家对它们的理解,我们一起来实现一个有状 ...

  10. 【Nginx】模块化设计

    高度模块化的设计是Nginx的架构基础.全部模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法.它们负责模块的初始化和退出.commands成员是一个包括有ngx_comma ...