JAVA6中開發WebService—-快速實踐

來源:互聯網
上載者:User

                                     JAVA6中開發WebService----快速實踐

1.建立一個web工程wstest

  用Eclipse,點擊右鍵建立一個web工程即可。

2.建立包

    com.test.ws

3.建立服務端類檔案 com.test.ws.Hello.java


    package com.test.ws;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    import javax.xml.ws.Endpoint;
    import javax.jws.soap.SOAPBinding.Style;

    @WebService
    @SOAPBinding(style=Style.RPC)
    public class Hello {
        /**
         * Web服務中的業務方法
         * @return 一個字串
         */
        public String sayHi(String name) {
            return "hi," + name;
        }

        public static void main(String[] args) {
            // 發布一個WebService
            Endpoint.publish("http://localhost:81/hello", new Hello());
        }
    }
    注意:由於JDK版本的關係,我所用的版本必須加上@SOAPBinding(style=Style.RPC)
    ,否則會報錯"Wrapper class com.test.ws.jaxws.SayHi is not found. Have you run APT to generate them?"。

4.測試伺服器端程式

    (1)運行Hello.java
    (2)在瀏覽器中輸入:http://localhost:81/hello?wsdl  即可看到相應的描述資訊

5.建立用戶端

  (一)方式一,自動建立



      (1)進入DOS命令列狀態,並進入wstest項目的src目錄


      (2)執行如下命令:
        D:/workspace/wstest/src>wsimport -p com.test.ws.client -keep http://localhost:81/hello?wsdl
        注意:一定要先運行Hello.java,保持服務先開啟,否則會報錯


      (3)進入Eclipse中,按F5重新整理wstest項目,會發現com.test.ws會多了一個目錄client,並且client目錄下自動建立了四個檔案:Hello.class、Hello.java、HelloService.class、HelloService.java


      (4)建立一個用戶端測試類別com.test.ws.client.TestClient.java
        package com.test.ws.client;

        public class TestClient {
                public static void main(String args[]){
                    Hello hello = new HelloService().getHelloPort();
                    String msg = hello.sayHi("tom");
                    System.out.println(msg);
                }
        }


        (5)運行TestClient.java, 會輸出如下結果:
            hi, tom


  (二)方式二,手工建立用戶端 (簡潔,容易看明白)


     (1)建立服務端對應的介面com.test.ws.client.HelloInte.java

          package com.test.ws.client;


         
import javax.jws.WebMethod;

         
import javax.jws.WebParam;

         
import javax.jws.WebResult;

         
import javax.jws.WebService;

         
import javax.jws.soap.SOAPBinding;


         
@WebService(name = "Hello", targetNamespace = "http://ws.test.com/")

         
@SOAPBinding(style = SOAPBinding.Style.RPC)

         
public interface HelloInte {
   
   
         
@WebMethod
   
         
@WebResult(partName = "return")
   
         
public String sayHi(
       
         
@WebParam(name = "arg0", partName = "arg0")
       
         
String arg0);

         
}


     (2)建立用戶端測試類別 com.test.ws.client.TestClient.java

         package com.test.ws.client;

        import javax.xml.namespace.QName;
        import javax.xml.ws.Service;
        import java.net.URL;

        public class TestClient {
            public static void main(String[] args) throws Exception{
                URL url = new URL("http://localhost:81/hello?wsdl");
      
                // 第一個參數是服務的URI
                // 第二個參數是在WSDL發布的服務名
                QName qname = new QName("http://ws.test.com/", "HelloService");
      
                // 建立服務
                Service service = Service.create(url, qname);
      
                // 提取端點介面,服務“連接埠”。
                HelloInte h= service.getPort(HelloInte.class);
      
                System.out.println(h.sayHi("michael"));
                System.out.println(h.sayHi("tom"));
            }
        }


    (3)運行
TestClient, 會出現如下結果:

        hi,michael
        hi,tom


       補充:為了驗證服務端與用戶端的相關性,停掉Hello.java後,再次執行TestClient.java,則會報錯。說明用戶端的訪問是與伺服器端相關的。

6.WEB方式部署

(1)建立com.test.ws.client.servlet.PubServlet.java
    package com.test.ws.servlet;

    import java.io.IOException;
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.xml.ws.Endpoint;
    import com.test.ws.Hello;

    public class PubServlet extends GenericServlet  {
        public PubServlet() {
            super();
        }
        public void destroy() {
            super.destroy();
        }
        @Override
        public void init() throws ServletException {
             super.init();
             System.out.println("start run webservice...");
             Endpoint.publish("http://localhost:81/hello", new Hello());
            
             System.out.println("Webservice is running...");
        }
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        }
    }
  (2)修改web.xml
     <servlet>
           <servlet-name>PubServlet</servlet-name>
            <servlet-class>com.test.ws.servlet.PubServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
            <servlet-name>PubServlet</servlet-name>
            <url-pattern>/servlet/PubServlet</url-pattern>
    </servlet-mapping>

    注意:此處要讓PubServlet自動啟動,所以要設load-on-startup為1。
 (3)發布完成,啟動web服務
 (4)運行TestClient.java測試

7.小結


(1)不管是直接通過main()方法運行,還是通過servlet來發布,其實都是在執行Endpoint.publish()方法
(2)在web中發布時,webservice所用的連接埠必須跟web容器所用的連接埠分開
(3)與xfire相比,通過此種方式不用再倒入第三方包,開發起來比較方便。不過,我個人還是比較喜歡xfire的方式。目前這種用戶端的實現讓我覺得不太爽。另外,它在web容器中的發布也沒有xfire方便。
    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.