Java使用Apache CXF开发Web Service

转自:http://blog.csdn.net/hu_shengyang/article/details/38384597


以前工作中也用CXF,但都是用别人现成搭好的环境,这次自己重头搭建一遍环境。过程中也有遇到的问题,也做了简单的整理。

对于CXF是干什么用的,我不想多说,大家都知道这是我们在java编程中webService技术的一种实现工具。我们说说为什么用CXF来实现webService:

1.      Java的webService实现本身就是一个很耗性能的实现方案(xml与java对象之间在服务端以及客户端的互转比较消耗性能)

2.      目前java主流的webService应用以CXF、AXIS2为主;

3.      通过网络渠道的了解,目前CXF的效率要比AXIS2高出至少50%;

4.      另外有一个webService的工具metro的效率比CXF高出10%;

5.      CXF的实现资料网上可以随便找出一大堆,metro的资料相对少一些;

6.      CXF在java应用实现中已经很成熟,企业更倾向于用这样一个成熟的解决方案;

基于以上原因,我选择CXF来实现webService。

参考资料:

Java Web 服务: CXF 性能比较----CXF 与最新版本的 Axis2 和 Metro 之间的性能对比

http://www.ibm.com/developerworks/cn/java/j-jws14/

 

一   以annotation注解方式实现发布webService应用

1、  基础环境

新建java web工程cxf之后,下载cxf工具包。解压CXF之后,把cxf工具包lib下的jar包全部放到工程的lib下。

此处用到的cxf工具包版本为:apache-cxf-2.7.12

下载地址:

http://www.apache.org/dyn/closer.cgi?path=/cxf/2.7.12/apache-cxf-2.7.12.zip

 

2、  编写服务接口

见文件HelloWorld.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.server;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.jws.WebParam;  
  6. import javax.jws.WebService;  
  7.   
  8. import com.hsy.pojo.User;  
  9.   
  10. @WebService  
  11. public interface HelloWorld {  
  12.     String sayHi(@WebParam(name="text")String text);  
  13.     String sayHiToUser(User user);  
  14.     String[] SayHiToUserList(List<User> userList);  
  15. }  


 

3、  服务接口实现

见文件HelloWorldImpl.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.server;  
  2.   
  3. import java.util.LinkedHashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import javax.jws.WebParam;  
  8. import javax.jws.WebService;  
  9.   
  10. import com.hsy.pojo.User;  
  11.   
  12. @WebService(endpointInterface="com.hsy.server.HelloWorld",serviceName="HelloWorld")  
  13. public class HelloWorldImpl implements HelloWorld {  
  14.     Map<Integer, User> users = new LinkedHashMap<Integer, User>();  
  15.   
  16.     public String sayHi(@WebParam(name = "text") String text) {  
  17.         return "Hello,"+text;  
  18.     }  
  19.   
  20.     public String sayHiToUser(User user) {  
  21.         users.put(users.size()+1, user);  
  22.         return "Hello,"+user.getName();  
  23.     }  
  24.   
  25.     public String[] SayHiToUserList(List<User> userList) {  
  26.         String[] result = new String[userList.size()];  
  27.         int i = 0;  
  28.         for(User u:userList){  
  29.             result[i] = "Hello " + u.getName();  
  30.             i++;  
  31.         }  
  32.         return result;  
  33.     }  
  34.   
  35.     /** 
  36.      * @param args 
  37.      */  
  38.     public static void main(String[] args) {  
  39.         // TODO Auto-generated method stub  
  40.   
  41.     }  
  42.   
  43. }  

4、  发布服务app

见文件webServiceApp.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.server;  
  2.   
  3. import javax.xml.ws.Endpoint;  
  4.   
  5. public class webServiceApp {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.          System.out.println("web service start");  
  12.          HelloWorldImpl implementor = new HelloWorldImpl();  
  13.          String address = "http://localhost:8080/helloWorld";  
  14.          Endpoint.publish(address, implementor);  
  15.          System.out.println("web service started");  
  16.     }  
  17.   
  18. }  



