介紹
關于用eclipse+wtp發布webservice是相當的簡單。這里只簡單介紹一下,wtp下發布webservice有以下幾個步驟:
·創建Dynamic Web Project.(wtp自帶項目)
·在soure folder 下面創建要發布的java bean。本例中發布了一個User.java
·在創建的工程上面新建Web Service. (wtp自帶) 瀏覽中選擇創建的User.java
·點擊完成后,運行該工程,選擇在服務器上運行,配置好服務器,本例發布用的Tomcat5.
發布完成,相當簡單吧。
接下來講webservice發布完成后,用spring的IOC對webservice進行管理。Spring使用JAX-RPC端口代理來暴露RMI或者非RMI的接口。
RMI接口:
好處:客戶端不需要了解JAX-RPC。
壞處:客戶端需要對RMI對象有所了解。并且需要處理煩人的RemoteException.
非RMI接口:
好處:客戶端對RMI和JAX-RPC都不需要了解,完全解耦。
壞處:水平有限,沒有發現。
這里只講解非RMI接口的實現情況:
『一』. 發布結果的回顧:
上面的webservice已經發布好了。這里列出被發布的User.java
User.java:
package org.upyaya.webservice;


public class User ...{


public String getAddress() ...{
return "Jingke Road,Zhangjiang,Shanghai";
}


public String getUserName() ...{
return "Upyaya";
}
}

發布完成后我們可以得到一個wsdl的URL。本例中是:
http://localhost:8080/SpringWebService/wsdl/User.wsdl
『二』. 解析WSDL
在eclipse+wtp的環境中解析wsdl也是很容易的。
·新建工程:使用Dynamic Web Project 取名:SpringWebServiceClient。
·在工程SpringWebServiceClient右鍵選擇新建Web Service Client。
·輸入上面的wsdl URL.
·解析出需要的java文件。
如下圖:

『三』. 創建DAO layer 和 Service layer
DAO Layer:
IUserDAO.java
package org.upyaya.webservice.dao;


public interface IUserDAO ...{
public String getAddress();

public String getUserName();
}

UserDAOImpl.java
package org.upyaya.webservice.dao;


public class UserDAOImpl implements IUserDAO ...{
private IUserDAO userDAO;


public IUserDAO getUserDAO() ...{
return userDAO;
}


public void setUserDAO(IUserDAO userDAO) ...{
this.userDAO = userDAO;
}


public String getAddress() ...{
return userDAO.getAddress();
}


public String getUserName() ...{
return userDAO.getUserName();
}

}

Service Layer:
IUserService.java
package org.upyaya.webservice.service;


public interface IUserService ...{
public String getAddress();

public String getUserName();
public String getUserInfo();
}

UserServiceImpl.java
package org.upyaya.webservice.service;

import org.upyaya.webservice.dao.IUserDAO;


public class UserServiceImpl implements IUserService ...{

private IUserDAO userDAO;


public IUserDAO getUserDAO() ...{
return userDAO;
}


public void setUserDAO(IUserDAO userDAO) ...{
this.userDAO = userDAO;
}


public String getAddress() ...{
return userDAO.getAddress();
}


public String getUserInfo() ...{
return getUserName() + "@" + getAddress();
}


public String getUserName() ...{
return userDAO.getUserName();
}

}

注意:看上面的幾個累,有沒有涉及到RMI和JAX-RPC?沒有吧。完全的解耦,dao 和service完全不知到他們的存在
『四』. Spring AOP&IOC,解決webservice和DAO Layer之間的連接.
先看配置文件(Spring的家常便飯):
webservice.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="userDAO" class="org.upyaya.webservice.dao.UserDAOImpl">
<property name="userDAO">
<ref local="userServiceProxy"/>
</property>
</bean>
<bean id="userService" class="org.upyaya.webservice.service.UserServiceImpl">
<property name="userDAO" ref="userDAO" />
</bean>

<!-- Configure WebService bean-->

