本节将实践目前最流行的第二种web service 发布和调试框架  CXF

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上。Java的webService实现本身就是一个很耗性能的实现方案(xml与java对象之间在服务端以及客户端的互转比较消耗性能),目前java主流的webService应用以CXF、AXIS2为主,CXF比AXIS2效率更高,并且在java 应用中CXF很成熟,因此CXF在webservice中占有非常重要的地位。

下面一张网络上的图比较好的说明了CXF 与web service的关系

下面将具体说说如何使用CXF 进行Webservice 开发。关于CXF的实践分2篇,

    第一篇通过注解发布webservice,利用cxf 进行客户端开发。

    第二篇:通过spring与cxf 结合进行发布

前面已经学习了使用JDK发布WebService本文内容,下面学习cxf框架完成服务器发布 和 客户端开发

  需要准备环境 myeclipse 和 cxf 包 (我是用的Myeclipse2017 和 apache-cxf-3.1.15.zip的cxf包、jdk 1.8 环境  -- ps:apache-cxf-3.2.4.zip 版本太高,报错 好像跟jdk版本有关系,所以用了 apache-cxf-3.1.15.zip的cxf包)

1、服务端发布方式:用cxf 框架方式

1、首先在myeclipse中创建一个java web project

工程里面的类分别是Student.java   StudentDAO.java  StudentDAOImpl.java  StudentWs.java StudentWsImpl.java,

本文的Student对象用的是单例模式

这里重点贴一下 StudentWs.java  和  StudentWsImpl.java.    StudentWs是暴露的接口类,也是web service 服务接口,  实现类是服务的实现。

项目结构如下图

需要的jar包

我用的是apache-cxf-3.2.4 在lib里面拿过来的

基本代码如下:

Student.java 类

  1. package com.myl.entity;
  2. /**
  3. *
  4. * @author maoyl
  5. * @date 2018.4.15
  6. * 实体类
  7. *
  8. */
  9. public class Student {
  10.  
  11. private String name;
  12. private String sex;
  13. private String brithday;
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String getSex() {
  22. return sex;
  23. }
  24. public void setSex(String sex) {
  25. this.sex = sex;
  26. }
  27. public String getBrithday() {
  28. return brithday;
  29. }
  30. public void setBrithday(String brithday) {
  31. this.brithday = brithday;
  32. }
  33.  
  34. }

GetStudentUtil.java

  1. package com.myl.entity;
  2.  
  3. /**
  4. *
  5. * @author myl
  6. * @date 2018.4.15
  7. * 单例获取Student
  8. *
  9. */
  10. public class GetStudentUtil {
  11.  
  12. private static Student student = new Student();
  13.  
  14. private GetStudentUtil(){
  15.  
  16. }
  17.  
  18. public static Student getStudent(){
  19. return student;
  20. }
  21.  
  22. }

StudentDao.java

  1. package com.myl.dao;
  2.  
  3. import com.myl.entity.Student;
  4.  
  5. /**
  6. *
  7. * @author myl
  8. * @date 2018.4.15
  9. * Dao层接口
  10. *
  11. */
  12. public interface StudentDao {
  13.  
  14. public boolean addStudentDao(String name, String sex, String brithday);
  15.  
  16. public Student queryStudentDao(String name);
  17.  
  18. }

StudentDaoImpl.java

  1. package com.myl.dao.daoImpl;
  2.  
  3. import com.myl.dao.StudentDao;
  4. import com.myl.entity.GetStudentUtil;
  5. import com.myl.entity.Student;
  6.  
  7. /**
  8. *
  9. * @author myl
  10. * @date 2018.4.15
  11. * Dao层实现类
  12. *
  13. */
  14. public class StudentDaoImpl implements StudentDao {
  15.  
  16. public Student student;
  17.  
  18. @Override
  19. public boolean addStudentDao(String name, String sex, String brithday) {
  20. student = GetStudentUtil.getStudent();
  21. System.out.println("student是否为空--"+student);
  22. System.out.println(student.getName());
  23. System.out.println();
  24. student.setName(name);
  25. student.setSex(sex);
  26. student.setBrithday(brithday);
  27.  
  28. return true;
  29. }
  30.  
  31. @Override
  32. public Student queryStudentDao(String name) {
  33. student = GetStudentUtil.getStudent();
  34. //代替DB
  35. // student.setName("mao");
  36. // student.setSex("boy");
  37. // student.setBrithday("22");
  38. System.out.println("------查询学生-------");
  39. if(name == null){
  40. System.out.print("输入为学生名称为null");
  41. return null;
  42. }
  43. if(!name.equals(student.getName())){
  44. System.out.println("没有此人");
  45. student =null;
  46. }
  47. System.out.println("返回student------------------");
  48. return student;
  49. }
  50.  
  51. }