右键 run as 选择java application发布服务;然后在浏览器输入地址:http://localhost:8080/helloWorld?wsdl

如图:20140805132120.jpg


说明webService服务发布成功。

 

5、  客户端访问服务

见文件HelloWorldClient.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.client;  
  2.   
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  4.   
  5. import com.hsy.pojo.User;  
  6. import com.hsy.server.HelloWorld;  
  7.   
  8. public class HelloWorldClient {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.           
  15.         //首先右键run as 运行com.hsy.server.webServiceApp类,然后再运行这段客户端代码  
  16.         JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();  
  17.         jwpfb.setServiceClass(HelloWorld.class);  
  18.         jwpfb.setAddress("http://localhost:8080/helloWorld");  
  19.         HelloWorld hw = (HelloWorld) jwpfb.create();  
  20.         User user = new User();  
  21.         user.setName("马克思");  
  22.         user.setDescription("怀念马克思");  
  23.         System.out.println(hw.sayHiToUser(user));  
  24.           
  25.     }  
  26.   
  27. }  


右键 run as 选择java application,控制台打印如图:

20140805132610.jpg


Ok,客户端访问也成功了。

6、  附:

User.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.pojo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. @SuppressWarnings("serial")  
  6. public class User implements Serializable {  
  7.   
  8.     private String id;  
  9.     private String name;  
  10.     private String age;  
  11.     private String description;  
  12.       
  13.     public User() {  
  14.         super();  
  15.     }  
  16.   
  17.     public String getId() {  
  18.         return id;  
  19.     }  
  20.   
  21.     public void setId(String id) {  
  22.         this.id = id;  
  23.     }  
  24.   
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.   
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.   
  33.     public String getAge() {  
  34.         return age;  
  35.     }  
  36.   
  37.     public void setAge(String age) {  
  38.         this.age = age;  
  39.     }  
  40.   
  41.     public String getDescription() {  
  42.         return description;  
  43.     }  
  44.   
  45.     public void setDescription(String description) {  
  46.         this.description = description;  
  47.     }  
  48.       
  49.       
  50. }  


 

二与spring集成实现webService

1、  配置web.xml

