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

 
 
 
《完》