非常感謝孫浩老師。
先編寫schema,user.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://service.lichen.cn" xmlns:tns="http://service.lichen.cn"
elementFormDefault="qualified">
<xsd:element name="add" type="tns:addType" />
<xsd:element name="addResponse" type="tns:addResponseType" />
<xsd:element name="delete" type="tns:deleteType" />
<xsd:element name="deleteResponse" type="tns:deleteResponseType" />
<xsd:element name="list" type="tns:listType" />
<xsd:element name="listResponse" type="tns:listResponseType" />
<xsd:element name="login" type="tns:loginType" />
<xsd:element name="loginResponse" type="tns:loginResponseType" />
<xsd:complexType name="addType">
<xsd:sequence>
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addResponseType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="deleteType">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="deleteResponseType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="listType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="listResponseType">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginType">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<xsd:element name="passwrod" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginResponseType">
<xsd:sequence>
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="user">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<xsd:element name="nickname" type="xsd:string" />
<xsd:element name="passwrod" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
編寫wsdl:user.wsdl
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://service.lichen.cn" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService"
targetNamespace="http://service.lichen.cn">
<wsdl:types>
<xsd:schema targetNamespace="http://service.lichen.cn">
<xsd:include schemaLocation="user.xsd"></xsd:include>
</xsd:schema>
</wsdl:types>
<wsdl:message name="add">
<wsdl:part element="tns:add" name="parameters" />
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part element="tns:addResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="delete">
<wsdl:part element="tns:delete" name="parameters" />
</wsdl:message>
<wsdl:message name="deleteResponse">
<wsdl:part element="tns:deleteResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="login">
<wsdl:part element="tns:login" name="parameters" />
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part element="tns:loginResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="list">
<wsdl:part element="tns:list" name="parameters" />
</wsdl:message>
<wsdl:message name="listResponse">
<wsdl:part element="tns:listResponse" name="parameters" />
</wsdl:message>
<wsdl:portType name="IMyService">
<wsdl:operation name="add">
<wsdl:input message="tns:add" />
<wsdl:output message="tns:addResponse" />
</wsdl:operation>
<wsdl:operation name="delete">
<wsdl:input message="tns:delete" />
<wsdl:output message="tns:deleteResponse" />
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input message="tns:login" />
<wsdl:output message="tns:loginResponse" />
</wsdl:operation>
<wsdl:operation name="list">
<wsdl:input message="tns:list" />
<wsdl:output message="tns:listResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="userServiceSOAP" type="tns:IMyService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="add">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="delete">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="list">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="UserService">
<wsdl:port binding="tns:userServiceSOAP" name="UserServicePort">
<soap:address location="http://localhost:8800/us/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
使用wsimport得到Java文件,把接口IMyService.java拷貝到服務端項目中(刪除IMyService中報錯的註解)。
由於IMyService.java需要User.java,在服務端中新建:
package cn.lichen.entity;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String username;
private String nickname;
private String password;
public User() {
}
public User(String username, String nickname, String password) {
super();
this.username = username;
this.nickname = nickname;
this.password = password;
}
public String getUsername() {
return username;
}
public String getNickname() {
return nickname;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void setPassword(String password) {
this.password = password;
}
}
添加接口實現類,還沒有實現功能,注意類名上的註解必須要:
package cn.lichen.service;
import java.util.List;
@WebService(endpointInterface = "cn.lichen.service.IMyService",
wsdlLocation = "META-INF/wsdl/user.wsdl",
portName = "UserServicePort",
serviceName = "UserService",
targetNamespace = "http://service.lichen.cn")
public class MyServiceImpl implements IMyService {
@Override
public void add(User user) {
}
@Override
public void delete(String username) {
}
@Override
public User login(String username, String passwrod) {
return null;
}
@Override
public List<User> list() {
return null;
}
}
package cn.lichen.service;
import javax.xml.ws.Endpoint;
public class MyService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8800/us", new MyServiceImpl());
}
}
啓動服務後,可成功訪問http://localhost:8800/us?wsdl。但使有wsimport導出Java會報錯,需要把user.xsd和user.wsdl整合。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://service.lichen.cn" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService"
targetNamespace="http://service.lichen.cn">
<wsdl:types>
<xsd:schema targetNamespace="http://service.lichen.cn">
<!-- <xsd:include schemaLocation="user.xsd"></xsd:include> -->
<xsd:element name="add" type="tns:addType" />
<xsd:element name="addResponse" type="tns:addResponseType" />
<xsd:element name="delete" type="tns:deleteType" />
<xsd:element name="deleteResponse" type="tns:deleteResponseType" />
<xsd:element name="list" type="tns:listType" />
<xsd:element name="listResponse" type="tns:listResponseType" />
<xsd:element name="login" type="tns:loginType" />
<xsd:element name="loginResponse" type="tns:loginResponseType" />
<xsd:complexType name="addType">
<xsd:sequence>
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addResponseType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="deleteType">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="deleteResponseType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="listType">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="listResponseType">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginType">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<xsd:element name="passwrod" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginResponseType">
<xsd:sequence>
<xsd:element name="user" type="tns:user" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="user">
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<xsd:element name="nickname" type="xsd:string" />
<xsd:element name="passwrod" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="add">
<wsdl:part element="tns:add" name="parameters" />
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part element="tns:addResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="delete">
<wsdl:part element="tns:delete" name="parameters" />
</wsdl:message>
<wsdl:message name="deleteResponse">
<wsdl:part element="tns:deleteResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="login">
<wsdl:part element="tns:login" name="parameters" />
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part element="tns:loginResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="list">
<wsdl:part element="tns:list" name="parameters" />
</wsdl:message>
<wsdl:message name="listResponse">
<wsdl:part element="tns:listResponse" name="parameters" />
</wsdl:message>
<wsdl:portType name="IMyService">
<wsdl:operation name="add">
<wsdl:input message="tns:add" />
<wsdl:output message="tns:addResponse" />
</wsdl:operation>
<wsdl:operation name="delete">
<wsdl:input message="tns:delete" />
<wsdl:output message="tns:deleteResponse" />
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input message="tns:login" />
<wsdl:output message="tns:loginResponse" />
</wsdl:operation>
<wsdl:operation name="list">
<wsdl:input message="tns:list" />
<wsdl:output message="tns:listResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="userServiceSOAP" type="tns:IMyService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="add">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="delete">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="list">
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="UserService">
<wsdl:port binding="tns:userServiceSOAP" name="UserServicePort">
<soap:address location="http://localhost:8800/us/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
使用wsimport導出Java文件,拷貝到客戶端中。
基本構架完成。