见文件web.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>cxf</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.html</welcome-file>  
  6.     <welcome-file>index.htm</welcome-file>  
  7.     <welcome-file>index.jsp</welcome-file>  
  8.     <welcome-file>default.html</welcome-file>  
  9.     <welcome-file>default.htm</welcome-file>  
  10.     <welcome-file>default.jsp</welcome-file>  
  11.   </welcome-file-list>  
  12.     
  13.     <context-param>  
  14.         <param-name>contextConfigLocation</param-name>  
  15.         <param-value>WEB-INF/classes/applicationContext.xml</param-value>  
  16.     </context-param>  
  17.   
  18.     <listener>  
  19.         <listener-class>  
  20.               org.springframework.web.context.ContextLoaderListener  
  21.         </listener-class>  
  22.     </listener>  
  23.   
  24.     <servlet>  
  25.         <servlet-name>CXFServlet</servlet-name>  
  26.         <servlet-class>  
  27.                org.apache.cxf.transport.servlet.CXFServlet  
  28.         </servlet-class>  
  29.         <load-on-startup>1</load-on-startup>  
  30.     </servlet>  
  31.   
  32.     <servlet-mapping>  
  33.          <servlet-name>CXFServlet</servlet-name>  
  34.          <url-pattern>/webservice/*</url-pattern>  
  35.     </servlet-mapping>  
  36.     
  37.     
  38.     
  39.     
  40.   <!-- 字符过滤器 -->    
  41.     <filter>    
  42.         <filter-name>encoding</filter-name>    
  43.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    
  44.         <init-param>    
  45.             <param-name>encoding</param-name>    
  46.             <param-value>UTF-8</param-value>    
  47.         </init-param>    
  48.         <init-param>    
  49.             <param-name>forceEncoding</param-name>    
  50.             <param-value>true</param-value>    
  51.         </init-param>    
  52.     </filter>    
  53.         
  54.         
  55.     <filter-mapping>    
  56.         <filter-name>encoding</filter-name>    
  57.         <url-pattern>*.jsp</url-pattern>    
  58.     </filter-mapping>    
  59.     <filter-mapping>    
  60.         <filter-name>encoding</filter-name>    
  61.         <url-pattern>*.html</url-pattern>    
  62.     </filter-mapping>    
  63.     <filter-mapping>    
  64.         <filter-name>encoding</filter-name>    
  65.         <url-pattern>*.do</url-pattern>    
  66.     </filter-mapping>    
  67.     <filter-mapping>    
  68.         <filter-name>encoding</filter-name>    
  69.         <url-pattern>*.action</url-pattern>    
  70.     </filter-mapping>   
  71.     <filter-mapping>    
  72.         <filter-name>encoding</filter-name>    
  73.         <url-pattern>*.jsp</url-pattern>    
  74.     </filter-mapping>    
  75.     <filter-mapping>    
  76.         <filter-name>encoding</filter-name>    
  77.         <url-pattern>*.html</url-pattern>    
  78.     </filter-mapping>    
  79.     <filter-mapping>    
  80.         <filter-name>encoding</filter-name>    
  81.         <url-pattern>*.do</url-pattern>    
  82.     </filter-mapping>    
  83.     <filter-mapping>    
  84.         <filter-name>encoding</filter-name>    
  85.         <url-pattern>*.3g</url-pattern>    
  86.     </filter-mapping>     
  87.     
  88. </web-app>  


 

2、  配置applicationContext.xml

见文件applicationContext.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="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/jaxws   
  9.              http://cxf.apache.org/schemas/jaxws.xsd">  
  10.   
  11.       <import resource="classpath:META-INF/cxf/cxf.xml"/>  
  12.       <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>  
  13.       <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>  
  14.   
  15.       <jaxws:endpoint   
  16.              id="helloWorld"  
  17.              implementor="com.hsy.server.HelloWorldImpl"  
  18.              address="/helloWorld" />  
  19.   
  20.      <bean id="client"   
  21.             class="com.hsy.server.HelloWorld"   
  22.             factory-bean="clientFactory"   
  23.             factory-method="create"/>  
  24.   
  25.      <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">  
  26.             <property name="serviceClass" value="com.hsy.server.HelloWorld"/>  
  27.             <property name="address" value="http://localhost:8080/cxf/webservice/helloWorld"/>  
  28.      </bean>  
  29.        
  30. </beans>  


 

3、  修改客户端代码

见文件HelloWorldClient.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.hsy.client;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.springframework.beans.factory.BeanFactory;  
  7. import org.springframework.beans.factory.xml.XmlBeanFactory;  
  8. import org.springframework.context.ApplicationContext;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10. import org.springframework.core.io.FileSystemResource;  
  11. import org.springframework.core.io.Resource;  
  12.   
  13. import com.hsy.pojo.User;  
  14. import com.hsy.server.HelloWorld;  
  15.   
  16. public class HelloWorldClient {  
  17.   
  18.     /** 
  19.      * @param args 
  20.      */  
  21.     public static void main(String[] args) {  
  22.           
  23.         //Resource resource= new FileSystemResource("F:/workspaces4me2013/.metadata/.me_tcat/WEB-INF/classes/applicationContext.xml");     
  24.         //BeanFactory factory= new XmlBeanFactory(resource );   
  25.         ApplicationContext factory = new ClassPathXmlApplicationContext("/applicationContext.xml");  
  26.         HelloWorld client = (HelloWorld)factory.getBean("client");  
  27.         User user1 = new User();  
  28.         user1.setName("马克思");  
  29.         user1.setDescription("怀念马克思");  
  30.         User user2 = new User();  
  31.         user2.setName("恩格斯");  
  32.         user2.setDescription("怀念恩格斯");  
  33.         List<User> userList= new ArrayList<User>();  
  34.         userList.add(user1);  
  35.         userList.add(user2);  
  36.         String[] res = client.SayHiToUserList(userList);  
  37.         System.out.println(res[0]);  
  38.         System.out.println(res[1]);    
  39.           
  40.     }  
  41.   
  42. }  


 

