cxf 这里介绍在web跟非web中的发布以及调用

准备条件:

1,导入cxf的相关jar包,以maven项目为例 pom的配置文件为

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>CXF</groupId>
<artifactId>CXF</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name />
<description />
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-api</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>2.5.0</version>
</dependency>

<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>5.0-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>CXF</finalName>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

2,创建实体类,接口以及实现类

 package pBean;

public class Reader {

private static final long serialVersionUID = 1L;

private String name;

private String password;

public Reader(){}

public Reader(String name,String password) {

this.name = name;

this.password = password;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

//Get/Set方法省略

public String toString(){

return "Name:"+name+",Password:"+password;

}

}

定义接口类

package pInterface;

import java.util.List;

import javax.jws.WebParam;

import javax.jws.WebService;

import pBean.Reader;

@WebService

public interface IReaderService {

public Reader getReader(@WebParam(name = "name") String name,@WebParam(name = "password") String password);

public List<Reader> getReaders();

}

Tip:(里的WebParam必须指定,否则调用的时候返回null)

定义实现类

package pImpl;

import java.util.ArrayList;

import java.util.List;

import javax.jws.WebParam;

import pBean.Reader;

import pInterface.IReaderService;

public class ReaderService implements IReaderService{

public Reader getReader(@WebParam(name="name") String name,@WebParam(name="password") String password) {

return new Reader(name,password);

}

public List<Reader> getReaders(){

List<Reader> readerList = new ArrayList<Reader>();

readerList.add(new Reader("shun1","123"));

readerList.add(new Reader("shun2","123"));

return readerList;

}

}

目录结构

一、在非web中发布服务并调用

1,发布服务,

执行下面的main方法,这个服务就起来了,此时在浏览器输入http://localhost:8080/readerService?wsdl就能访问服务

package pTest;

import javax.xml.ws.Endpoint;

import pImpl.ReaderService;

/**

*@author chenrd

*@date 2018-3-20 下午3:55:42

*CXF自带了一个轻量的容器服务,相当于spring自己提供了IOC容器一样。

*我们可以先用它来测试一下我们部署成功没。

*/

public class Test {

public static void main(String[] args) {

System.out.println("Server is starting...");

ReaderService readerService = new ReaderService();

Endpoint.publish("http://localhost:8080/readerService",readerService);

System.out.println("Server is started...");

}

}

2,调用服务

package pTest;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import pBean.Reader;

import pInterface.IReaderService;

/**

*@author chenrd

*@date 2018-3-20 下午4:35:14

*业务:

*部署成功后,我们就是要调用啦,

*它的调用也相当简单,跟xfire类似,取得接口,然后就可以跟本地类一样调用方法了。

*/

public class Test2 {

/**

* 这里很简单,也是取得一个工厂类,

* 然后直接设接口和地址再create就可以得取相应的接口了,

* 这里跟xfire一样,也是需要调用端先定义好接口原型,否则这些调用将无从说起。

*/

public static void main(String[] args) {

JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();

factoryBean.setServiceClass(IReaderService.class);

factoryBean.setAddress("http://localhost:8080/readerService");

IReaderService readerService = (IReaderService)factoryBean.create();

Reader reader = readerService.getReader("shun","123");

System.out.println("Reader:"+reader);

}

}

二、在web中发布服务并调用

添加下面1和2的条件

1,在web.xml中添加

<!-- 这里很简单,只是指定了spring的监听器和相应的配置文件路径,并且指定了CXF的拦截方式。 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>

2,spring配置文件中的配置(这里单独放到了一个文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint id="readerServicce2"  implementor="pImpl.ReaderService" address="/readerService2" />
</beans>

说明:

<!-- 
这里很简单,只是通过jaxws:endpoint定义了一个webservice,
implementor是webservice的处理类,而address是它的访问路径,跟我们前面写的readerService类似。
这时我们可以把它部署到tomcat中,通过http://localhost:8080/CXF/webservice/readerService2?wsdl可以直接访问。

有些朋友会问,为什么这次访问的URL跟前面的不一样呢。
其实前面的访问地址是我们自己定义的,而这里的webservice地址是我们在配置文件中配置好的,并且是通过web项目来部署的,
这里就需要用项目名称,而且我们在CXFServlet那里配置了url-pattern是webservice,
所以最后的URL就跟上面一致了。 -->

发布(部署你的项目到tomcat并跑起来)

调用:

package pTest;

import javax.xml.namespace.QName;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

import pBean.Reader;

/**
* @author chenrd
* @date 2018-3-21 上午11:39:31 业务:
*/
public class Test3 {
public static void main(String[] args) {
//这个是用cxf 客户端访问cxf部署的webservice服务
//千万记住,访问cxf的webservice必须加上namespace ,否则通不过
//现在又另外一个问题,传递过去的参数服务端接收不到
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//url为调用webService的wsdl地址
Client client = dcf.createClient("http://localhost:8080/CXF/webservice/readerService2?wsdl");
//第一个参数是wsdl的命名空间
QName qname=new QName("http://pInterface/","getReader");
//namespace是命名空间,methodName是方法名
String name = "name";
String pwd = "pwd";
//paramvalue为参数值
Object[] objects = null;
Object object = null;
try {
object = client.invoke(qname,name,pwd);
} catch (Exception e) {
e.printStackTrace();
}
//调用web Service//输出调用结果
System.out.println(object);
// System.out.println(((Reader)objects[0]).toString());
}
}

cxf简单例子的更多相关文章

  1. 使用 CXF 做 webservice 简单例子(转载)

    使用 CXF 做 webservice 简单例子     Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这 ...

  2. 2种实现CXF方法例子

    转载自:http://www.blogjava.net/sai5201314vicky/articles/353078.html 大家好,今天我要介绍的现实webservice的一种技术——CXF 由 ...

  3. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  5. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  6. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  7. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  8. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  9. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

随机推荐

  1. 5 -- Hibernate的基本用法 --5 2 持久化对象的状态

    1. 瞬态 : 对象有new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态.瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识.如果程序中失去了瞬态对象的引用,瞬态 ...

  2. redis最大缓存和回收策略

  3. IntelliJ IDEA连接TFS local workspace无法正常签入

    前几天为了便于在本地修改,将TFS workspace的类型从Server修改为Local.基于Visual Studio的开发正常没有问题,用IntelliJ IDEA时却提示以下错误: Error ...

  4. 轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)

