使用 CXF 做 webservice 简单例子

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

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。

该框架提供了以下功能:

  • Web 服务标准支持:CXF 支持以下 Web 服务标准:
    • Java API for XML Web Services (JAX-WS)
    • SOAP
    • Web 服务描述语言(Web Services Description Language ,WSDL)
    • 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • 前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。
  • 工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。
  • RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)
  • 对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。
  • 对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。
  • code first 或者 xml first:支持使用code first 或者 xml first 的方式来创建web服务。

一 借助 annotation 创建独立启动的web 服务。

准备: 新建工程 导入需要的jar 包:

依赖的包:

commons-logging-1.1.jar
geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
jaxb-api-2.1.jar
jaxb-impl-2.1.6.jar
jaxws-api-2.1.jar
jetty-6.1.5.jar
jetty-util-6.1.5.jar
neethi-2.0.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.1.jar
XmlSchema-1.2.jar
xml-resolver-1.2.jar

spring jar包, 用来支持xml配置:

aopalliance-1.0.jar
spring-core-2.0.4.jar
spring-beans-2.0.4.jar
spring-context-2.0.4.jar
spring-web-2.0.4.jar

CXF jar包:

cxf-2.1.jar

以上jar 包 可从apache官方网站下载apache-cxf-2.1.2.zip, 然后从apache-cxf-2.1.2/lib 目录中获得

1 首先服务点接口。

[java]view plaincopy
  1. packagecom.demo;
  2. importjava.util.List;
  3. importjavax.jws.WebParam;
  4. importjavax.jws.WebService;
  5. @WebService
  6. publicinterfaceHelloWorld{
  7. StringsayHi(@WebParam(name="text")Stringtext);
  8. StringsayHiToUser(Useruser);
  9. String[]SayHiToUserList(List<User>userList);
  10. }

· 2 编写服务实现

[java]view plaincopy
  1. packagecom.demo;
  2. importjava.util.LinkedHashMap;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. importjavax.jws.WebService;
  6. @WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
  7. publicclassHelloWorldImplimplementsHelloWorld{
  8. Map<Integer,User>users=newLinkedHashMap<Integer,User>();
  9. publicStringsayHi(Stringtext){
  10. return"Hello"+text;
  11. }
  12. publicStringsayHiToUser(Useruser){
  13. users.put(users.size()+1,user);
  14. return"Hello"+user.getName();
  15. }
  16. publicString[]SayHiToUserList(List<User>userList){
  17. String[]result=newString[userList.size()];
  18. inti=0;
  19. for(Useru:userList){
  20. result[i]="Hello"+u.getName();
  21. i++;
  22. }
  23. returnresult;
  24. }
  25. }

3 编写 webServiceApp.java类来暴露 web服务。

[java]view plaincopy
  1. packagecom.demo;
  2. importjavax.xml.ws.Endpoint;
  3. publicclasswebServiceApp{
  4. publicstaticvoidmain(String[]args){
  5. System.out.println("webservicestart");
  6. HelloWorldImplimplementor=newHelloWorldImpl();
  7. Stringaddress="http://localhost:8080/helloWorld";
  8. Endpoint.publish(address,implementor);
  9. System.out.println("webservicestarted");
  10. }
  11. }

4 run webServiceApp.java 类来启动服务。 访问http://localhost:8080/helloWorld?wsdl 查看是否显示

wsdl。

5编写客户端访问服务。

[java]view plaincopy
  1. packagecom.demo;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  5. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  6. publicclassHelloWorldClient{
  7. publicstaticvoidmain(String[]args){
  8. JaxWsProxyFactoryBeansvr=newJaxWsProxyFactoryBean();
  9. svr.setServiceClass(HelloWorld.class);
  10. svr.setAddress("http://localhost:8080/helloWorld");
  11. HelloWorldhw=(HelloWorld)svr.create();
  12. Useruser=newUser();
  13. user.setName("Tony");
  14. user.setDescription("test");
  15. System.out.println(hw.sayHiToUser(user));
  16. }
  17. }

6测试: run webServiceApp.java 类来启动服务,然后 run HelloWorldClient.java 来访问服务。


二 集成到spring 中。

1 在 web.xml 中加入 :