<bean id="userServiceProxy" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
<!-- Configure WebService wsdl url-->
<property name="wsdlDocumentUrl">
<value>http://localhost:8080/SpringWebService/wsdl/User.wsdl</value>
</property>
<!-- Configure WebService namespace uri -->
<property name="namespaceUri">
<value>http://webservice.upyaya.org</value>
</property>
<!-- Configure WebService service name -->
<property name="serviceName">
<value>UserService</value>
</property>
<!-- Configure WebService portName -->
<property name="portName">
<value>User</value>
</property>
<!-- Configure WebService implements interface-->
<property name="serviceInterface">
<value>org.upyaya.webservice.dao.IUserDAO</value>
</property>
<property name="portInterface">
<value>org.upyaya.webservice.User</value>
</property>
</bean>

</beans>

·wsdlDocumentUrl,這個不用解釋了吧。
·namepaceUrl,wsdl服務的命名空間URL。
·servicename,wsdl的服務名稱。
·portName,服務端口。
·serviceInterface,webservice實現的接口。是我們指定的業務接口
·portInterface,RMI服務接口。
『四』. 測試
Client.java
package org.upyaya.webservice.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.upyaya.webservice.service.IUserService;


public class UserClient ...{


public static void main(String[] args) ...{
ApplicationContext context =
new FileSystemXmlApplicationContext(
"webservice.xml");
IUserService service = (IUserService)context.getBean("userService");
System.out.println(service.getUserInfo());
}

}

這里為了方便沒有在web里面展現。但是展現機制不是這里的重點。所以選擇控制臺打印,結果如下:
Output:
log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory). log4j:WARN Please initialize the log4j system properly. Upyaya@Jingke Road,Zhangjiang,Shanghai |
附:Wsdl文件
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://webservice.upyaya.org" xmlns:impl="http://webservice.upyaya.org" xmlns:intf="http://webservice.upyaya.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<!--WSDL created by Apache Axis version: 1.3
Built on Oct 05, 2005 (05:23:37 EDT)-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://webservice.upyaya.org" elementFormDefault="qualified">
<element name="getAddress">
<complexType/>
</element>
<element name="getAddressResponse">
<complexType>
<sequence>
<element name="getAddressReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="getUserName">
<complexType/>
</element>
<element name="getUserNameResponse">
<complexType>
<sequence>
<element name="getUserNameReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>

<wsdl:message name="getUserNameResponse">

<wsdl:part name="parameters" element="impl:getUserNameResponse"/>

</wsdl:message>

<wsdl:message name="getUserNameRequest">

<wsdl:part name="parameters" element="impl:getUserName"/>

</wsdl:message>

<wsdl:message name="getAddressRequest">

<wsdl:part name="parameters" element="impl:getAddress"/>

</wsdl:message>

<wsdl:message name="getAddressResponse">

<wsdl:part name="parameters" element="impl:getAddressResponse"/>

</wsdl:message>

<wsdl:portType name="User">

<wsdl:operation name="getAddress">

<wsdl:input name="getAddressRequest" message="impl:getAddressRequest"/>

<wsdl:output name="getAddressResponse" message="impl:getAddressResponse"/>

</wsdl:operation>

<wsdl:operation name="getUserName">

<wsdl:input name="getUserNameRequest" message="impl:getUserNameRequest"/>

<wsdl:output name="getUserNameResponse" message="impl:getUserNameResponse"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="UserSoapBinding" type="impl:User">

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="getAddress">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="getAddressRequest">

<wsdlsoap:body use="literal"/>

</wsdl:input>

<wsdl:output name="getAddressResponse">

<wsdlsoap:body use="literal"/>

</wsdl:output>

</wsdl:operation>

<wsdl:operation name="getUserName">

<wsdlsoap:operation soapAction=""/>

<wsdl:input name="getUserNameRequest">

<wsdlsoap:body use="literal"/>

</wsdl:input>

<wsdl:output name="getUserNameResponse">

<wsdlsoap:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="UserService">

<wsdl:port name="User" binding="impl:UserSoapBinding">

<wsdlsoap:address location="http://localhost:8080/SpringWebService/services/User"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

《完》