介绍
关于用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>
《完》