webservice之cxf样例

整理參考于网上资源:

http://wenku.baidu.com/link?url=MbPPOKCficQCAwSZduszpMFSD3f8xCKeNz6YUtwFS1TkHharz1aPPfkXD_n8vZZ4sBDjevk74jlp9fUZZ1DH9XcjrvqTsN747D-EtZPPNKm

http://www.cnblogs.com/frankliiu-java/articles/1641949.html

Web Service的长处:

1)平台无关。无论你使用什么平台,都能够使用Web service。

2)编程语言无关。仅仅要遵守相关协议,就能够使用随意编程语言,向其它站点要求Web service。这大大添加?了web service的适用性,减少了对程序猿的要求。

3)对于Web service提供者来说,部署、升级和维护Web service都很单纯,不须要考虑client兼容问题,并且一次性就能完毕。

4)对于Web service使用者来说,可以轻易实现多种数据、多种服务的聚合(mashup),因此可以做出一些曾经根本无法想像的事情。

CXF的优势:

Apache CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,不仅提供了对 JAX-WS 全面的支持,而且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,而且能够依据实际项目的须要,採用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的公布和使用。而且能够天然的和Spring进行无缝集成。Apache CXF已经是一个正式的Apache顶级项目。

Jar包下载:去Apache CXF官网http://cxf.apache.org/download.html下载apache-cxf-X.X.X.zip,解压获得apache-cxf-X.X.X/lib下所以jar包。

一:服务端开发

1.首先服务接口。

package com.demo;

import java.util.List;

import javax.jws.WebParam;

import javax.jws.WebService;

@WebService

public interface HelloWorld {

String sayHi(@WebParam(name="text")String text);

String sayHiToUser(User user);

String[] SayHiToUserList(List<User> userList);

}

2.编写服务实现

package com.demo;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import javax.jws.WebService;

@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")

public class HelloWorldImpl implements HelloWorld {

Map<Integer, User> users = new LinkedHashMap<Integer, User>();

public String sayHi(String text) {

return "Hello " + text;

}

public String sayHiToUser(User user) {

users.put(users.size()+1, user);

return "Hello "+ user.getName();

}

public String[] SayHiToUserList(List<User> userList) {

String[] result = new String[userList.size()];

int i=0;

for(User u:userList){

result[i] = "Hello " + u.getName();

i++;

}

return result;

}

}

3.公布服务

方法一:使用Sun JAX-WS 2中Endpoint.publish进行公布。(不须要其它配置与

包)

Endpoint endpoint =

Endpoint.publish("http://localhost:8080/WSCXF/helloService",  new HelloServiceImpl());//这里是实现类 System.out.println("WS公布成功!");

方法二:用CXF的JaxWsServerFactoryBean类进行公布。(须要CXF相关包)

HelloServiceImpl impl = new HelloServiceImpl();

JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.setAddress("http://localhost:8080/WSCXF/helloService"); factoryBean.setServiceClass(IHelloService.class);//接口类 factoryBean.setServiceBean(impl); factoryBean.create();

System.out.println("WS公布成功!");

方法三:利用cxf和spring整合在tomcat下进行公布。

详细方法在后面的spring整合cxf时讲到。

方法四:重写loadBus方法。

书写一个类覆盖org.apache.cxf.transport.servlet.CXFNonSpringServlet的loadBus方法指定BUS以及公布你的web服务。

详细可查阅资料:

http://blog.csdn.net/zq9017197/archive/2010/12/26/6099684.aspx

4.查看web服务是否公布成功:

方法一二四訪问http://localhost:8080/WSCXF/helloService?wsdl 查看wsdl文件,方法三在后面的spring整合cxf时讲到。

二:client调用

方法一:使用标准的JAX-WS的API完毕client调用(不须要导入不论什么CXF包)

//注意。此处http://service.jaxb.com/ 来源于wsdl文件里targetNamespace

QName qName =  new QName("http://service.jaxb.com/","HelloServiceImplService");

HelloServiceImplService helloServiceImplService =  new HelloServiceImplService(

new URL("http://localhost:8080/WSCXF/helloService?wsdl"),qName);

IHelloService helloService  =(IHelloService)helloServiceImplService.getPort(IHelloService.class);

方法二:使用CXF中JaxWsProxyFactoryBeanclient代理工厂调用web服务(须要导入CXF相关包)

JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();

soapFactoryBean.setAddress("http:// localhost:8080/WSCXF/helloService");

soapFactoryBean.setServiceClass(IHelloService.class);

Object o = soapFactoryBean.create();

