本节将实践目前最流行的第二种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 类

package com.myl.entity;
/**
*
* @author maoyl
* @date 2018.4.15
* 实体类
*
*/
public class Student { private String name;
private String sex;
private String brithday; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBrithday() {
return brithday;
}
public void setBrithday(String brithday) {
this.brithday = brithday;
} }

GetStudentUtil.java

package com.myl.entity;

/**
*
* @author myl
* @date 2018.4.15
* 单例获取Student
*
*/
public class GetStudentUtil { private static Student student = new Student(); private GetStudentUtil(){ } public static Student getStudent(){
return student;
} }

StudentDao.java

package com.myl.dao;

import com.myl.entity.Student;

/**
*
* @author myl
* @date 2018.4.15
* Dao层接口
*
*/
public interface StudentDao { public boolean addStudentDao(String name, String sex, String brithday); public Student queryStudentDao(String name); }

StudentDaoImpl.java

package com.myl.dao.daoImpl;

import com.myl.dao.StudentDao;
import com.myl.entity.GetStudentUtil;
import com.myl.entity.Student; /**
*
* @author myl
* @date 2018.4.15
* Dao层实现类
*
*/
public class StudentDaoImpl implements StudentDao { public Student student; @Override
public boolean addStudentDao(String name, String sex, String brithday) {
student = GetStudentUtil.getStudent();
System.out.println("student是否为空--"+student);
System.out.println(student.getName());
System.out.println();
student.setName(name);
student.setSex(sex);
student.setBrithday(brithday); return true;
} @Override
public Student queryStudentDao(String name) {
student = GetStudentUtil.getStudent();
//代替DB
// student.setName("mao");
// student.setSex("boy");
// student.setBrithday("22");
System.out.println("------查询学生-------");
if(name == null){
System.out.print("输入为学生名称为null");
return null;
}
if(!name.equals(student.getName())){
System.out.println("没有此人");
student =null;
}
System.out.println("返回student------------------");
return student;
} }

StudentWs.java

package com.myl.service;

import com.myl.entity.Student;

/**
*
* @author myl
* @date 2018.4.15
* service层接口
*
*/
public interface StudentWs { public boolean addStudentService(String name, String sex, String brithday); public Student queryStudentService(String name);
}

StudentWsImpl.java

package com.myl.service.serviceImpl;

import javax.jws.WebMethod;
import javax.jws.WebService;
import com.myl.dao.StudentDao;
import com.myl.dao.daoImpl.StudentDaoImpl;
import com.myl.entity.Student;
import com.myl.service.StudentWs; /**
*
* @author myl
* @date 2018.4.15
* service层实现类,也是暴露给客户端的接口
* exclude = true表示不暴露给客户端
* @WebMethod(operationName = "queryStudentService") 标注自定义方法
* @WebMethod 默认为该方法名
*
*/ @WebService
public class StudentWsImpl implements StudentWs { public StudentDao studentDao; // @WebMethod(exclude = true)
// public StudentDao getStudentDao() {
// return studentDao;
// }
//
// @WebMethod(exclude = true)
// public void setStudentDao(StudentDao studentDao) {
// this.studentDao = studentDao;
// }
public StudentWsImpl() {
studentDao = new StudentDaoImpl();
} @WebMethod
@Override
public boolean addStudentService(String name, String sex, String brithday) { System.out.println("addStudent-------------");
boolean result = studentDao.addStudentDao(name, sex, brithday);
return result;
} @WebMethod(operationName = "queryStudentService")
@Override
public Student queryStudentService(String name) { System.out.println("queryStudent-----------");
Student student = studentDao.queryStudentDao(name);
return student;
} }

StudentTest.java

package com.myl.test.publish;

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.myl.service.serviceImpl.StudentWsImpl; /**
*
* @author myl
* @date 2018年4月15日 下午11:26:50
* 服务端发布接口
*/
public class StudentTest { public static void main(String[] args) {
System.out.println("web service start");
//获取工厂对象
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); //这里必须传入class,不能是接口,否则客户端会报异常 Could not instantiate service class ... because it is an interface
factory.setServiceClass(StudentWsImpl.class);
//传入接口url
factory.setAddress("http://localhost:5555/studentws");
//创建接口
Server server = factory.create();
//启动接口
server.start();
System.out.println("web service started");
} }

测试发布如下图表示成功

访问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中

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

  

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

编写客户端代码

package com.myl.test.service;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.webservice.StudentWsImpl; /**
* @author myl
* @date 2018年4月15日
* 客户端调用服务端发布的接口
*/
public class StudentSerivceTest { public static void main(String[] args) {
//获取工厂对象
JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();
//加载生成的StudentWsImpl类
jwpfb.setServiceClass(StudentWsImpl.class);
//传入url接口地址
jwpfb.setAddress("http://localhost:5555/studentws?wsdl");
//创建接口对象
StudentWsImpl ws = (StudentWsImpl) jwpfb.create();
//调用接口中的方法
ws.addStudentService("mao", "11", "22");
ws.addStudentService("ya", "15", "23");
ws.queryStudentService("mao");
ws.queryStudentService("ya"); } }

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

以上即为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. Tom_No_01 IDEA tomcat 源码环境搭建

    1.下载源码 apache-tomcat-8.5.50-src 2.下载源码 放D盘,解压后根目录新建pom.xml和catalina-home pom.xml文件中内容为 <?xml vers ...

  2. 看视频学Bootstrap—在微软虚拟学院学习Bootstrap

    Bootstrap 是目前最流行的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB项目. 如果您希望在几个小时内对Bootstrap有一个直观的了解,观看微软虚拟学院(M ...

  3. python实现常用五种排序算法

    一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序 ...

  4. testlink在win7下的安装\配置\使用

    1.xampp >解压并安装xampp >在安装目录下点击setup_xampp(这一步是为了初始化一些环境的配置) >再启动xampp-control,运行Apache和MySQL ...

  5. 我所学的c语言

    c语言结构 #include <stdio.h> int main(){    /* 我的第一个 C 程序 */    printf("Hello, World! \n" ...

  6. Linux命令(八)之安装Jdk、Tomcat

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  7. VIM正则表达式的懒惰模式

    例如有如下一段话: Another whale sighting occurred on , <2004>. AK and HI 要匹配每一个<...>,如果用<.> ...

  8. git config 配置简写命令

    在多人协作开发时,一般用git来进行代码管理. git有一些命令如:git pull . git push等等,这些命令可以设置alias,也就是缩写. 如:git pull 是 git pl, gi ...

  9. STP生成树的一些笔记

    一.STP概述 1.1.STP简介 交换网络环路主要由广播风暴.多帧复制和MAC地址表紊乱造成. 广播风暴:一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播:由于网络拓扑的设计和连 ...

  10. IP实验笔记

    代码: 对LSW1: Vlan 10 Interface ethernet 0/0/1 Port link-type access Port default vlan 10 Interface eth ...