cxf简单例子
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简单例子的更多相关文章
- 使用 CXF 做 webservice 简单例子(转载)
使用 CXF 做 webservice 简单例子 Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这 ...
- 2种实现CXF方法例子
转载自:http://www.blogjava.net/sai5201314vicky/articles/353078.html 大家好,今天我要介绍的现实webservice的一种技术——CXF 由 ...
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- ko 简单例子
Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
随机推荐
- 一、K3 Wise 实施指导《K3 Wise实施手册》
1.总账期间启用后无法修改.固定资产期间启用后无法修改 ----修改总账 ' where fcategory='GL' and Fkey='startyear' --修改启用期间 ' where fc ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
- 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码
一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...
- FastJson 自定义Serialize、Parser
FastJson 自定义Serialize.Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是 ...
- mapper.xml中转义
1.用转义字符转义 XML转义字符 < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 <i ...
- CentOS7 下安装mysql历程
一.成功他妈的经历 背景(废话不用看):自己对Linux不是很熟悉,说难听点就是门都没有么到!基于这近年大数据之类的热闹话题,自己就想学习一下!开始下的是Minimal ISO这个版本,Vbox5虚拟 ...
- novnc安装教程
适配于centos7 1.安装vncserver # stop selinux and iptables setenforce systemctl stop firewalld systemctl d ...
- windows下批量生成文件夹
在windows环境下如果想要批量生成文件夹: 1.创建一个记事本文件 2.首行大写MD 3.后面加上你想创建的文件夹的名字,每个名字之间有空格 4.退出记事本并保存 5.将记事本文件后缀改为bat文 ...
- [No0000CB]如何在命令行(cmd)通过TCP/IP端口(port)查询所在的进程号(pid)或进程名称,并终止该进程
1)首先查找占用某个端口的进程PID netstat -ano | findstr [port] 2)根据该进程pid查询进程名称或标题,确认那个程序在占用该端口 tasklist /v | fi ...
- python-----双色球实现(实例1)
#输出用户指定组数的双色球信息,其中一组信息 6个红色号码获取范围(1-33),1个蓝色号码获取范围(1-16),要求一组信息中红球内号码不可重复 import randomdef get_ball( ...