IHelloService helloService = (IHelloService)o;

方法三:

String endPointAddress = "http:// localhost:8080/WSCXF/helloService";

Service service = Service.create(

new QName("http://service.jaxb.com/","IHelloService"));

service.addPort(

new QName("http://service.jaxb.com/", "IHelloServicePort"), SOAPBinding.SOAP11HTTP_BINDING, endPointAddress);

IHelloService helloService = service.getPort(IHelloService.class);

方法四:(须要导入CXF相关包)

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

org.apache.cxf.endpoint.Client client =  dcf.createClient("http://127.0.0.1:8080/WSCXF/helloService?wsdl");

//sayHello 为接口中定义的方法名称   张三为传递的參数   返回一个Object数组

Object[] objects=client.invoke("sayHello", "张三");

//输出调用结果

System.out.println(objects[0].toString());

三、CXF和Spring整合服务端开发

1)新建web项目,并加入?相关包。(包含spring和cxf相关包) 2)写好一个接口和实现类。(见demo) 3)新建beans.xml文件。

<?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">

<!-- spring公布web服务配置 -->

<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" />

<bean id="helloService" class="com.jaxb.service.HelloServiceImpl" />  <!--

<bean id="helloService" class="com.aegis.service.HelloServiceImpl" />  -->

<!-- endpoint 方式公布web服务和 server方式一样 -->  <!--

<jaxws:endpoint id="helloServiceWs" address="/helloService"   implementor="#helloService" />

-->  <!--   还有一种写法,建议不要用这样的方法 ,假设实现类有的属性要通过spring依赖注入的话,   这样的方法仅仅是简单的new个实现类,他的属性没有通过spring依赖注入给注入值  -->  <!--

<jaxws:endpoint id="helloServiceWs" address="/helloService"   implementor="com.jaxb.service.HelloServiceImpl" />

-->

<!—以下这个是wss4j的配置,后面会讲到相关知识,须要配置在spring配置文件里 -->  <!-- wss4j 服务端配置 -->

<bean id="wss4jInInterceptor"  class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">

<constructor-arg>

<map>

<entry key="action" value="UsernameToken" />

<!-- <entry key="passwordType" value="PasswordText" /> -->     <!-- 密码使用MD5密文发送 -->

<entry key="passwordDigest" value="PasswordText" />

<entry key="passwordCallbackClass"  value="com.security.service.ServerPasswordCallbackHandler" />

</map>

</constructor-arg>

</bean>

<jaxws:server id="helloServiceWs" address="/helloService">   <jaxws:serviceBean>

<ref bean="helloService" />

</jaxws:serviceBean><!-- 使用这样的方法公布web服务 -->   <jaxws:inInterceptors>

<ref bean="wss4jInInterceptor" />

</jaxws:inInterceptors><!—wss4j配置 -->   <!-- <jaxws:serviceFactory>

<ref bean="jaxWsServiceFactoryBean" />

</jaxws:serviceFactory>  --><!—数据绑定方式配置 -->

</jaxws:server>

<!-- 通过Spring创建数据绑定的类-->

<!-- <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" />     <bean id="jaxWsServiceFactoryBean"

class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">         <property name="wrapped" value="true" />         <property name="dataBinding" ref="aegisBean" />     </bean> --> </beans>

4)配置web.xml

<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>

<!—在tomcat中公布须要配置servlet -->

<servlet>

<servlet-name>CXFServlet</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>CXFServlet</servlet-name>