[html]view plaincopy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-app>
  3. <welcome-file-list>
  4. <welcome-file>index.jsp</welcome-file>
  5. </welcome-file-list>
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>WEB-INF/classes/applicationContext.xml</param-value>
  9. </context-param>
  10. <listener>
  11. <listener-class>
  12. org.springframework.web.context.ContextLoaderListener
  13. </listener-class>
  14. </listener>
  15. <servlet>
  16. <servlet-name>CXFServlet</servlet-name>
  17. <display-name>CXFServlet</display-name>
  18. <servlet-class>
  19. org.apache.cxf.transport.servlet.CXFServlet
  20. </servlet-class>
  21. <load-on-startup>1</load-on-startup>
  22. </servlet>
  23. <servlet-mapping>
  24. <servlet-name>CXFServlet</servlet-name>
  25. <url-pattern>/webservice/*</url-pattern>
  26. </servlet-mapping>
  27. </web-app>

2 在 applicationContext.xml 中加入:

[html]view plaincopy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd">
  9. <importresource="classpath:META-INF/cxf/cxf.xml"/>
  10. <importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
  11. <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  12. <jaxws:endpoint
  13. id="helloWorld"
  14. implementor="com.demo.HelloWorldImpl"
  15. address="/helloWorld"/>
  16. <beanid="client"class="com.demo.HelloWorld"
  17. factory-bean="clientFactory"factory-method="create"/>
  18. <beanid="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
  19. <propertyname="serviceClass"value="com.demo.HelloWorld"/>
  20. <propertyname="address"
  21. value="http://localhost:8080/s/webservice/helloWorld"/>
  22. </bean>
  23. </beans>

注意: 这里需要加入 xmlns:jaxws="http://cxf.apache.org/jaxws"和

http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd

3 修改客户端。

[java]view plaincopy
  1. packagecom.demo;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  5. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  6. publicclassHelloWorldClient{
  7. publicstaticvoidmain(String[]args){
  8. HelloWorldclient=(HelloWorld)context.getBean("client");
  9. Useruser1=newUser();
  10. user1.setName("Tony");
  11. user1.setDescription("test");
  12. Useruser2=newUser();
  13. user2.setName("freeman");
  14. user2.setDescription("test");
  15. List<User>userList=newArrayList<User>();
  16. userList.add(user1);
  17. userList.add(user2);
  18. String[]res=client.SayHiToUserList(userList);
  19. System.out.println(res[0]);
  20. System.out.println(res[1]);
  21. }
  22. }

4 发布工程启动web服务器(我用 tomcat 6)。

5访问http://localhost:8080/s/webservice/helloWorld?wsdl查看是否显示 wsdl 。

6run run HelloWorldClient.java 来访问服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老司机整理对Nginx性能优化

Nginx性能优化应遵循一个原则:一次只调整一项,调整不理想,将修改还原。 Linux参数 Nginx很多功能直接使用操作系统实现,操作系统决定nginx上限。 现代linux内核(2.6+)涵盖了大多应用场景,查看linux内核日志,找出参数过低的提示消息,根据建议调整。 连接队列 若传入…

leetcode189. 旋转数组

给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例 2: 输…

Nginx 配置UDP负载均衡

Nginx 1.9.13开始支持UDP负载匀衡&#xff0c;现代应用通常使用多种协议&#xff0c;很多核心Internet协议都早于HTTP&#xff0c;支持UDP势在必行。 UDP常用于非事务性的轻量级协议&#xff0c;如&#xff1a;DNS、syslog、RADIUS。 这些协议对可靠性没有严格要求&#xff0…

leetcode191. 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;00000000000000000000000000001011 输出&#xff1a;3 解释&#xff1a;输入的二进制…

Nginx location执行顺序和匹配规则

nginx location执行顺序和匹配原则根据location的特点分为普通和正则两种,执行顺序和匹配规则的差异也在于此。 执行顺序 nginx会优先执行普通location,不管普通location是否匹配,都会再次转向执行正则location,一旦第一个正则location被满足,则停止向后执行。 匹配原则…

Nginx 配置TCP负载均衡

Nginx从1.9.0版本开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等鉴于Nginx在负载均衡和web service上的成功,和Nginx良好的框架,stream模块前景一片光明。 Nginx的stream模块默认不会自带安装,需要编译安装的时候手动添加上这个模块,不过我的系…

leetcode162. 寻找峰值 变种二分见过吗

峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums&#xff0c;其中 nums[i] ≠ nums[i1]&#xff0c;找到峰值元素并返回其索引。 数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个峰值所在位置即可。 你可以假设 nums[-1] nums[n] -…

(十九)TCPIP面试宝典-进入大厂必备总结(上)

TCP 作为传输层的协议,是一个IT工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。 实际上这篇文章相当于是复习之前的网络基础部分。只不过这篇文章的提问方式更灵活,也是让读者们懂得变通,更熟悉TCP。 TCP 和 U…

leetcode348. 判定井字棋胜负 好麻烦的代码

请在 n n 的棋盘上&#xff0c;实现一个判定井字棋&#xff08;Tic-Tac-Toe&#xff09;胜负的神器&#xff0c;判断每一次玩家落子后&#xff0c;是否有胜出的玩家。 在这个井字棋游戏中&#xff0c;会有 2 名玩家&#xff0c;他们将轮流在棋盘上放置自己的棋子。 在实现这…

C++:17---sizeof运算符

功能:以字节位单位,返回一个表达式或一个数据类型所占的字节数返回值类型:是size_t类型sizeof有无括号:sizeof不加括号,后面不可以直接跟数据类型sizeof加括号,后面既可以跟表达式也可以跟数据类型注意事项对引用类型执行sizeof运算得到被引用对象所占空间的大小对指针执…

leetcode345. 反转字符串中的元音字母

编写一个函数&#xff0c;以字符串作为输入&#xff0c;反转该字符串中的元音字母。 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leetcode" 输出: "leotcede" 说明: 元音字母不包含字母"y"。 思路&#xff1a…

Redis:10---List对象

一、列表对象概述列表类型是用来存储多个有序的字符串&#xff0c;一个列表最多可以存储多个元素。列表是一种比较灵活的数据结构&#xff0c;它可以充当栈和队列的角色&#xff0c;在实际开发上有很多应用场景特点&#xff1a;一个列表可以存储多个字符串&#xff0c;相同元素…

Redis:09---Hash对象

一、哈希对象简介几乎所有的编程语言都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组哈希又称散列在Redis中&#xff0c;哈希类型是指键值本身又是一个键值对结构&#xff0c;形如value{{field1&#xff0c;value1}&#xff0c…

leetcode329. 矩阵中的最长递增路径

给定一个整数矩阵&#xff0c;找出最长递增路径的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你不能在对角线方向上移动或移动到边界外&#xff08;即不允许环绕&#xff09;。 示例 1: 输入: nums [ [9,9,…

Query Ajax 实例 ($.ajax、$.post、$.get)

Jquery在异步提交方面封装的很好&#xff0c;直接用AJAX非常麻烦&#xff0c;Jquery大大简化了我们的操作&#xff0c;不用考虑浏览器的诧异了。 推荐一篇不错的jQuery Ajax 实例文章&#xff0c;忘记了可以去看看&#xff0c;地址为&#xff1a;http://www.cnblogs.com/yeer/a…

C++:18---const关键字(附常量指针、指针常量、常量指针常量)

一、const变量的一些基本特点 ①const修饰的变量不能被修改const int a=10; a=20;//错误②因为const修饰的变量不能被修改,所以必须被初始化int a=10; const int b=a; //正确 const int c=10; //正确③const修饰的变量可以赋值给其他值const int a=10; int b=a;//正确④可以有…

C:01---数据类型与ASCII

一、整型 int 取值范围:-32768~32767unsigned int 取值范围:0~65535short /short int 取值范围:比int小unsigned short 无符号短整型long 长整型定义时,后面加上l或L有符号与无符号数: unsigned:无符号数,一般用来表示数据signed:有符号数,一般用来表示数字整型占…

leetcode330. 按要求补齐数组 顶级难度玄学贪心

给定一个已排序的正整数数组 nums&#xff0c;和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中&#xff0c;使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。 示例 1: 输入: nums [1,3], …

C:02---scanf、printf

一、printf 控制符 ①精度控制:输入小数点后m位(%.mf)。右对齐5位,保留小数点后m位(%d.mf)%f、%lf默认输出6位小数②宽度:%md(打印m为,右对齐,多出m位照常打印)。%-md(打印m位,左对齐,多出m位照常打印)③长度:h表示短(打印短整型short:%hd),l表示长(打印长…

C++:20---成员变量初始化方式

成员变量初始化有三种方式: 在构造函数体内赋值初始化在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化)在构造函数的成员初始化列表初始化一、构造函数体内初始化 说明:在构造函数体内的初始化方式,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要…