WebService:WSDL、@Webservice、@WebMethod、@WebResult、@WebP
l? wsdl – WebService Description Language(WS描述语言) l? 它主要定义了三个方面的问题: ???? What?即服务是什么? ???? (portType,types,message) ???? How?如何调用服务? ???? 通过binding元素说明调用服务的方式:soap,soap12,post,get. ???? Where?在哪儿调用服务? ???? Service元素,soap:address. ? l? WSDL文件的内容,一般由服务默认生成,但为了更好的向开发人员提供使用说明书,一般应做一些简单的修改。至少不应该暴露我们的包结构。而targetNamespace默认情况下为倒置的包名,这已经暴露了我们的包结构。 l? 通过在类文件上添加以下注解,可以修改wsdl生成的各元素,而不是直接去修改wsdl文件,直接去修改wsdl文件是无效的。 l? WebService的注解包括: ???? @WebService-定义服务?? --类上 ???? @WebMethod-定义方法?? - 方法 ???? @WebResult-定义返回值– 返回值 ???? @WebParam-定义参数– 参数 l? 通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。 l? 当修改了WebService注解之后,同时会影响客户端生成的代码。 l? 调用的方法名和参数名也发生了变化。 l? 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。 l? 生成本地调用代码,依然使用wsimport工具。 ? ? /** ?* 一个加了很多注解的代码 ?*/ @WebService(name="myName",//对应portTypename="myName" portName="myPort",? //对应服务中的portname="myPort" serviceName="myService",//对应servicename="myService" targetNamespace="http://leaf.com/mynamespace")//可以随意书写类似于java中的package public classHelloWorld{ private staticSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss"); @WebMethod(action="myAction",//定义一个soapAction="myAction"用于找到这个方法以执行 ??operationName="myOperationName")//定义可以调用的方法,会生成相应类的具体方法,operation name=".." public@WebResult(name="mySayHelloResult")String//定义返回值的名称 sayHello(){ return"HelloWorld"; } @WebMethod(action="mySayHiAction",operationName="mySayHiOperationName") public@WebResult(name="mySayHiResult")StringsayHi(@WebParam(name="myParaName", //将参数放到头信息中,用于保护参数,默认在body中 ?????????????????????????????????????????????????????header=true, ?mode=Mode.IN) String name){ String str = "你好:"+name+",当前时间是:"+sdf.format(newDate()); return str; } public staticvoid main(String[] args) { Endpoint.publish("http://127.0.0.1:6666/helloworld",newHelloWorld()); } } 3:将上面的程序对外发布以后,我们通过MyEclipse的WebServiceExplorer来访问 你会发现和以前不一样的提示信息,但其实,仍然还是调用的那同一个方法。 4:去观察SOAP请求和返回文档的修改。在MyEclipseWebService Explorer的返回信息窗口中点Soure即可以看到。观察变化加以分析。 5:再次使用wsimport –s .http://127.0.0.1:6666/helloworld?wsdl生成java代码然后调用,看看还是哪些类名吗? 以下是调用代码(可以用面目全非来形容,但完成的还是同样的工作。) packagecom.leaf.mynamespace; public classMain { public staticvoid main(String[] args) { //通过分析wsdl可知从myService中调用getMyPort返回myName MyName myName = newMyService().getMyPort(); //通过myName的mySayHiOperationName来调用sayHi方法 String str =myName.mySayHiOperationName("王健"); System.err.println(str); } } ? @Webservice l? @WebService注解,作用在具体类上。而不是接口。 l? 一个类只有添加了此注解才可以通过Endpoint发布为一个web服务。 l? 一个添加了此注解的类,必须要至少包含一个实例方法。静态方法和final方法不能被发布为服务方法。 WebService注解包含以下参数: @WebMethod l? 此注解用在方法上,用于修改对外暴露的方法。 @WebResult用于定制返回值到WSDL的映射: @WebParam用于定义WSDL中的参数映射: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |