无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。
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中的参数映射: