学习CXF WebService入门实例一
用CXF开发RESTful风格WebService
用CXF开发RESTful风格WebService目录1RESTful简要介绍 (1)2开发一个普通的接口 (1)2.1定义DTO (1)2.2定义接口 (2)2.3实现类 (2)3开发RESTful风格WebService服务端 (2)3.1定义资源(定义DTO) (2)3.2开发接口 (3)3.3实现类 (4)3.4配置CXF(整合Spring) (4)3.4.1接口的Spring配置文件 (4)3.4.2CXF的Spring配置文件 (4)3.4.3修改web.xml (5)4开发RESTful风格WebService客户端(Java) (5)4.1定义客户端接口 (5)4.2定义实现类 (6)1RESTful简要介绍RESTful风格的WebService之所以当下如此流行,是由于其相对于SOAP风格的WebService 更简洁、更轻量级,REST风格的WebService传输的是JSON或极其简洁的XML,因而其效率和性能都比较理想。
RESTful风格的WebService主张重用HTTP协议,面向资源编程(ROA)。
扼要的说,RESTful 风格WebService中,每一个URL即表示一个资源,比如/employees/1表示id为1的员工。
1.如果对此URL调用HTTP GET方法,则返回员工的XML形式;2.如果对此URL调用HTTP POST/PUT方法,则可以新增或者修改此员工;3.如果对此URL调用HTTP DELETE方法,则可以删除此员工;因此,我们在设计一个RESTful风格的接口时,一定要拥有面向资源设计的考量!此外,在实现接口的过程中,要遵循RESTful风格的几个特性,他们分别是:1.无状态性:HTTP本身即是无状态协议,因此RESTful天然的具备无状态性,具备优良的水平扩展能力!2.幂等性:GET/PUT/DELETE方法具备此特性,幂等性可概述为无论重复调用多少次,其结果都一致!POST例外,不过设计的时候也可以按照此特性设计!3.唯一性:即URL地址要唯一的表示一个资源!关于事务、安全等更多的高级特性这里不阐述,有兴趣的可参考《Restful Web Service中文版》一书。
CXF WEB service 框架学习笔记
/docs/index.html/注意,在非java-project中,例如在web-project中可能出现(activation.jar和mail.jar)与工程中的j2ee.jar以及myeclipse中D:\MyEclipse 5.5.1 GA\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\data\libraryset\EE_5的javaee.jar里面的同名包发生冲突,建议把j2ee.jar和javaee.jar中的同名包删除,或者直接使用J2ee.jar把eclipse自带的javaee.jar从工程中去除并加入相应的包1.WSDL2JA V A生成客户端代码2.JAXB3.JAX-WS4.WS-Addressing5.WS-Policy6.WS-Security7.webservice 注释8.拦截器WSDL2JA V A生成客户端代码CXF支持代码生成1)Java to WSDL 、2)WSDL to Java 、3)XSD to WSDL 、4)WSDL to XML5)WSDL to SOAP 、6)WSDL to service如下:D:\apache-cxf-2.2.5\bin>wsdl2java -d d:/cxf-client -p example1.client http://127.0.0.1:8080/ws/HelloWorld?wsdlJAXB/group/10141/topic/12028CXF默认的数据绑定使用的JAXB,XFIRE使用Aegis替代数据绑定就是把java对象转化为xml和把xml文件转化为java对象不管使用任何的XML解析代码库(dom4j等),对于xml只是一个解析工作而已,不能马上绑定到java 对象。
对于对象,每次都需要set 或者get相应的属性,当然也可以使用map 来保存xml配置。
webservice简单实例
首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓,甚至它本身并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们最需要关注的东西---资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和SiteBService.两个服务间没有任何关系,内部提供的方法也完全没关联,只是需要把方法如何使用告诉ServiceGatherSite,意思是,服务只提供查询接口,返回的数据如何处理,服务本身并不管,全由使用服务的站点分配.写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构,下篇文章,我们将开始真正进入代码的设计阶段.上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice 项目(文件->新建->项目->C#->Web服务应用程序)建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不关注,因此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:[WebMethod(Description="最简单的方法")]public string HelloWorld(){return "Hello World";}这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.[WebMethod(Description="查询以获取需要的课件信息")]public XmlDataDocument GetSiteAData(string AssignName){XmlDataDocument xd=new XmlDataDocument(); //DataSet ds=new DataSet();CStoreProc cp=new CStoreProc("SearchAssign");cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);cp.AddParOut("@res",SqlDbType.Int);if(cp.SelectProc()) //如果执行成功,存储过程{cp.myData.EnforceConstraints=false; //不进行格式严格检查if((int)cp.GetReturnValue("@res")==-1){string xml="<NewDataSet></NewDataSet>";xd.LoadXml(xml);return xd;}xd=new XmlDataDocument(cp.myData);XmlNode root1=xd.DocumentElement;XmlNodeList roots=root1.SelectNodes("list");foreach(XmlNode roota in roots) //为所有元素加上站点名称标记{XmlElement Link=xd.CreateElement("SiteName");Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();roota.AppendChild(Link);}return xd;}else return null;}这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显然满足条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml 数据的传输来示例.在下篇文章,我们将深入解析webservice的精髓---xml 数据传输.今天不早了,早点睡了:)接上篇文章,我们先简单解释下GetSiteAData(string AssignName)函数.函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返回一个空记录.否则,我们把查询后的dataset生成一个XmlDataDocument,接下来,由于该项目的需要,我加入了一个循环,添加dataset里所没有的节点,站点名称.在这之后,算是完成了一个符合我们期望格式的xml数据文档,我们把它返回.好了,webservice的方法函数介绍完了(这里还有个web服务方法,稍后介绍),接下来我们的任务是怎么调用它了.首先把webservice的项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文件,执行GetSiteAData(string AssignName)方法,将提示你输入参数,你输入要搜索的内容,点确认,将返回给你一个xml数据,并在ie上显示出来,这就是你搜索到的内容拉.这里对ServiceA的工作再做点介绍,在我们这个项目里,它是资源站点A提供的服务,意思是,它查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式我强烈建议调试时使用,非常方便.右击引用,点添加web引用,输入你的webservice地址,如:http://localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA,那服务的实例化将是这样:SiteA.Service1 serviceA=newSiteA.Service1();(Service1是服务的类名).完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A 站点的信息)//绑定数据public void BindData(){serviceA=new SiteA.Service1();DataSet ds=new DataSet();XmlNode xmlNode1;XmlDataDocument xd=new XmlDataDocument();StringBuilder xmlString1;xmlNode1=serviceA.GetSiteAData(strSearch);if(xmlNode1==null) //--存储过程执行失败return;xmlString1=new StringBuilder(xmlNode1.OuterXml);if(xmlString1.ToString().Equals("<NewDataSet xmlns=\"\"></NewDataSet>"))return ;xd.LoadXml(xmlString1.ToString());ds.ReadXml(new XmlNodeReader(xd));DataGrid1.DataSource=ds.Tables["list"].DefaultView;DataGrid1.DataBind();}此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在 里,dataset占的作用之重,谁都知道的.其他的请朋友们先看(呵呵,个中高手就免了),在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案,写了三篇了,发现似乎还是有些朋友看的,那我就献丑继续写下去好了,大家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)好了,时候不早了,休息去了,下次有时间继续:)架设webservice简单实例2009-08-24 19:22具体步骤如下:一、打开VS。
java使用CXF将wsdl文件生成客户端代码命令java调用第三方的webservice应用实例
java使用 CXF将 wsdl文件生成客户端代码命令 java调用第三方的 webservice应 用 实 例
cxf生成客户端代码 3、使用wsdl2java命令生成客户端代码 在命令行执行wsdl2java -p org.logink.ws -d f:\logink\src -all E:\wsdl3.1-credit\LogisticsCreditService\LogisticsCreditService.wsdl
wsdl2java用法: wsdl2java -p com -d src -all aa.wsdl -p 指定其wsdl的命名空间,也就是要生成代码的包名: -d 指定要产生代码所在目录 -client 生成客户端测试web service的代码 -server 生成服务器启动web service的代码 -impl 生成web service的实现代码 -ant 生成build.xml文件 -all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
webservice接口调用示例
webservice接口调用示例WebService接口是一个用于数据交互的网络服务,其接口通常使用HTTP或HTTPS方式调用。
以查询天气信息为例,下面是一个使用WebService接口调用的示例:1. 首先,我们需要获取天气查询接口的地址和参数。
这些信息通常可以在接口提供方的文档中找到。
2. 我们可以使用类似cURL、Python的requests库等工具来发送HTTP请求。
以requests库为例,我们可以在代码中添加如下语句导入requests库:```import requests```3. 接下来,我们需要发送HTTP GET请求获取天气信息。
代码示例如下:```url = '/currentconditions/v1/'payload = {'apikey': 'YOUR_API_KEY', 'location': 'beijing'} response = requests.get(url, params=payload)```4. 上述代码中,我们指定了接口的地址`url`和查询参数`payload`。
此外,我们还需要向接口提供方获取一个API Key,以便进行认证。
5. 接下来,我们可以通过解析服务端响应中的JSON数据获取天气信息。
代码示例如下:```data = response.json()weather_info = data[0]['WeatherText']temperature = data[0]['Temperature']['Metric']['Value']```6. 上述代码中,我们将服务端响应中的JSON数据解析,并获取其中的天气信息和温度信息。
7. 最后,我们可以将结果展示给用户或者进行其他处理。
```result = '北京的天气为{},温度为{}度'.format(weather_info, temperature)print(result)```请注意,上述代码仅为示例,实际的WebService接口调用可能需要进行更多的参数配置和错误处理。
Java调用CXFWebService接口的两种方式实例
Java调⽤CXFWebService接⼝的两种⽅式实例1.静态调⽤// 创建WebService客户端代理⼯⼚JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();// 判断是否抛出异常factory.getOutInterceptors().add(new LoggingInInterceptor());// 注册webservice接⼝factory.setServiceClass(DeductionService.class);// 配置webservice地址factory.setAddress("http://localhost:7002/card/services/HelloWorld?wsdl");// 获得接⼝对象CxfService service = (CxfService) factory.create();// 调⽤接⼝⽅法String result = service.sayHello("aaaaaaaaaa");System.out.println("调⽤结果:" + result);// 关闭接⼝连接System.exit(0);2.动态调⽤:JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:7002/card/services/HelloWorld?wsdl");// url为调⽤webService的wsdl地址QName name = new QName("/", "sayHello");// namespace是命名空间,methodName是⽅法名String xmlStr = "aaaaaaaa";// paramvalue为参数值Object[] objects;try {objects = client.invoke(name, xmlStr);System.out.println(objects[0].toString());} catch (Exception e) {e.printStackTrace();}区别:静态调⽤需要依赖service类,因为客户端调⽤cxf webservice接⼝的过程中需要服务器端提供service,很不⽅便,如果同⼀个项⽬中则没有区别。
WebService学习入门教程
WebService1 解决几个问题?2 什么是WebService?3 它能做什么?为什么要学习WebService?学习WebService要达到什么目的?简单的网络应用:先理解什么是服务:现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。
更别说只使用一种语言了。
大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。
目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。
既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!---WebService复杂的网络应用:对几个问题的回答:1.WebService,顾名思义就是基于Web的服务。
它使用Web(HTTP)方式,接收和响应外部系统的某种请求。
从而实现远程调用.2.我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已。
3.学习WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
在开始之前必须要让先了解几个名词:名词1:XML. Extensible Markup Language -扩展性标记语言XML,用于传输格式化的数据,是Web服务的基础。
excel中webservice用法
excel中webservice用法在Excel中,可以使用Web服务来获取或更新来自Web服务器的数据。
通过使用Web服务功能,可以通过简单的函数调用来获取数据,而无需编写复杂的代码。
要在Excel中使用Web服务,首先需要确定要访问的Web服务的URL。
然后,可以使用"WEBSERVICE"函数来获取此URL返回的数据。
下面是使用WebService的步骤:1. 打开Excel并在单元格中输入要访问的Web服务的URL。
例如,假设我们想要获取一个返回当天天气预报的Web服务的数据,我们可以将该URL输入到单元格A1中。
2. 在要获取数据的单元格中,使用"WEBSERVICE"函数来调用Web服务。
函数的语法为:`=WEBSERVICE(url)`。
在我们的例子中,我们可以在B1单元格中输入`=WEBSERVICE(A1)`。
3. 按下Enter键后,Excel将通过发送HTTP请求到指定的URL,并将返回的数据显示在B1单元格中。
4. 如果需要将返回的数据解析为特定的格式,可以使用Excel的其他函数来进一步处理。
例如,可以使用"FILTERXML"函数来解析XML数据,或使用"JSON"函数来处理JSON数据。
需要注意的是,如果Web服务返回的数据需要身份验证或其他参数,可以在URL中包含这些参数。
也可以在URL后面添加查询字符串,将参数传递给Web服务。
使用Excel中的Web服务功能,可以轻松地从Web服务器获取所需的数据,并将其与其他Excel函数和功能结合使用。
这使得在Excel中进行数据分析和报告生成变得更加便捷和高效。
希望以上内容对您有所帮助!如果还有任何问题,请随时提问。
WebService案例Springboot+CXF开发WebServiceDemo
WebService案例Springboot+CXF开发WebServiceDemo ⼀、本次开发除了⽤到spring boot基础jar包外,还⽤到了cxf相关jar包:1 <!-- cxf⽀持 -->2 <dependency>3 <groupId>org.apache.cxf</groupId>4 <artifactId>cxf-rt-frontend-jaxws</artifactId>5 <version>3.1.6</version>6 </dependency>7 <dependency>8 <groupId>org.apache.cxf</groupId>9 <artifactId>cxf-rt-transports-http</artifactId>10 <version>3.1.6</version>11 </dependency>⼆、⾸先我们创建⼀个实体类,内容是关于⽤户信息的查询和记录:1 import java.io.Serializable;2 import java.util.Date;34 public class User implements Serializable {56 private static final long serialVersionUID = -5939599230753662529L;7 private String userId;8 private String username;9 private String age;10 private Date updateTime;11 //getter setter ......12 public void setUserId(String userId) {13 erId=userId;14 }15 public void setUsername(String username) {16 ername=username;17 }18 public void setAge(String age) {19 this.age=age;20 }21 public void setUpdateTime(Date updateTime) {22 this.updateTime=updateTime;23 }242526 public String getUserId() {27 return userId;28 }29 public String getUserName() {30 return username;31 }32 public String getAge() {33 return age;34 }35 public Date getUpdateTime() {36 return updateTime;37 }38 }三、接下来我们创建接⼝类:1 import javax.jws.WebMethod;2 import javax.jws.WebParam;3 import javax.jws.WebService;45 import er;678 @WebService9 public interface UserService {1011 @WebMethod12 String getName(@WebParam(name = "userId") String userId);13 @WebMethod14 User getUser(String userId);15 }四、有了接⼝类,那么接下来我们对接⼝进⾏实现,也就是接⼝实现类(也就是业务类)代码:1 package cn.paybay.demo.service.impl;23 import java.util.Date;4 import java.util.HashMap;5 import java.util.Map;6789 import javax.jws.WebService;1011 import er;12 import erService;1314 @WebService(targetNamespace="/",endpointInterface = "erService")15 public class UserServiceImpl implements UserService{1617 private Map<String, User> userMap = new HashMap<String, User>();18 public UserServiceImpl() {19 System.out.println("向实体类插⼊数据");20 User user = new User();21 user.setUserId("411001");22 user.setUsername("zhansan");23 user.setAge("20");24 user.setUpdateTime(new Date());25 userMap.put(user.getUserId(), user);2627 user = new User();28 user.setUserId("411002");29 user.setUsername("lisi");30 user.setAge("30");31 user.setUpdateTime(new Date());32 userMap.put(user.getUserId(), user);3334 user = new User();35 user.setUserId("411003");36 user.setUsername("wangwu");37 user.setAge("40");38 user.setUpdateTime(new Date());39 userMap.put(user.getUserId(), user);40 }41 @Override42 public String getName(String userId) {43 return "liyd-" + userId;44 }45 @Override46 public User getUser(String userId) {47 System.out.println("userMap是:"+userMap);48 return userMap.get(userId);49 }5051 }注释(PS):在发布服务之前,我们要在这⾥对业务实现类进⾏⼀下说明,请⼤家看下图箭头指向的⽅框部分(图⼀)下⾯我来解释⼀下加上图⽅框箭头所指代码的⽬的:/:这是我的业务类所在路径;/:这是我的接⼝类所在路径;在不加上图⽅框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):(图⼆)并且会在你进⾏客户端调⽤的时候回报错:No operation was found with the name {/}getUser.那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间就会是业务类所在包(路径),⽽对外界暴露的则是接⼝类(UserService.java),那么对于客户端调⽤的时侯,需要按照接⼝类所在路径进⾏命名空所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进⾏发布,那么我们最终在加上(图⼀)⽅框箭头所指代码情况下,发布服务的结果为下图(请看图三):(图三)五、(发布服务)接⼝类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进⾏发布:代码如下:1 23 import javax.xml.ws.Endpoint;45 import org.apache.cxf.Bus;6 import org.apache.cxf.bus.spring.SpringBus;7 import org.apache.cxf.jaxws.EndpointImpl;8 import org.apache.cxf.transport.servlet.CXFServlet;9 import org.springframework.boot.web.servlet.ServletRegistrationBean;10 import org.springframework.context.annotation.Bean;11 import org.springframework.context.annotation.Configuration;1213 import erService;14 import erServiceImpl;151617 @Configuration18 public class TestConfig {1920 @Bean21 public ServletRegistrationBean dispatcherServlet() {22 return new ServletRegistrationBean(new CXFServlet(), "/test/*");23 }24 @Bean(name = Bus.DEFAULT_BUS_ID)25 public SpringBus springBus() {26 return new SpringBus();27 }28 @Bean29 public UserService userService() {30 return new UserServiceImpl();31 }32 @Bean33 public Endpoint endpoint() {34 EndpointImpl endpoint = new EndpointImpl(springBus(), userService());35 endpoint.publish("/user");36 return endpoint;37 }3839 }那么到这⾥呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输⼊url:http://localhost:8080/webservice/test/user?wsdl可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。
cxf WebService设置wsdl中soapAction的值
cxf WebService设置wsdl中soapAction的值用cxf开发一个WebService很简单,只需要下面几步:1.定义接口public interface HelloService {String hello();}2.实现public class HelloServiceImpl implements HelloService {@Overridepublic String hello() {return "hi,my name is gyoung ";}}3.用ServerFactoryBean生成服务复制代码public static void main(String[] args) {HelloServiceImpl helloworldImpl = new HelloServiceImpl();//cxf发布服务的工厂beanServerFactoryBean svrFactory = new ServerFactoryBean();//设置服务类svrFactory.setServiceClass(HelloService.class);//设置服务地址svrFactory.setAddress("http://localhost:9001/Hello");//设置服务beansvrFactory.setServiceBean(helloworldImpl);svrFactory.create();}复制代码这样,一个简单的HelloWorld服务便生成成功了。
但是,这样生成的服务有一个问题,wsdl中的soapAction属性是空的复制代码<wsdl:binding name="HelloServiceSoapBinding" type="tns:HelloServicePortType"><soap:binding style="document" transport="/soap/http"/> <wsdl:operation name="hello"><soap:operation soapAction="" style="document"/><wsdl:input name="hello"><soap:body use="literal"/></wsdl:input><wsdl:output name="helloResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>复制代码这一段<soap:operation soapAction="" style="document"/>,如果是.net生成的服务,soapAction是有值的复制代码<wsdl:binding name="WebService1Soap" type="tns:WebService1Soap"><soap:binding transport="/soap/http"/><wsdl:operation name="HelloWorld"><soap:operation soapAction="/HelloWorld" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>复制代码查看了很久的源码,才发现,设置cxf设置soapAction是在org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean类中它会去循环遍历serviceConfigurations,调用其getAction方法来获取action的值。
WebService教程详解(一)
WebService教程详解(⼀)Web Services 可以将应⽤程序转换为⽹络应⽤程序。
通过使⽤ Web Services,您的应⽤程序可以向全世界发布信息,或提供某项功能。
Web Services 可以被其他应⽤程序使⽤。
通过 Web Services,您的会计部门的 Win 2k 服务器可以与 IT 供应商的 UNIX 服务器相连接。
基本的 Web Services 平台是 XML+HTTP。
Web services 使⽤ XML 来编解码数据,并使⽤ SOAP 来传输数据。
什么是webServiceWebService,顾名思义就是基于Web的服务。
它使⽤Web(HTTP)⽅式,接收和响应外部系统的某种请求。
从⽽实现远程调⽤.1:从WebService的⼯作模式上理解的话,它跟普通的Web程序(⽐如ASP、JSP等)并没有本质的区别,都是基于HTTP传输协议的程序。
2:WebService所使⽤的数据均是基于XML格式的。
⽬前标准的WebService在数据格式上主要采⽤SOAP协议。
SOAP协议实际上就是⼀种基于XML编码规范的⽂本协议。
webService的技术⽀持Web Service平台需要⼀套协议来实现分布式应⽤程序的创建。
任何平台都有它的数据表⽰⽅法和类型系统。
要实现互操作性,Web Service平台必须提供⼀套标准的类型系统,⽤于沟通不同平台、编程语⾔和组件模型中的不同类型系统。
⽬前这些协议有:XML和XSD 可扩展的标记语⾔XML 是Web Service平台中表⽰数据的基本格式。
除了易于建⽴和易于分析外,XML主要的优点在于它既与平台⽆关,⼜与⼚商⽆关。
XML是由万维⽹协会(W3C)创建,W3C制定的XML SchemaXSD 定义了⼀套标准的数据类型,并给出了⼀种语⾔来扩展这套数据类型。
Web Service平台是⽤XSD来作为数据类型系统的。
当你⽤某种语⾔如VB. NET或C# 来构造⼀个Web Service时,为了符合Web Service标准,所有你使⽤的数据类型都必须被转换为XSD类型。
CXF使用教程(二)——webService自动生成客户端代码
CXF使⽤教程(⼆)——webService⾃动⽣成客户端代码webService⾃动⽣成客户端代码有四种⽅法:⼀:使⽤Axis⽣产客户端代码(另存为bat⽂件)需要注意的是:⽬录包含空格,⽐如Axis_Lib,Output_Pathset Axis_Lib=F:\axis1.4\axis\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\Workspacesset Package=com.axis.sub%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://192.168.11.62:8090/rainLogin?wsdl pause⼆:使⽤JDK1.6的wsimport.exe(在jdk的bin⽬录下)产⽣客户端代码(之前要将JDK的bin添加到环境变量Path中)wsimport -keep -p com.jdk6.sub -s JavaSrc http://192.168.11.62:8090/rainLogin?wsdl1. -s(src):在当前路径下的JavaSrc(要⼿动创建)⽂件夹中⽣成客户端代码2. -p(package):定义客户端代码的包名3. -keep 保留.class⽂件三:使⽤CXF wsdl2java.bat (要先将CXF的bin⽬录添加到环境变量Path下)在cmd本项⽬SCR⽬录下运⾏下⾯代码,就会在src下⽣成客户端代码wsdl2java http://192.168.11.62:8080/FFWebservice/services/PortalServices?wsdl四:使⽤Myeclipse⾃带⼯具⽣成客户端代码finnish 就可以⽣成客户端代码了。
个⼈⼀般⽐较喜欢⽤第⼆种⽅法。
webservice学习之使用Apache CXF和spring搭建webservice
webservice学习之使用Apache CXF和spring搭建webservice分类:java 2013-04-03 15:04 285人阅读评论(0) 收藏举报[html]view plaincopy1.1. websrvice概述:(1)webservice的出现可以解决不同平台、不同语言所编写的应用之间相互调用的问题。
(2)webservice不是框架,甚至不是一种技术,而是一种跨平台、跨语言的规范。
2.webservice解决三个问题:(1)远程调用(2)跨平台调用(3)跨语言调用3.实际用途(1)同一个公司新旧系统整合(2)不同公司的业务整合。
比如不同电商调用快递公司的订单查询系统(3)内容聚合。
比如一个应用需要提供天气预报、股票查询、黄金行情等等,需要内容聚合,调用到两不同平台、不同语言开发的应用方法。
4.CXF。
apache基金会的一个开源项目,可以说是SOA框架。
5.webservice的开发:(1)引入spring与cxf需要的jar包:(2)每个webservice组件需要两个部分:接口和实现类.所以建立一个webservice业务接口,使用@WebService注解。
[html]view plaincopy1.package demo.spring.service;2.3.import javax.jws.WebService;4.5.6.@WebService7.public interface HelloWorld {8. String sayHi(String text);9.}(3)定义一个webservice的实现类,实现第二步中定义的接口,也是使用@WebService修饰,但需要指定属性,一般是两个:endpointInterface:当前实现类实现的接口,serviceName:业务名称,可以自行定义[html]view plaincopy1.package demo.spring.service;2.3.import javax.jws.WebService;4.5.import ponent;6.7.@Component("hello")8.@WebService(endpointInterface = "demo.spring.service.HelloWorld")9.public class HelloWorldImpl implements HelloWorld {10.11. public String sayHi(String text) {12. System.out.println("sayHi called");13. return "Hello " + text;14. }15.}(4)配置spring与cxf的配置文件这里定义两个,一个用于server,一个用于client:cxf-servlet.xml:红色部分的配置一定要添加,用于server配置[html]view plaincopy1.<beans xmlns="/schema/beans"2. xmlns:xsi="http://www.w/2001/XMLSchema-instance" <span style="color:#ff0000;">xmlns:jaxws="/jaxws"</span>3. xmlns:context="/schema/context"4. xsi:schemaLocation="/schema/beans5. /schema/beans/spring-beans.xsd6. <span style="color:#ff0000;">/jaxws</span> <span style="color:#ff0000;">/schemas/jaxws.x sd</span>7. /schema/context8. /schema/context/spring-context.xsd">9.10.11. <import resource="classpath:META-INF/cxf/cxf.xml" />12. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />13. <context:annotation-config />14. <context:component-scan base-package="demo.spring" />15.16. <jaxws:endpoint id="helloWorld" implementor="#hello"17. address="/HelloWorld" />18.19.</beans>id:webservice的endpoint的id。
cxf开发webservice
用cxf开发webserviceApache CXF是一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。
CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。
在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP 或JMS)进行访问。
CXF同样支持多种model 如:JAX-WS,JBI,SCA和CORBA service。
CXF设计成可灵活部署到各种容器中包括Spring-based,JBI,SCA,Servlet和J2EE容器。
1.准备工作cxf是apache的一个正式的开源项目,目前已经更新到2.6.2版本,从下面的地址可以下载最新的版本。
/这里我用2.6.1的版本就行讲解。
需要的jar包有:cxf-2.6.1.jarcxf-manifest.jarcxf-services-sts-core-2.6.1.jarcxf-services-wsn-api-2.6.1.jarcxf-services-wsn-core-2.6.1.jarcxf-xjc-boolean-2.6.0.jarcxf-xjc-bug671-2.6.0.jarcxf-xjc-dv-2.6.0.jarcxf-xjc-runtime-2.6.0.jarcxf-xjc-ts-2.6.0.jar2.服务端配置与开发2.1.web.xml配置在<context-param>里边要加上lasspath*:applicationContext-cxf.xml一项的值:<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext.xml,classpath*:applicationContext-cxf.xml,classpath*:applicationContext-beans.xml,classpath*:applicationContext-service.xml,classpath*:applicationContext-beans-*.xml,classpath*:applicationContext-service-*.xml</param-value></context-param>同时还要在下面加上如下的servlet配置:<servlet><servlet-name>CXFServlet</servlet-name><display-name>CXF Servlet</display-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/service/*</url-pattern></servlet-mapping>2.2.applicationContext-cxf.xml文件配置在src目录下创建一个applicationContext-cxf.xml文件,里边的内容如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context-3.1.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" /><context:component-scan base-package="pare.webservice" /><bean id="webServicesAgent"class="org.apache.cxf.spring.remoting.Jsr181HandlerMapping"><property name="urlPrefix"><value>/</value></property></bean></beans>其中<context:component-scan base-package="com.webservice.cxf" />是配置存放webservice服务的java文件的包路径。
CXF框架webservice教程
CXF框架实现webservice教程1 使用CXF实现一个简单的WEB SERVICE首先介绍如何用CXF实现一个基本的hello world首先到apache官网去下载CXF的开发jar包//cxf/2.4.3/apache-cxf-2.4.3.zip创建cxf webservice服务器端普通java项目,叫做HelloCxfServer,把必须用到的jar文件通过构建路径引入,为了省事,可以直接把所有的jar引入此处注意:如果是jdk1.6启动服务器会发生如下错误JAXB 2.1 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/E:/javaLib/cxf_all_jar/jaxb-impl-2.2.1.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.2 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader.这是由于jdk1.6的jar包和cxf的jar包冲突造成的,需要把cxf lib中的endorsed目录拷入到D:\Program Files\Java\jdk1.6.0\jre\lib目录下创建一个接口HelloWorld和一个实现类HelloWorldImpl,只提供一个成员方法,叫做sayHello,给接口和实现类添加注解@WebService,这是最基本的注解/test/HellWorld.java源码package test;import javax.jws.WebService;@WebServicepublic interface HelloWorld {String sayHello(String name);}/test/HelloWorldImpl.java源码package test;import javax.jws.WebService;@WebServicepublic class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHello(String name) {System.out.println("sayHello方法被调用...");return"hello," + name;}}CXF自带了一个Web Service容器Jetty,这是一个WEB容器,类似于tomcat,能够直接发布web service,下面创建一个发布服务类MainServer,执行这个类就会运行服务器,看到控制台输出日志信息,表示启动服务成功/test/MainServier.java源码package test;import org.apache.cxf.endpoint.Server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class MainServer {public static void main(String[] args) {//创建一个JaxWs服务器工厂JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();//设置发布类factory.setServiceClass(HelloWorldImpl.class);//设置服务发布的地址factory.setAddress("http://localhost:6666/MyCxfService");//根据设置创建一个服务器Server server = factory.create();//启动服务器server.start();}}发布成功以后,可以通过浏览器去查看生成的WSDL,在浏览器地址栏输入http://localhost:6666/MyCxfService?wsdl,效果如下:下面创建访问WebService的客户端,可以重新创建一个项目,也可以就在这个项目里实现,我下面在同一个项目中创建一个类HelloWorldCient/test/HelloWorldClient.java源码package test;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean;public class HelloWorldClient {public static void main(String[] args) {//创建一个JaxWs的代理工厂JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();//设置访问地址factory.setAddress("http://localhost:6666/MyCxfService");//设置接口类型factory.setServiceClass(HelloWorld.class);//获得代理类实例HelloWorld helloWorld = (HelloWorld) factory.create();//调用方法String str = helloWorld.sayHello("张三");System.out.println(str);}}运行客户端,会看到控制台,输出:hello,张三2 WSDL结构分析主要通过上一章生成的WSDL,来对WSDL语言的标签进行解释Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML 语言。
excel中webservice函数
当我们在处理数据分析和处理大量信息时,Excel往往是一个非常重要的工具。
而在Excel中,WEBSERVICE函数则是一个非常有用的函数,它能够帮助我们获取网页中的数据,为我们的数据分析和处理提供了更多可能性。
在本篇文章中,我将就Excel中的WEBSERVICE函数进行全面评估,并分析其深度和广度,帮助我们更好地理解它的功能和用法。
一、WEBSERVICE函数的基本介绍1.1 简单说明WEBSERVICE函数是Excel中的一个Web函数,它能够获取指定URL的数据,并将其作为字符串返回。
这使得我们可以在Excel中轻松地获取互联网上的数据,为我们的分析和处理提供更多的数据来源。
1.2 使用方法在Excel中使用WEBSERVICE函数非常简单,只需要在一个单元格中输入函数名称和URL位置区域,即可获取对应网页的数据。
可以使用=WEBSERVICE("URL")来获取指定URL的数据。
二、WEBSERVICE函数的深度探讨2.1 功能介绍WEBSERVICE函数的主要功能是通过请求指定URL来获取网页数据,并将其作为字符串返回。
这使得我们可以利用Excel进行网络数据抓取和分析,极大地丰富了我们的数据来源和分析手段。
2.2 参数说明在使用WEBSERVICE函数时,主要需要输入的参数就是URL,通过URL来指定需要获取数据的网页位置区域。
函数没有其他需要输入的参数,使用起来非常简便。
2.3 数据处理通过WEBSERVICE函数获取的数据可以进行各种处理,例如提取特定信息、进行数据分析、制作图表等。
这为我们的数据处理工作提供了更多自由度和灵活性。
三、WEBSERVICE函数的广度探讨3.1 数据获取WEBSERVICE函数能够帮助我们获取各种类型的网络数据,包括文本、表格、图像等。
这为我们的数据分析提供了更多的可能性,可以从不同角度进行数据处理和分析。
3.2 数据处理获取到的网络数据可以直接在Excel中进行处理,我们可以针对数据进行筛选、排序、计算等操作,从而得出更加深入和全面的分析结果。
Java通过cxf发布和调用webservices接口
Java通过cxf发布webservices接口第一步:创建一个工程如:cxfserver1注:web工程和java工程都可以第二步:把apache-cxf-2.6.1资源包中lib文件夹下所有的jar包共计75个,都拷贝到cxfserver1的lib目录下,如果你的工程师java工程自己创建一个lib文件夹第三步:创建一个包inter,在inter下创建一个发布接口,接口名HelloWorld ,并进行webservices注解package inter;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;/*** 发布接口* @author Administrator**/@WebServicepublic interface HelloWorld {@WebMethodpublic String sayHello(@WebParam(name="name")String name);}第四步:创建一个包impl,在impl下创建一个接口实现类,对接口中的方法进行功能实现package impl;import inter.HelloWorld;/*** 接口功能实现类* @author Administrator**/public class HelloWorldImpl implements HelloWorld {public String sayHello(String name) {// TODO Auto-generated method stubSystem.out.println("进入接口中");return name.concat(",进入接口中");}}第五步:创建一个包release,在release下创建一个接口发布主线程入口,执行该方法进行接口发布package release;import impl.HelloWorldImpl;import inter.HelloWorld;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/*** 发布接口的主线程入口类**/public class ReleasePortMain {public static void main(String[] args) {// TODO Auto-generated method stubHelloWorldImpl implementor = new HelloWorldImpl();//初始化功能实现类JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();//初始或工厂类svrFactory.setServiceClass(HelloWorld.class);//设置发布接口对象svrFactory.setAddress("http://localhost:9000/helloWorld");//自己设置发布接口在JVM 中的访问地址svrFactory.setServiceBean(implementor);//设置接口功能实现类对象svrFactory.getInInterceptors().add(new LoggingInInterceptor());//设置异常抛出svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());//设置异常抛出svrFactory.create();//执行接口发布}}注:如果执行发布接口,抛出如下异常信息: Creating Service {http://inter/}HelloWorldService from class inter.HelloWorldException in thread "main" ng.LinkageError: 正在从引导类加载器加载JAXB 2.1 API, 但此 RI (来自jar:file:/D:/worke/codehy/cxfserver1/lib/jaxb-impl-2.2.5.jar!/com/sun /xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。
C#操作webservice(经典入门教程及实例)
Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。
面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。
当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。
SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。
大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。
在用户能够调用Web 服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。
UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。
它采用XML 格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
概念补充:http soap关系http:是一个客户端和服务器端请求和应答的标准(TCP)。
http协议其目的是为了提供一种发布和接收htttp页面的方法一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。
WebService CXF学习
WebService CXF学习(入门篇1):CXF由来WebService介绍WebService让一个程序可以透明地调用互联网程序,不用管具体的实现细节。
只要WebService公开了服务接口,远程客户端就可以调用服务。
WebService是基于http协议的组件服务,WebService是分散式应用程序的发展趋势。
WebService的开源实现WebService更多是一种标准,而不是一种具体的技术。
不同的平台,不同的语言大都提供WebService的开发实现。
在JA VA领域,WebService的框架很多,例如:AXIS,XFire,CXF等。
AXIS,XFire相对比较成熟,资料相对较多。
在这里我们只对CXF进行讲解,其他大家想学习到互联网找相关资料学习。
CXF框架由来ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。
ObjectWeb Celtix是由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。
合并后的ApacheCXF融合该两个开源项目的功能精华,提供了实现SOA所需要的核心ESB功能框架,包括SOA服务创建,服务路由,及一系列企业级QoS功能。
ApacheCXF架框的目标1.概述<>高性能<>可扩展<>直观易用2.支持标准<> JAX-WS, JSR-181, SAAJ, JAX-RS<> SOAP 1.1, 1.2, WS-I BasicProfile, WS-Security, WS-Addressing, WS-RM, WS-Policy<> WSDL 1.1<> MTOM3.传输方式,绑定,数据绑定,传送数据格式<> 绑定: SOAP, REST/HTTP<> 数据绑定: JAXB 2.x, Aegis, XMLBeans, SDO<> 传送数据格式: XML, JSON, FastInfoset<> 传输方式: HTTP, Servlet, JMS4.部署灵活<> 轻量级: 可以将服务部署到Tomcat或其支持Spring的容器中<> JBI整合: 部署一个服务引擎到JBI容器,例如:ServiceMix, OpenESB or Petals<> J2EE集成: 可以将服务部署到J2EE应用服务器上,例如:Geronimo, JOnAS, JBoss, WebLogic, 及WebSphere<> Java 客户端/服务端可以独立性5.支持多种编程语言<> 完全支持JAX-WS 2.x 客户端/服务端模式<> JAX-WS 2.x synchronous, asynchronous and one-way API's<> JAX-WS 2.x Dynamic Invocation Interface (DII) API<> 支持wrapped and non-wrapped 数据格式<> XML messaging API<> 支持JavaScript 和ECMAScript 4 XML (E4X)<> 支持CORBA<> 支持JBI及ServiceMix6.可编程环境<> Java to WSDL<> WSDL to Java<> XSD to WSDL<> WSDL to XML<> WSDL to SOAP<> WSDL to serviceWebService CXF学习(入门篇2):HelloWorld理论联系实际,单单只讲理论那就成了纸上谈兵,用一个HelloWorld Demo可来说明事更加直观。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近开发开始学习Web Service,如果你是大神,请路过!谢谢!遵循前辈大神们的教导~~~,内事不决问度娘,外事不决问谷歌(现在谷歌已经不能用了),只能问度娘了!上网一百度,套用周董的一句歌词,霍,霍,霍,霍,这么多的套路(axis,axis2,XFire,CXF等),我到底选择哪一个?因为要和Spring进行对接,看了一下,CXF与Spring的耦合度最好,于是就选择了CXF。
上官网下jar包,下了最新的apache-cxf-3.1.4.zip包。
解压出来,看看里面的最简单的实例,apache-cxf-3.1.4\samples\java_first_jaxws,本着你快乐所以我快乐加上不要脸的原则,我抄抄抄,改了一下名字,开发环境jdk1.6, jdk1.5没试过,上眼呐!新建工程mywbs,导入jar包cxf-core-3.1.4.jarjetty-continuation-9.2.11.v20150529.jarjetty-http-9.2.11.v20150529.jarjetty-io-9.2.11.v20150529.jarjetty-server-9.2.11.v20150529.jarjetty-util-9.2.11.v20150529.jarwsdl4j-1.6.3.jarxmlschema-core-2.2.1.jar一、接口类IHelloWorld.javapackage com.ws.hello;import java.util.List;import javax.jws.WebService;import ers;@WebServicepublic interface IHelloWorld {public String sayHello(String name);public String getUserName(Users user);public List<Users> getListUser();}二、实现类(说明endpointInterface = "com.ws.hello.IHelloWorld",IHelloWorld 类加上路径,此处注意)HelloWorldImpl.javapackage com.ws.hello;import java.util.ArrayList;import java.util.List;import javax.jws.WebService;import ers;@WebService(endpointInterface = "com.ws.hello.IHelloWorld",serviceName = "IHelloWorld", portName="IHelloWorldPort")public class HelloWorldImpl implements IHelloWorld {@Overridepublic String sayHello(String name) {return name + ": 您好啊!";}@Overridepublic String getUserName(Users user) {return user.getName();}@Overridepublic List<Users> getListUser() {System.out.println("getListUser called~~~");List<Users> list = new ArrayList<Users>();list.add(new Users(2,"张三"));list.add(new Users(3, "十八罗汉"));list.add(new Users(4,"五王"));return list;}}三、实体类Userspackage com.ws.entity;import java.io.Serializable;public class Users implements Serializable{private static final long serialVersionUID= -5031894017095689998L;private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Users(Integer id, String name) {super();this.id = id; = name;}public Users() {super();}}Users类如果不写默认构造方法,将报如下异常:Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContextatcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext( Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(Unknow n Source)atcom.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(Unknow n Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(Unknown Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndp oint(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(Un known Source)atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(Unk nown Source)at javax.xml.ws.Endpoint.publish(Endpoint.java:220)atcom.ws.deploy.DeployHelloWorldService.<init>(DeployHelloWorldService. java:14)atcom.ws.deploy.DeployHelloWorldService.main(DeployHelloWorldService.ja va:23)Caused by: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseat java.security.AccessController.doPrivileged(Native Method)... 13 moreCaused by:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseatcom.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Buil der.check(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(U nknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuild er.build(Unknown Source)atcom.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(Unknown Source)atcom.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBCont ext(Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(UnknownSource)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(Unknown Source)... 14 more晕了,真是崩溃了,就写了这么几句话!错误代码比正常代码还要多!真是婶婶能忍叔叔不能忍,虽然英语很烂,连猜带蒙吧,看黑色的一句话,大概似乎是告诉我们Users类中没有默认的构造方法,果断加上,错误消失!此处应有掌声!鼓掌!!!四、DeployHelloWorldService.javapackage com.ws.deploy;import javax.xml.ws.Endpoint;import com.ws.hello.HelloWorldImpl;public class DeployHelloWorldService {protected DeployHelloWorldService() throws Exception {System.out.println("Starting Server");HelloWorldImpl implementor = new HelloWorldImpl();//工程名String address = "http://localhost:8080/mywbs";Endpoint.publish(address, implementor);}/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception { new DeployHelloWorldService();System.out.println("Server ready...");Thread.sleep(5 * 60 * 1000);System.out.println("Server exiting");System.exit(0);}}点击运行,正常的话会有Starting ServerServer ready...在IE地址栏中输入:http://localhost:8080/mywbs?wsdl什么你不知道IE地址栏在哪里,对不起,大哥,地球是危险的,你回火星去吧!如果正常的话呢,大约在网页上会出现下面的信息,只截取一部分,注意画粗红线的地方,下面我们用的到。