一、簡介
對於基於soap傳輸協議的webservice有兩種開發模式,代碼優先和契約優先的模式。代碼優先的模式是通過編寫服務器端的代碼,使用代碼生成wsdl;契約優先模式首先編寫wsdl,再通過wsdl生成服務器端的代碼。對於代碼優先的模式在使用cxf構建webservice 一文中已經做出介紹,這里主要介紹第二種方式。
二、wsdl文件結束
一般wsdl文件結構如下:
<?xml version='1.0' encoding='UTF-8'?> <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://testauto.cxf.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="MyServiceImplService" targetNamespace="http://testauto.cxf.com/"> <!-- 元素和元素類型 --> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://testauto.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://testauto.cxf.com/" version="1.0"> <xs:element name="sayHello" type="tns:sayHello" /> <xs:element name="sayHelloResponse" type="tns:sayHelloResponse" /> <xs:complexType name="sayHello"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string" /> <xs:element minOccurs="0" name="arg1" type="xs:string" /> <xs:element minOccurs="0" name="arg2" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="sayHelloResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <!-- message --> <wsdl:message name="sayHelloResponse"> <wsdl:part element="tns:sayHelloResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="sayHello"> <wsdl:part element="tns:sayHello" name="parameters"> </wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="sayHello"> <wsdl:input message="tns:sayHello" name="sayHello"> </wsdl:input> <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sayHello"> <soap:operation soapAction="" style="document" /> <wsdl:input name="sayHello"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="sayHelloResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="MyServiceImplService"> <wsdl:port binding="tns:MyServiceImplServiceSoapBinding" name="MyServiceImplPort"> <soap:address location="http://localhost:9000/myservice" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
對於根元素中的xmlns與targetNamespace是包名的反轉,name為實現類的名稱。其他的屬性都是固定的。
<wsdl:types> 中主要定義元素和元素的類型。 一般對於一個接口來說,參數的整體作為一個輸入元素類型,接口的返回值也是作為一個輸出的元素類型。
<wsdl:message > 主要定義接口的請求和響應消息。<wsdl:part>中的element屬性使用到了<wsdl:types> 中定義的元素。
<wsdl:portType name="MyService"> 主要定義了接口的操作,name表示接口的名稱;<wsdl:operation name="sayHello">定義了具體的方法,name為方法的名稱。子元素input和output使用到了message元素。
<wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> type為wsdl:portType中的那么值;name為我們自己定義的。子元素<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />是固定的。 <wsdl:operation name="sayHello">中子元素input和outputname和operation中子元素的name一直。
<wsdl:service name="MyServiceImplService">定義了綁定的信息,<wsdl:port binding="tns:MyServiceImplServiceSoapBinding">type就是綁定的時候定義的name,子元素address為定義的地址;增加接口的時候不需要更改。
wsdl是一個基於schema的xml文件,通過這個文件我們可以定義出接口的名稱,參數類型,返回值等信息,也可以同該文件生成客戶端和服務器端代碼。
三、wsdl的各種返回類型
1、返回列表類型
對應於 List<Student> getStudentsByAge(int age) 方法,wsdl相關定義如下:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://testauto.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://testauto.cxf.com/" version="1.0"> <xsd:element name="getStudentsByAgeRequest" type="tns:AgetType"></xsd:element> <xsd:element name="getStudentsByAgeResponse" type="tns:StudentsType"></xsd:element> </xs:schema> </wsdl:types> <xsd:complexType name="AgetType"> <xsd:sequence> <xsd:element name="age" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="StudentsType"> <xsd:sequence> <xsd:element name="students" minOccurs="0" maxOccurs="unbounded" type="tns:StudentType"></xsd:element> <!-- 元素出現的次數為0-無限多次 --> </xsd:sequence> </xsd:complexType> <xsd:complexType name="StudentType"> <xsd:sequence> <xsd:element name="id" type="xsd:int"></xsd:element> <xsd:element name="name" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <!-- message --> <wsdl:message name="getStudentsByAgeRequest"> <wsdl:part name="parameters" element="tns:getStudentsByAgeRequest"></wsdl:part> </wsdl:message> <wsdl:message name="getStudentsByAgeResponse" > <wsdl:part name="parameters" element="tns:getStudentsByAgeResponse"></wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="getStudentsByAge"> <wsdl:input message="tns:getStudentsByAgeRequest" name="getStudentsByAgeRequest"></wsdl:input> <wsdl:output message="tns:getStudentsByAgeResponse" name="getStudentsByAgeResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding info --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <wsdl:operation name="getStudentsByAge"> <soap:operation soapAction="" style="document"/> <wsdl:input name="getStudentsByAgeRequest"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getStudentsByAgeResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
在MyServiceImplPortImpl中的實現方法,可以做如下類似實現
public com.cxf.test.StudentsType getStudentsByAge(AgetType parameters) { LOG.info("Executing operation getStudentsByAge"); System.out.println(parameters); try { System.out.println("getStudentsByAge invoked!"); System.out.println("gae : " + parameters.getAge()); com.cxf.test.StudentsType students = new StudentsType(); StudentType stu1 = new StudentType(); stu1.setName("zhangsan1"); StudentType stu2 = new StudentType(); stu1.setName("zhangsan2"); students.getStudents().add(stu1); students.getStudents().add(stu2); return students; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } }
2、voide 無返回值類型
對應於 void deleteById(int id) 方法,wsdl相關定義如下:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://testauto.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://testauto.cxf.com/" version="1.0"> <xsd:element name="deleteByIdRequest" type="tns:IdType"></xsd:element> <xsd:element name="deleteByIdResponse"> <xsd:complexType> <xsd:sequence></xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="IdType"> <xsd:sequence> <xsd:element name="id" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xs:schema> </wsdl:types> <!-- message --> <wsdl:message name="deleteByIdRequest"> <wsdl:part name="parameters" element="tns:deleteByIdRequest"></wsdl:part> </wsdl:message> <wsdl:message name="deleteByIdResponse"> <wsdl:part name="parameters" element="tns:deleteByIdResponse"></wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="deleteById"> <wsdl:input message="tns:deleteByIdRequest" name="deleteByIdRequest"></wsdl:input> <wsdl:output message="tns:deleteByIdResponse" name="deleteByIdResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding info --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <wsdl:operation name="deleteById"> <soap:operation soapAction="" style="document" /> <wsdl:input name="deleteByIdRequest"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="deleteByIdResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
此時我們可以將生成的deleteById方法的返回類型改成void,需要同時修改接口和實現類。如:
MyService 接口中的方法
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) @WebResult(name = "deleteByIdResponse", targetNamespace = "http://test.cxf.com/", partName = "parameters") @WebMethod public void deleteById( @WebParam(partName = "parameters", name = "deleteByIdRequest", targetNamespace = "http://test.cxf.com/") IdType parameters );
MyServiceImplPortImpl類中的方法
public void deleteById(IdType parameters) { LOG.info("Executing operation deleteById"); System.out.println(parameters); try { System.out.println(parameters.getId()); } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } }
3、返回枚舉類型
枚舉為:enum{TEACHER, STUDENT, PRESIDENT} ;對應的方法為:enum getRoleById(int id),wsdl定義如下:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://testauto.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://testauto.cxf.com/" version="1.0"> <xsd:element name="getRoleByIdRequest" type="tns:IdType"></xsd:element> <xsd:element name="getRoleByIdResponse" type="tns:RoleType"></xsd:element> <xsd:complexType name="IdType"> <xsd:sequence> <xsd:element name="id" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="RoleType"> <xsd:restriction base="xs:string"> <xsd:enumeration value="STUDENT"></xsd:enumeration> <xsd:enumeration value="TEACHER"></xsd:enumeration> <xsd:enumeration value="PRESIDENT"></xsd:enumeration> </xsd:restriction> </xsd:simpleType> </xs:schema> </wsdl:types> <!-- message --> <wsdl:message name="getRoleByIdRequest"> <wsdl:part name="parameters" element="tns:getRoleByIdRequest"></wsdl:part> </wsdl:message> <wsdl:message name="getRoleByIdResponse"> <wsdl:part name="paramters" element="tns:getRoleByIdResponse"></wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="getRoleById"> <wsdl:input message="tns:getRoleByIdRequest" name="getRoleByIdRequest"></wsdl:input> <wsdl:output message="tns:getRoleByIdResponse" name="getRoleByIdResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding info --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="getRoleById"> <soap:operation soapAction="" style="document" /> <wsdl:input name="getRoleByIdRequest"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="getRoleByIdResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
在MyServiceImplPortImpl中的實現方法,可以做如下類似實現
public com.cxf.test.RoleType getRoleById(IdType parameters) { LOG.info("Executing operation getRoleById"); System.out.println(parameters); try { System.out.println("id: " + parameters.getId()); com.cxf.test.RoleType roleType = RoleType.PRESIDENT; return roleType; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } }
4、返回嵌套的對象類型
嵌套對象結構如下
Student{
int id;
String name;
Date date;
Teacher teacher;
}
Teacher{
String name;
Boss boss;
}
Boss{
String name;
Parent parent;
}
Parent{
String name;
}
對於的方法為:Student getStudentById(int studentId),wsdl文件如下:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://testauto.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://testauto.cxf.com/" version="1.0"> <xsd:element name="getStudentByIdRequest" type="tns:StudentIdType"></xsd:element> <xsd:element name="getStudentByIdResponse" type="tns:StudentType"></xsd:element> <xsd:complexType name="StudentIdType"> <xsd:sequence> <xsd:element name="id" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="StudentType"> <xsd:sequence> <xsd:element name="id" type="xsd:int"></xsd:element> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="date" type="xsd:date"></xsd:element> <xsd:element name="teacher" type="tns:TeacherType"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TeacherType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="boss" type="tns:BossType"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="BossType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="parent" type="tns:ParentType"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ParentType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> </xs:schema> </wsdl:types> <!-- message --> <wsdl:message name="getStudentByIdRequest"> <wsdl:part name="parameters" element="tns:getStudentByIdRequest"></wsdl:part> </wsdl:message> <wsdl:message name="getStudentByIdResponse"> <wsdl:part name="parameters" element="tns:getStudentByIdResponse"></wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="getStudentById"> <wsdl:input message="tns:getStudentByIdRequest" name="getStudentByIdRequest"></wsdl:input> <wsdl:output message="tns:getStudentByIdResponse" name="getStudentByIdResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding info --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="getStudentById"> <soap:operation soapAction="" style="document" /> <wsdl:input name="getStudentByIdRequest"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="getStudentByIdResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
在MyServiceImplPortImpl中的實現方法,可以做如下類似實現
public com.cxf.test.StudentType getStudentById(StudentIdType parameters) { LOG.info("Executing operation getStudentById"); System.out.println(parameters); try { ParentType parentType = new ParentType(); parentType.setName("lisi"); BossType bossType = new BossType(); bossType.setName("boss"); bossType.setParent(parentType); TeacherType teacherType = new TeacherType(); teacherType.setName("teacher"); teacherType.setBoss(bossType); com.cxf.test.StudentType student = new StudentType(); student.setId(parameters.getId()); student.setName("zhangsan"); student.setDate(getGregorianCalendar(new Date())); student.setTeacher(teacherType); return student; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } private XMLGregorianCalendar getGregorianCalendar(Date date){ GregorianCalendar gc = new GregorianCalendar(); gc.setTime(date); XMLGregorianCalendar calendar = new com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl(gc); return calendar; }
客戶端調用的時候
com.cxf.test.StudentIdType id = new StudentIdType(); id.setId(11111); com.cxf.test.StudentType student = port.getStudentById(id); System.out.println(student.getId()); System.out.println(student.getName()); System.out.println(student.getDate()); System.out.println(student.getTeacher().getBoss().getParent().getName());
5、文件上傳
boolean upload(File file ),wsdl文件如下:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://test.cxf.com/" version="1.0"> <xsd:element name="uploadRequest" type="tns:FileType"></xsd:element> <xsd:element name="uploadResponse" type="tns:booleanType"></xsd:element> <xsd:complexType name="booleanType"> <xsd:sequence> <xsd:element name="result" type="xsd:boolean"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="FileType"> <xsd:sequence> <xsd:element name="fileContent" type="xsd:base64Binary"></xsd:element> <!-- 文件類型 --> </xsd:sequence> </xsd:complexType> </xs:schema> </wsdl:types> <!-- message --> <wsdl:message name="uploadRequest"> <wsdl:part name="parameters" element="tns:uploadRequest"></wsdl:part> </wsdl:message> <wsdl:message name="uploadResponse"> <wsdl:part name="parameters" element="tns:uploadResponse"></wsdl:part> </wsdl:message> <!-- operation --> <wsdl:portType name="MyService"> <wsdl:operation name="upload"> <wsdl:input message="tns:uploadRequest" name="uploadRequest"></wsdl:input> <wsdl:output message="tns:uploadResponse" name="uploadResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <!-- binding info --> <wsdl:binding name="MyServiceImplServiceSoapBinding" type="tns:MyService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="upload"> <soap:operation soapAction="" style="document" /> <wsdl:input name="uploadRequest"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="uploadResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
接口實現類如下:
public com.cxf.test.BooleanType upload(FileType parameters) { LOG.info("Executing operation upload"); System.out.println(parameters); try { byte[] buffer = parameters.getFileContent(); OutputStream os = new FileOutputStream(new File("test2.txt")); os.write(buffer); os.close(); com.cxf.test.BooleanType result = new BooleanType(); result.setFilename(true); return result; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } }
客戶端調用如下:
System.out.println("Invoking upload..."); com.cxf.test.FileType data = new FileType(); InputStream is = new FileInputStream(new File("c:/apache-cxf-3.0.3.zip")); byte[] buffer = new byte[is.available()]; is.read(buffer); data.setFileContent(buffer); com.cxf.test.BooleanType result = port.upload(data); System.out.println(result.isResult());
這種上傳方式有些缺陷,當文件達到一定大小的時候,就會報java.lang.OutOfMemoryError: Java heap space異常。因為這種方式是一次性讀取文件,將文件發送給服務器的。
6、使用MTOM文件上傳
這種方法可以解決普通上傳遇到的問題。使用MTO上傳需要在wsdl定義元素部分添加 xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
命名空間,element添加屬性xmime:expectedContentTypes="application/octet-stream"其他部分與普通上傳一樣。如下所示:
<wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.cxf.com/" elementFormDefault="unqualified" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" targetNamespace="http://test.cxf.com/" version="1.0"> <!-- 添加xmlns:xmime 元素 --> <xsd:element name="uploadRequest" type="tns:FileType"></xsd:element> <xsd:element name="uploadResponse" type="tns:booleanType"></xsd:element> <xsd:complexType name="booleanType"> <xsd:sequence> <xsd:element name="result" type="xsd:boolean"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="FileType"> <xsd:sequence> <!-- 添加xmime:expectedContentTypes="application/octet- --> <xsd:element name="fileContent" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"></xsd:element> </xsd:sequence> </xsd:complexType> </xs:schema> </wsdl:types>
使用MTOM需要服務端和客戶端都需要開啟MTOM
服務端開啟MTOM代碼如下:
protected MyService_MyServiceImplPort_Server() throws java.lang.Exception { System.out.println("Starting Server"); Object implementor = new MyServiceImplPortImpl(); String address = "http://localhost:9000/myservice"; javax.xml.ws.Endpoint endPoint = javax.xml.ws.Endpoint.publish(address, implementor); //服務器端開啟MTOM javax.xml.ws.soap.SOAPBinding binding = (javax.xml.ws.soap.SOAPBinding)endPoint.getBinding(); binding.setMTOMEnabled(true); }
接口的實現
public com.cxf.test.BooleanType upload(FileType parameters) { LOG.info("Executing operation upload"); System.out.println(parameters); try { javax.activation.DataHandler dataHandler = parameters.getFileContent(); //獲取文件輸入流 InputStream is = dataHandler.getInputStream(); //獲取輸出流 OutputStream os = new FileOutputStream(new File("c:/apache-cxf-3.0.3.zip.back")); //進行文件保存 int length = 0; byte[] buffer = new byte[1024]; while(-1 != (length = is.read(buffer))){ os.write(buffer, 0, length); } os.close(); is.close(); com.cxf.test.BooleanType result = new BooleanType(); result.setResult(true); return result; } catch (java.lang.Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } }
客戶端的調用
MyService port = ss.getMyServiceImplPort(); // 客戶端開啟MTOM javax.xml.ws.Binding binding = ((javax.xml.ws.BindingProvider) port).getBinding(); ((javax.xml.ws.soap.SOAPBinding) binding).setMTOMEnabled(true); System.out.println("Invoking upload..."); //構造數據 DataSource ds = new FileDataSource(new File("c:/apache-cxf-3.0.3.zip")); com.cxf.test.FileType data = new FileType(); data.setFileContent(new DataHandler(ds)); //調用接口 com.cxf.test.BooleanType result = port.upload(data); System.out.println(result.isResult());
四、使用wsdl生成代碼
將的bin目錄添加到系統環境變量path中,如(C:\apache-cxf-3.0.3\bin)。運行cmd,運行如下命令生成代碼:
wsdl2java -all -impl -frontend jaxws21 -encoding utf8 c:/myservice.wsdl #生成java服務器端和客戶端代碼,並生成實現類。
表示使用wsdl生成java代碼,-all表示同時生成客戶端和服務器端代碼; -frontend jaxws21表示 表示兼容jaxs 2.1版本;-encoding utf8 表示代碼的編碼格式為utf8;c:/myservice.wsdl 表示wsdl文件的地址,也可以是一個網絡上的地址。其他命令如下:
wsdl2java -server -impl -frontend jaxws21 -encoding utf8 c:/myservice.wsdl 生成java服務器端代碼,並生成實現類。
wsdl2java -client -frontend jaxws21 c:/myservice.xml 生成java客戶端代碼