StudentWs.java

  1. package com.myl.service;
  2.  
  3. import com.myl.entity.Student;
  4.  
  5. /**
  6. *
  7. * @author myl
  8. * @date 2018.4.15
  9. * service层接口
  10. *
  11. */
  12. public interface StudentWs {
  13.  
  14. public boolean addStudentService(String name, String sex, String brithday);
  15.  
  16. public Student queryStudentService(String name);
  17. }

StudentWsImpl.java

  1. package com.myl.service.serviceImpl;
  2.  
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebService;
  5. import com.myl.dao.StudentDao;
  6. import com.myl.dao.daoImpl.StudentDaoImpl;
  7. import com.myl.entity.Student;
  8. import com.myl.service.StudentWs;
  9.  
  10. /**
  11. *
  12. * @author myl
  13. * @date 2018.4.15
  14. * service层实现类,也是暴露给客户端的接口
  15. * exclude = true表示不暴露给客户端
  16. * @WebMethod(operationName = "queryStudentService") 标注自定义方法
  17. * @WebMethod 默认为该方法名
  18. *
  19. */
  20.  
  21. @WebService
  22. public class StudentWsImpl implements StudentWs {
  23.  
  24. public StudentDao studentDao;
  25.  
  26. // @WebMethod(exclude = true)
  27. // public StudentDao getStudentDao() {
  28. // return studentDao;
  29. // }
  30. //
  31. // @WebMethod(exclude = true)
  32. // public void setStudentDao(StudentDao studentDao) {
  33. // this.studentDao = studentDao;
  34. // }
  35. public StudentWsImpl() {
  36. studentDao = new StudentDaoImpl();
  37. }
  38.  
  39. @WebMethod
  40. @Override
  41. public boolean addStudentService(String name, String sex, String brithday) {
  42.  
  43. System.out.println("addStudent-------------");
  44. boolean result = studentDao.addStudentDao(name, sex, brithday);
  45. return result;
  46. }
  47.  
  48. @WebMethod(operationName = "queryStudentService")
  49. @Override
  50. public Student queryStudentService(String name) {
  51.  
  52. System.out.println("queryStudent-----------");
  53. Student student = studentDao.queryStudentDao(name);
  54. return student;
  55. }
  56.  
  57. }

StudentTest.java

  1. package com.myl.test.publish;
  2.  
  3. import org.apache.cxf.endpoint.Server;
  4. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  5.  
  6. import com.myl.service.serviceImpl.StudentWsImpl;
  7.  
  8. /**
  9. *
  10. * @author myl
  11. * @date 2018年4月15日 下午11:26:50
  12. * 服务端发布接口
  13. */
  14. public class StudentTest {
  15.  
  16. public static void main(String[] args) {
  17. System.out.println("web service start");
  18. //获取工厂对象
  19. JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
  20.  
  21. //这里必须传入class,不能是接口,否则客户端会报异常 Could not instantiate service class ... because it is an interface
  22. factory.setServiceClass(StudentWsImpl.class);
  23. //传入接口url
  24. factory.setAddress("http://localhost:5555/studentws");
  25. //创建接口
  26. Server server = factory.create();
  27. //启动接口
  28. server.start();
  29. System.out.println("web service started");
  30. }
  31.  
  32. }

测试发布如下图表示成功

访问http://localhost:5555/studentws?wsdl得到下图所示  ps:如果测试服务端和客户端不在同一个的机器上则localhost应该是本机的IP地址

2、使用CXF 进行 客户端开发

为客户端加上cxf需要的jar包,否则运行会报错误

这些是使用cxf 里面的工具wsdl2java  生成的java类。在命令行执行下面命令,就可以生成这些类

D:\用户目录\下载\apache-cxf-3.1.15\bin>wsdl2java -p com.webservice http://localhost:8080/studentws?wsdl

如下图所示生成客户端代码成功:在本目录下 com.webservice中

  1. wsdl2java用法:
  2. wsdl2java -p com -d src -all wsdl
  3.  
  4. -p 指定其wsdl的命名空间,也就是要生成代码的包名
  5. -d 指定要产生代码所在目录
  6. -client 生成客户端测试web service的代码
  7. -server 生成服务器启动web service的代码
  8. -impl 生成web service的实现代码
  9. -ant 生成build.xml文件
  10. -all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.

  

把生成的代码放的客户端项目中