4、  启动tamcat发布webService

然后在浏览器输入地址:http://localhost:8080/cxf/webservice/helloWorld?wsdl

如图:20140805133642.jpg


说明webService服务发布成功。

 

5、  运行客户端代码访问webService

右键 run as 选择java application,控制台打印如图:

20140805134838.jpg


Ok,客户端访问也成功了。

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

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

相关文章

程序员修神之路--kubernetes是微服务发展的必然产物

菜菜哥&#xff0c;我昨天又请假出去面试了战况如何呀&#xff1f;多数面试题回答的还行&#xff0c;但是最后让我介绍微服务和kubernetes的时候&#xff0c;挂了话说微服务和kubernetes内容确实挺多的那你给我大体介绍一下呗可以呀&#xff0c;不过要请和coffee哦◆◆kubernet…

.NET core3.0 使用Jwt保护api

摘要&#xff1a;本文演示如何向有效用户提供jwt&#xff0c;以及如何在webapi中使用该token通过JwtBearerMiddleware中间件对用户进行身份认证。认证和授权区别&#xff1f;首先我们要弄清楚认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#…

Java ArrayList的实现原理详解

ArrayList是Java List类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于ArrayList的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、ArrayList实现原理总结 ArrayList的实现原…

.NET开发者的机遇与Web Blazor基础(有彩蛋)

一.唠唠WebAssembly的发展历程目前有很多支持WebAssembly的项目&#xff0c;但发展最快的是Blazor&#xff0c;这是一个构建单页面的.NET技术&#xff0c;目前已经从Preview版本升级到了beta版本&#xff0c;微软计划在2020年5月发布Blazor的第一个版本。Blazor是什么&#xff…

Java LinkedList的实现原理详解

LinkedList是Java List类型的集合类的一种实现&#xff0c;此外&#xff0c;LinkedList还实现了Deque接口。本文基于Java1.8&#xff0c;对于LinkedList的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09…

知乎高赞:中国有哪些不错的开源软件产品?

点击蓝字“dotNET匠人”关注我哟加个“星标★”&#xff0c;每日 7:15&#xff0c;好文必达&#xff01;在知乎上&#xff0c;有个问题问“中国有什么拿得出手的开源软件产品&#xff08;在 GitHub 等社区受欢迎度较好的&#xff09;&#xff1f;”事实上&#xff0c;还不少呢~…

容器日志管理 (2) 开源日志管理方案 ELK/EFK

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。上一篇《容器日志管理&#xff08;1&#xff09;》中介绍了Docker自带的logs子命令以及其Logging driver&#xff0c;本篇将会介绍一个流行的开源日志管理方案ELK/EFK…

关于Scrum起源,读这一篇论文就足够啦!《新新产品开发游戏》

关于Scrum的起源&#xff0c;我们经常会提到1986年发表在HBR上的一篇论文&#xff0c;《The New New Product Development Game》&#xff0c;今天我们把它重新翻译&#xff0c;一起重温为何Scrum会如此设置3355&#xff1f;为何会用橄榄球的术语来代表Scrum&#xff1f;The Ne…

Java HashMap的实现原理详解

HashMap是Java Map类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于HashMap的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、HashMap实现原理总结 HashMap的实现原理总结如下…

ASP.NET Core快速入门(第5章:认证与授权)--学习笔记