    轮滑新手入门推荐? [柚子陪你学轮滑轮滑教学]第一集 轮滑安全 1,站: 站立:脚可以成v字,或者平行,手放膝盖或者前伸.平行站立 膝盖相距一拳头左右,两腿间距略小于肩宽.膝盖略弯,腰下压,抬头挺胸 ...

  5. asp.net C#绘制太极图

    成品图: html页面: 注意设置 ContentType="Image/Jpeg" <%@ Page Language="C#" AutoEventWi ...

  6. Could not write file: C:\......\.classpath

    最近因为换操作系统,把项目从Mac系统copy到了win10下,出现了不少项目部署启动上的问题.最开始的一个问题是:Could not write file: C:\......\.classpath ...

  7. echarts tooltip 自定义提示信息添加圆点

    tooltip自定义时,给文字前加圆点 tooltip: { formatter: '{b}<br /><span style="display:inline-block; ...

  8. [No0000E2]Vmware虚拟机安装 苹果系统 mac OS 10.12

    1.下载并安装Vmware:实验版本号:VMware-workstation-full-12.5.5-5234757:(忽略网上说的这个版本不行.可以装C盘,不过转C盘后后面都要用管理员权限运行其他软 ...

  9. hive拉链表

    前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...

  10. shell技巧之以逆序形式打印行

    测试文本内容如下: # cat textfile hadoop hdfs yarn spark zookeeper mapreduce hive hbase scala kafka CHAVIN my ...