<url-pattern>/ws/*</url-pattern>

</servlet-mapping>

5)公布web项目

由于在web.xml里面配置了servlet,则能够将项目公布到tomcat下,启动tomcat就可以。

6)訪问wsdl

http://localhost:8080/WSCXF/ws/helloService?wsdl

四、CXF和Spring整合client调用

1)新建一个webclient项目,用wsdl2java生成client代码。将生成的client代码复制到src下。加入?spring相关包。

2)配置spring配置文件。

beans.xml存放在src文件夹下,详细配置例如以下:

<?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">

<!-- wss4j 配置在client,后面有讲到相关知识 -->

<!-- wss4j client配置 -->  <bean id="wss4jOutInterceptor"

class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">

<constructor-arg>

<map>

<entry key="action" value="UsernameToken" />

<entry key="user" value="Fetion" />

<!-- <entry key="passwordType" value="PasswordText" /> -->     <!-- 密码使用MD5密文发送 -->

<entry key="passwordDigest" value="PasswordText" />

<entry key="passwordCallbackClass" value="com.security.client.ClientPasswordCallbackHandler" />

</map>

</constructor-arg>

</bean>

<jaxws:client id="helloServeiceClient"   address="http://localhost:8080/WSCXF/ws/helloService" serviceClass="com.jaxb.client.IHelloService">

<jaxws:outInterceptors>

<ref bean="wss4jOutInterceptor" />

</jaxws:outInterceptors><!-- wss4j client配置-->

</jaxws:client>

</beans>

2) 调用web服务 在main方法中执行:

ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");//此处beans.xml放在src下,也须要放在其它文件夹下,但须要注明清楚

//获取webservice服务的操作接口

IHelloService helloService = (IHelloService)app.getBean("helloServeiceClient");

五、基于soap的web服务的WS-Security安全规范

很多其它请參考原文档:

http://wenku.baidu.com/link?url=MbPPOKCficQCAwSZduszpMFSD3f8xCKeNz6YUtwFS1TkHharz1aPPfkXD_n8vZZ4sBDjevk74jlp9fUZZ1DH9XcjrvqTsN747D-EtZPPNKm

时间: 2024-10-29 19:07:18

webservice之cxf样例的相关文章

Android平台调用Web Service:演示样例

近期在学习Android,随着移动设备的流行,当软件走上商业化的道路.为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛.懂点Android.管理起来easy些. Android学起来也简单,封装的更好了,一个个的控件,像是又回到了VB的赶脚. 以下将通过一个演示样例解说怎样在Android平台调用Web Service. 我们使用互联网现成的Webservice.供查询手机号码归属地的Web service,它的WSDL为htt

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

ADF Faces导出Excel文件【附样例工程】

本文提供一个基于ADF Face组件开发样例工程,工程的实现过程分为3个部分以应对Excel导出开发中常见的处理. 1.空模版文件下载:将Excel文件视为普通文件提供下载操作. 2.数据文件输出,将数据内容输出为Excel文件,目标文件尽在服务端内存中存在,这种方式需要对Excel文件的内容处理,需要引入响应的类库. 3.模版文件填充数据后下载,基于服务端的物理文件为模板,将业务数据填入约定位置后提供下载,在实现方面需要为工作簿对象指定源文件输入流,并完成后续内容处理. 实现的基本思路,由AD

使用GPC分解多边形样例(Generic Polygon Clipper)

使用GPC分解多边形 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源) GPC: Generic Polygon Clipper GPC支持分解多边形.多边形求差集.交集,异或.并集 GPC_DIFF,                         /* Difference                        */ GPC_INT,                          /* Intersection    

Apache Tomcat样例目录session操纵漏洞

0x00   背景 前段时间扫到的漏洞,研究了下,感觉挺有意思的,发出来和大家分享下,有啥不对的地方还请各位拍砖指正. Apache Tomcat默认安装包含"/examples"目录,里面存着众多的样例,其中session样例(/examples/servlets/servlet/SessionExample)允许用户对session进行操纵.因为session是全局通用的,所以用户可以通过操纵session获取管理员权限. 案例:http://www.wooyun.org/bugs

最大熵算法及简单样例

近期在学模式识别,正在看Introduction to Pattern Recognition这本书,挺不错的一本书.好.以下和大家一起来学习最大熵算法. 首先,最大熵算法是干什么的呢?通常是用来预计一个分布,至于把分布预计出来之后用来干什么,那要视详细问题而定. 那这里的"熵"是什么意思呢?它是指信息熵,一个分布的均匀程度能够用熵的大小来衡量.熵越大,就越均匀.而最大熵就是要求在满足特定约束下,分布是什么样的时候.熵最大.也就是越均匀越好. 为什么在满足特定约束下越均匀越好?由于你已

LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例

二次联通门 : LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例 /* LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例 很显然 贪心方程哦不 dp方程为 f[i][j]=f[i-1][j-k*k] 但是这样的话复杂度就是O(N ^ 5) 那么就用bitset优化一下 就ok了 */ #include <iostream> #include <cstdio> #include <bitset> void

Java向上转型和向下转型(附具体样例)

                                            Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override publ

Relation Extraction中SVM分类样例unbalance data问题解决 -松弛变量与惩罚因子

转载自:http://blog.csdn.net/yangliuy/article/details/8152390 1.问题描述 做关系抽取就是要从产品评论中抽取出描述产品特征项的target短语以及修饰该target的opinion短语,在opinion mining里面属于很重要的task,很多DM.NLP相关的paper在做这方面的工作.基本的思路是: (1)从sentence的parse tree(比如stanford parser)中选取候选target结点和候选opinion结点,然