Junky's IT Notebook

统计

留言簿(8)

积分与排名

WebSphere Studio

阅读排行榜

评论排行榜

spring+JAX-RPC(Axis) 构建webservice

介绍

关于用eclipse+wtp发布webservice是相当的简单。这里只简单介绍一下,wtp下发布webservice有以下几个步骤:

·创建Dynamic Web Project.(wtp自带项目)

·在soure folder 下面创建要发布的java bean。本例中发布了一个User.java

·在创建的工程上面新建Web Service. (wtp自带) 浏览中选择创建的User.java

·点击完成后,运行该工程,选择在服务器上运行,配置好服务器,本例发布用的Tomcat5.

发布完成,相当简单吧。

 

接下来讲webservice发布完成后,用springIOCwebservice进行管理。Spring使用JAX-RPC端口代理来暴露RMI或者非RMI的接口。

RMI接口:

好处:客户端不需要了解JAX-RPC

坏处:客户端需要对RMI对象有所了解。并且需要处理烦人的RemoteException.

RMI接口:

好处:客户端对RMIJAX-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>

 

《完》

posted on 2007-07-06 15:07 junky 阅读(1961) 评论(0)  编辑  收藏 所属分类: web


只有注册用户登录后才能发表评论。


网站导航: