WebService学习总结(四)--基于CXF的服务端开发
本节将实践目前最流行的第二种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的服务端开发的更多相关文章
- TCP/IP网络编程之基于TCP的服务端/客户端(一)
理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
- 基于SignalR的服务端和客户端通讯处理
SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- 从架构师视角看是否该用Kotlin做服务端开发?
前言 自从Oracle收购Sun之后,对Java收费或加强控制的尝试从未间断,谷歌与Oracle围绕Java API的官司也跌宕起伏.虽然Oracle只是针对Oracle JDK8的升级收费,并释放了 ...
- 微服务项目开发学成在线_day01_CMS服务端开发
05-CMS需求分析-什么是CMS 什么是CMS?CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同.CMS有哪些类型? 每个公司对每个项目的C ...
- Day01_搭建环境&CMS服务端开发
学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- element+vue点击新增表格内在已有数据添加一行带输入框内容
在element+vue项目中,需求要表格内已有数据,点击新增在首行添加一行带输入框内容 table的数据为datas=[],那么下面是一列的数据,多列可循环或复制 <el-table-colu ...
- 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)
最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...
- frameset框架在.net网站中的小实现。
一般我们生成网页,为减少代码的开发量,通常将不变的网页部分进行重用.通用为三种方法: 1.frameset框架 2.用户自定义控件 3.母版页(消耗资源大,不追叙) 通常1,2两种方法常用. 1.fr ...
- 20初识前端HTML(1)
1 .HTML 1.1 网页的组成 文字 图片 链接 等元素构成.除了这些元素之外 网页中还可以包含音频 视频 等 1.2 WEB前端开发的流程 现在主流的开发流程: 前后端分离的开发模式. 美工:p ...
- CMMI相关图书
Integrating CMMI and Agile Development: Case Studies and Proven Techniques for Faster Performance Im ...
- Mybatis源码解析2—— 实例搭建
大家好,我是可乐. 上篇文章给大家撸了一遍用 JDBC 直接操作数据库的实例,还只是简单写了一个查询的接口,其代码量就已经很大了,并且可乐还给大家分析了直接使用 JDBC 带来的一些问题,总之是一种反 ...
- python数据统计之禅道bug统计
背景 通过定期输出 每条产品的 BUG 情况,以此来反馈开发解决问题.测试跟进问题的情况:钉钉群推送提醒开发及时解决 以此我这边开始着手准备编写一个小工具,最终达到目的:自动定期发送统计报告,报告维度 ...
- 【笔记】numpy.array基础(1)
numpy.array基础 使用numpy.__version__可以检查numpy的版本 当然也可以直接使用命令行检查numpy版本 也可以用来简化引用,使用as python list特点 num ...
- idea 生成 javaDoc
idea 生成 javaDoc 使用命令 Generate javaDoc - 直接输入javadoc就可以了 Generate JavaDoc scope 3个区域,一般选择第三项自定义,选择模块, ...
- SQL 练习35
查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 方式1: SELECT Student.sid,Student.sname,t.score from Student , (SELEC ...