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

来源:互联网 发布:中信淘宝卡 积分 编辑:程序博客网 时间:2024/06/05 18:20

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中的参数映射:




0 0