点击蓝字关注我们课程链接&#xff1a;http://video.jessetalk.cn/course/explore良心课程&#xff0c;大家一起来学习哈&#xff01;任务31&#xff1a;课时介绍1.Cookie-based认证与授权2.Cookie-based认证实现3.Jwt认证与授权介绍4.Jwt认证与授权实现5.Jwt认证与授权6.Role …

Java HashSet的实现原理详解

HashSet是Java Map类型的集合类中最常使用的&#xff0c;本文基于Java1.8&#xff0c;对于HashSet的实现原理做一下详细讲解。 &#xff08;Java1.8源码&#xff1a;http://docs.oracle.com/javase/8/docs/api/&#xff09; 一、HashSet实现原理总结 HashSet的实现原理总结如下…

asp.net mvc 自定义 pager 封装与优化

asp.net mvc 自定义 pager 封装与优化Intro之前做了一个通用的分页组件&#xff0c;但是有些不足&#xff0c;从翻页事件和分页样式都融合在后台代码中&#xff0c;到翻页事件可以自定义&#xff0c;再到翻页和样式都和代码分离&#xff0c; 自定义分页 pager 越来越容易扩展了…

Java LinkedHashMap的实现原理详解

1. LinkedHashSet概述&#xff1a; LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于&#xff0c;后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序&#xff0c;该迭代顺序可为插入顺序或是访问顺序…

.net core 中通过 PostConfigure 验证 Options 参数

.net core 中通过 PostConfigure 验证 Options 参数Intro在 .net core 中配置项推荐用 Options 来实现&#xff0c;有一些参数可能必须是用由用户来配置&#xff0c;不能直接写成默认值的参数&#xff0c;这样就需要就 Options 中的参数做一些校验&#xff0c;否则程序内部可能…

Spring配置错误java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataS

在对Spring数据源dataSource配置之后&#xff0c;运行程序出现如下错误&#xff1a; java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy 原因是项目没有导入spring-jdbc的jar包。 如果使用maven&#xff0c;可以直接在pom…

.NET做人脸识别并分类

前言在游乐场、玻璃天桥、滑雪场等娱乐场所&#xff0c;经常能看到有摄影师在拍照片&#xff0c;令这些经营者发愁的一件事就是照片太多了&#xff0c;客户在成千上万张照片中找到自己可不是件容易的事。在一次游玩等活动或家庭聚会也同理&#xff0c;太多了照片导致挑选十分困…

.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端

.NET Core ❤ gRPC千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布&#xff0c;在它的众多新特性中&#xff0c;除了性能得到了大大提高&#xff0c;比较受关注的应该是 ASP.NET Core 3.0 对 gRPC 的集成了。它的源码托管在 grpc-dotnet 这个 Github 库中&#xff0c;由微软 .…

dotnet Blazor 用 C# 控制界面行为

微软很久就在做 Blazor 但是我现在才开始创建一个测试项目&#xff0c;我想用 C# 去控制 HTML 界面。小伙伴也许会问现在前端不是烂大街么&#xff0c;为什么还需要 Blazor 来做。可能原因只有一个&#xff0c;就是可以使用 C# 写脚本&#xff0c;代码比较清真用 VisualStudio …

2019年该学习哪门语言?建议学习C#语言

世界上只有少数几种语言是多功能的&#xff0c;而没有一个像C#那样干净整洁。作者 | Arctek译者 | 谭开朗&#xff0c;责编 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;最直接的答案是&#xff1a;值得。但我想你不是来找这样的答…

不一样的 SQL Server 日期格式化

不一样的 SQL Server 日期格式化Intro最近统计一些数据&#xff0c;需要按天/按小时/按分钟来统计&#xff0c;涉及到一些日期的格式化&#xff0c;网上看了一些文章大部分都是使用 CONVERT 来转换的&#xff0c;SQL Server 从 2012 开始增加了 FORMAT 方法&#xff0c;可以使用…