关于用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:
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也是很容易的。
如下图:
『三』. 创建DAO layer 和 Service layer
DAO Layer:
IUserDAO.java
public interface IUserDAO ... {
public String getAddress();
public String getUserName();
}
UserDAOImpl.java
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
public interface IUserService ... {
public String getAddress();
public String getUserName();
public String getUserInfo();
}
UserServiceImpl.java
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
<! 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 >
『四』. 测试
Client.java
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());
}
}
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文件
< 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 >
《完》