1JDK6webservice的应用一、WebServices简介什么是WebServicesWebservice就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。基于浏览器的瘦客户应用程序,即BS结构,是目前流行的,使得WebServices的应用越来越广泛。WebServices是一种构建应用程序的模型,并能在所有支持Internet通讯的操作系统上实施运行。WebServices令基于组件的开发和Web的结合达到最佳,基于组件的对象模型,利用SOAP和XML对这些模型在通讯方面作了进一步的扩展以消除特殊对象模型的障碍。因为是使用XML作为传输的介质,所以可以跨平台跨语言。WebServices实现远程访问,有点类似RMI(远程方法调用)。但它是利用HTTP和SOAP协议是商业数据在Web上传输,SOAP通过HTTP调用商业对象执行远程功能调用,Web用户能够使用SOAP和HTTP通过Web调用的方法来调用远程对象。WebServices结构客户根据WSDL描述文档,会生成一个SOAP请求消息。WebServices都是放在Web服务器上面,客户生成的SOAP请求会被嵌入在一个HTTPPOST请求中,发送到Web服务器来。Web服务器再把这些请求转发给WebServices请求处理器。请求处理器的作用在于,解析收到的SOAP请求,调用WebServices,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把信息送回到客户端。什么是WSDLWSDL是WebServicesDescriptionLanguage的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。WebServices服务器把一个对像绑定到一个URL上(如),客户端就可以能过绑定的地址(如:)取得WSDL文件,该文件是标准的XML格式,描述了被绑定对像的信息,包括可调用的方法,参数,及参数类型,返回值类型,异常类型等。客户端就是通过这些信息调用服务器的方法。二、JKD6对WebServices的支持JDK6提供了对WebService原生的支持,对WebService进行了完美的封装,完全隐藏了底层内容,甚至可以不用了解wsdl的具体规范。使用WebService就像使用本地方法一样简单。下面来举个例子,依然从最简单的HelloWorld入手。HelloWorld例子STEP1,服务器端Bean说明2服务器端的Java类若要成为一个实现了WebService的bean,它需要遵循下边这些原则:这个类必须是public类、不能是final的或者abstract、必须有一个公共的默认构造函数、绝对不能有finalize()方法。若要成为一个实现了WebService的Bean的方法必须遵循这些原则:这个方法必须是public,它的参数、返回值、和异常在每个JAXRPC规范中都描述了Java转化成XML/WSDL映射文件的规则,参数和返回值可以是原始类型、数组等等。下面是服务器端的类HelloWorld.java:packagetest.jws.service;importjavax.jws.WebMethod;importjavax.jws.WebParam;importjavax.jws.WebResult;importjavax.jws.WebService;importjavax.jws.soap.SOAPBinding;@WebService(targetNamespace=)@SOAPBinding(style=SOAPBinding.Style.RPC)publicclassHelloWorld{@WebMethod(action=toSayHello,operationName=toSayHello,exclude=false)@WebResult(name=returnWord)//自定义该方法返回值在WSDL中相关的描述publicStringsayHello(@WebParam(name=userName)StringuserName){returnHello:+userName;}@WebMethodpublicintgetExp(inti,intj){returni/j;}}这是服务器端普通的业务类,通过@WebService、@WebMethod等注释描述来生成WSDL文件。STEP2,执行wsgen命令本例中到HelloWorld类所在的目录中新建一个命名为wsdl的文件夹,运行:wsgen-cp./bin-r./wsdl-s./src-d./bin-wsdltest.jws.service.HelloWorld。执行后会在wsdl文件夹中生成HelloWorld的wsdl描述文件,src文件夹中生成依赖类,如异常说明类,bin中生成依赖类的class文件STEP3,发布WebServiceBean启动服务类StartService.java:3packagetest.jws.service;importjavax.xml.ws.Endpoint;publicclassStartService{publicstaticvoidmain(String[]args){Endpoint.publish(());}}此类很简单,能过Endpoint类的publish()方法发布实例发布地址为:,必需明确指明http协议,主机IP地址及端口号,在IE上输入返回以下内容说明发布成功?xmlversion=1.0encoding=UTF-8?definitionsxmlns=:tns==:soap===HelloWorldServicetypes/messagename=toSayHellopartname=userNametype=xsd:string//messagemessagename=toSayHelloResponsepartname=returnWordtype=xsd:string//messagemessagename=getExppartname=arg0type=xsd:int/partname=arg1type=xsd:int//messagemessagename=getExpResponsepartname=returntype=xsd:int//messageportTypename=HelloWorldoperationname=toSayHelloparameterOrder=userNameinputmessage=tns:toSayHello/outputmessage=tns:toSayHelloResponse//operationoperationname=getExpparameterOrder=arg0arg1inputmessage=tns:getExp/outputmessage=tns:getExpResponse/4/operation/portTypebindingname=HelloWorldPortBindingtype=tns:HelloWorldsoap:bindingstyle=rpctransport==toSayHellosoap:operationsoapAction=toSayHello/inputsoap:bodyuse=literalnamespace=:bodyuse=literalnamespace==getExpsoap:operationsoapAction=/inputsoap:bodyuse=literalnamespace=:bodyuse=literalnamespace==HelloWorldServiceportname=HelloWorldPortbinding=tns:HelloWorldPortBindingsoap:addresslocation=,生成客户端执行类在cmd命令中执行wsimport-d./bin-s./src-ptest.jws.client.ref后在在src目录下生成客户端调用的两个类:test.jws.client.ref.HelloWorld.java根据wsdl描述生成的客户端执行类5test.jws.client.ref.HelloWorldServices.java通过此类负责解悉wsdl初始化客户端HelloWorld实例在bin目录下生成对应的类文件。注意:执行wsimport命令时STEP3的服务必需启动,否则无法生成STEP4,客户端调用客户端调用过程ClientRun.java:packagetest.jws.client;importtest.jws.client.ref.*;publicclassClientRun{/***@paramargs*/publicstaticvoidmain(String[]args){HelloWorldServicehws=newHelloWorldService();HelloWorldhw=hws.getHelloWorldPort();System.out.println(hw.getExp(9,3));System.out.println(hw.toSayHello(zhuoshiyao));}}启动STEP3中的服务,运行ClientRun后,制控台输出:3Hello:zhuoshiyao注意:经测试,用Endpoint.publish(())方式在Tomcat6中发布,不会存在端口号与路径冲突。JKD6中定义的WebService注释1.@WebService标注要暴露为WebServices