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 閱讀(1967) 評論(0)  編輯  收藏 所屬分類: web

          主站蜘蛛池模板: 桂东县| 静安区| 开远市| 丘北县| 宿迁市| 扬州市| 綦江县| 出国| 石城县| 遂川县| 克东县| 湘潭市| 衢州市| 泰顺县| 鄂伦春自治旗| 景洪市| 卢氏县| 故城县| 彝良县| 浦江县| 城口县| 桓仁| 焦作市| 宣武区| 芦溪县| 延边| 漳平市| 高雄县| 星子县| 内乡县| 忻城县| 灵丘县| 崇仁县| 曲阜市| 金沙县| 柳州市| 巴南区| 镇平县| 辽阳县| 内丘县| 隆子县|