微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebService:WSDL、@Webservice、@WebMethod、@WebResult、@WebParam、

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  即使是没有修改代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。

生成本地调用代码,依然使用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注解,作用在具体类上。而不是接口。

一个类只有添加了此注解才可以通过Endpoint发布为一个web服务。

一个添加了此注解的类,必须要至少包含一个实例方法。静态方法和final方法不能被发布为服务方法

WebService注解包含以下参数:

@WebMethod

l  此注解用在方法上,用于修改对外暴露方法


@WebResult用于定制返回值到WSDL的映射:

@WebParam用于定义WSDL中的参数映射:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