编写客户端代码

  1. package com.myl.test.service;
  2.  
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  4. import com.webservice.StudentWsImpl;
  5.  
  6. /**
  7. * @author myl
  8. * @date 2018年4月15日
  9. * 客户端调用服务端发布的接口
  10. */
  11. public class StudentSerivceTest {
  12.  
  13. public static void main(String[] args) {
  14. //获取工厂对象
  15. JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();
  16. //加载生成的StudentWsImpl类
  17. jwpfb.setServiceClass(StudentWsImpl.class);
  18. //传入url接口地址
  19. jwpfb.setAddress("http://localhost:5555/studentws?wsdl");
  20. //创建接口对象
  21. StudentWsImpl ws = (StudentWsImpl) jwpfb.create();
  22. //调用接口中的方法
  23. ws.addStudentService("mao", "11", "22");
  24. ws.addStudentService("ya", "15", "23");
  25. ws.queryStudentService("mao");
  26. ws.queryStudentService("ya");
  27.  
  28. }
  29.  
  30. }

运行客户端如图所示(每个方法中随便输出点东西)

以上即为cxf框架完成webservice的方法

-------------------------------------------------------------------------------------------

遇到问题:

1、开始我下载的apache-cxf-3.2.4版本的cxf,运行报错

解决方法:

  应该是cxf版本太高,跟jdk1.8的版本有关,于是换了apache-cxf-3.1.15版本的既可以了

2、cxf(3.1.15) 客户端异常 请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

原因是:使用wsdk2java生成客户端文件的时候根据源文件生成了客户端代码,方法名字重复

解决方法

    生成代码的时候 使用 -p  com.webservice重命名报名即可

---------

网上找的方法

   (1)最佳方案包名createTask 改成 全部小写 createtask

  (2)或者生成代码的时候 使用 -p  com.service.createtask 重命名报名即可

   (3)第三那种解决方案不建议,把createTask.java中的  @XmlType(name = "CreateTask", propOrder = {   "arg0"}) 中的name 改成 createTask 即可

WebService学习总结(四)--基于CXF的服务端开发的更多相关文章

  1. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...

  2. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  3. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  4. 基于SignalR的服务端和客户端通讯处理

    SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...

  5. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  6. 从架构师视角看是否该用Kotlin做服务端开发?

    前言 自从Oracle收购Sun之后,对Java收费或加强控制的尝试从未间断,谷歌与Oracle围绕Java API的官司也跌宕起伏.虽然Oracle只是针对Oracle JDK8的升级收费,并释放了 ...

  7. 微服务项目开发学成在线_day01_CMS服务端开发

    05-CMS需求分析-什么是CMS 什么是CMS?CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同.CMS有哪些类型? 每个公司对每个项目的C ...

  8. Day01_搭建环境&CMS服务端开发

    学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...

  9. 俯瞰 Java 服务端开发

    原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...

随机推荐

  1. element+vue点击新增表格内在已有数据添加一行带输入框内容

    在element+vue项目中,需求要表格内已有数据,点击新增在首行添加一行带输入框内容 table的数据为datas=[],那么下面是一列的数据,多列可循环或复制 <el-table-colu ...

  2. 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

    最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...

  3. frameset框架在.net网站中的小实现。

    一般我们生成网页,为减少代码的开发量,通常将不变的网页部分进行重用.通用为三种方法: 1.frameset框架 2.用户自定义控件 3.母版页(消耗资源大,不追叙) 通常1,2两种方法常用. 1.fr ...

  4. 20初识前端HTML(1)

    1 .HTML 1.1 网页的组成 文字 图片 链接 等元素构成.除了这些元素之外 网页中还可以包含音频 视频 等 1.2 WEB前端开发的流程 现在主流的开发流程: 前后端分离的开发模式. 美工:p ...

  5. CMMI相关图书

    Integrating CMMI and Agile Development: Case Studies and Proven Techniques for Faster Performance Im ...

  6. Mybatis源码解析2—— 实例搭建

    大家好,我是可乐. 上篇文章给大家撸了一遍用 JDBC 直接操作数据库的实例,还只是简单写了一个查询的接口,其代码量就已经很大了,并且可乐还给大家分析了直接使用 JDBC 带来的一些问题,总之是一种反 ...

  7. python数据统计之禅道bug统计

    背景 通过定期输出 每条产品的 BUG 情况,以此来反馈开发解决问题.测试跟进问题的情况:钉钉群推送提醒开发及时解决 以此我这边开始着手准备编写一个小工具,最终达到目的:自动定期发送统计报告,报告维度 ...

  8. 【笔记】numpy.array基础(1)

    numpy.array基础 使用numpy.__version__可以检查numpy的版本 当然也可以直接使用命令行检查numpy版本 也可以用来简化引用,使用as python list特点 num ...

  9. idea 生成 javaDoc

    idea 生成 javaDoc 使用命令 Generate javaDoc - 直接输入javadoc就可以了 Generate JavaDoc scope 3个区域,一般选择第三项自定义,选择模块, ...

  10. SQL 练习35

    查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 方式1: SELECT Student.sid,Student.sname,t.score from Student , (SELEC ...