WebService學習(三)——使用JDK開發WebService

一、WebService的開發手段

  使用Java開發WebService時可以使用以下兩種開發手段

    1、 使用JDK開發(1.6及以上版本)

    2、使用CXF框架開發(工作中)

二、使用JDK開發WebService

2.1、開發WebService服務器端

  1、定義一個interface,使用@WebService註解標註接口,使用@WebMethod註解標註接口中定義的所有方法,如下所示:

package me.gacl.ws;


import javax.jws.WebMethod;
import javax.jws.WebService;


/**
 * @author gacl
 * 定義SEI(WebService EndPoint Interface(終端))
 */
//使用@WebService註解標註WebServiceI接口
@WebService
public interface WebServiceI {


    //使用@WebMethod註解標註WebServiceI接口中的方法
    @WebMethod
    String sayHello(String name);
    
    @WebMethod
    String save(String name,String pwd);

}


2、編寫interface的實現類,使用@WebService註解標註實現類,實現接口中定義的所有方法,如下所示:

package me.gacl.ws;


import javax.jws.WebService;


/**
 * @author gacl
 * SEI的具體實現
 */
//使用@WebService註解標註WebServiceI接口的實現類WebServiceImpl
@WebService
public class WebServiceImpl implements WebServiceI {


    @Override
    public String sayHello(String name) {
        System.out.println("WebService sayHello "+name);
        return "sayHello "+name;
    }


    @Override
    public String save(String name, String pwd) {
        System.out.println("WebService save "+name+", "+pwd);
        return "save Success";
    }
}

3、使用Endpoint(終端)類發佈webservice,代碼如下:
package me.gacl.ws.test;


import javax.xml.ws.Endpoint;


import me.gacl.ws.WebServiceImpl;


/**
 * @author gacl
 *
 * 發佈Web Service
 */
public class WebServicePublish {


    public static void main(String[] args) {
        //定義WebService的發佈地址,這個地址就是提供給外界訪問Webervice的URL地址,URL地址格式爲:http://ip:端口號/xxxx
        //String address = "http://192.168.1.100:8989/";這個WebService發佈地址的寫法是合法的
        //String address = "http://192.168.1.100:8989/Webservice";這個WebService發佈地址的是合法的
        String address = "http://192.168.1.100:8989/WS_Server/Webservice";
        //使用Endpoint類提供的publish方法發佈WebService,發佈時要保證使用的端口號沒有被其他應用程序佔用
        Endpoint.publish(address , new WebServiceImpl());
        System.out.println("發佈webservice成功!");
    }
}
運行WebServicePublish類,就可以將編寫好的WebService發佈好了,WebService的訪問URL是:http://192.168.1.100:8989/WS_Server/Webservice ,如下圖所示:

這裏我們編寫了一個WebServicePublish類來發布WebService,如果是Web項目,那麼我們可以使用監聽器或者Servlet來發布WebService,如下:

  1、使用ServletContextListener監聽器發佈WebService

package me.gacl.listener;


import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.xml.ws.Endpoint;
import me.gacl.ws.WebServiceImpl;


/**
 * @author gacl
 * 用於發佈WebService的監聽器
 */
//使用Servlet3.0提供的@WebListener註解將實現了ServletContextListener接口的WebServicePublishListener類標註爲一個Listener
@WebListener
public class WebServicePublishListener implements ServletContextListener {


    @Override
    public void contextDestroyed(ServletContextEvent sce) {


    }


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //WebService的發佈地址
        String address = "http://192.168.1.100:8080/WS_Server/WebService";
        //發佈WebService,WebServiceImpl類是WebServie接口的具體實現類
        Endpoint.publish(address , new WebServiceImpl());
        System.out.println("使用WebServicePublishListener發佈webservice成功!");
    }
}

將Web應用部署到服務器運行時,在初始化Web應用上下文時,就會發布WebService了。

  接着我們可以使用發佈的URL地址訪問WebService,如下圖所示:


2、使用Servlet發佈WebService
package me.gacl.web.controller;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.xml.ws.Endpoint;
import me.gacl.ws.WebServiceImpl;


/**
 * @author gacl
 * 用於發佈WebService的Servlet
 */
//使用Servlet3.0提供的@WebServlet註解將繼承HttpServlet類的普通Java類標註爲一個Servlet
//將value屬性設置爲空字符串,這樣WebServicePublishServlet就不提供對外訪問的路徑
//loadOnStartup屬性設置WebServicePublishServlet的初始化時機
@WebServlet(value="",loadOnStartup=0)
public class WebServicePublishServlet extends HttpServlet {


    /* (non-Javadoc)
     * @see javax.servlet.GenericServlet#init()
     * 在WebServicePublishServlet初始化時發佈WebService
     */
    public void init() throws ServletException {
        //WebService的發佈地址
        String address = "http://192.168.1.100:8888/WebService";
        //發佈WebService,WebServiceImpl類是WebServie接口的具體實現類
        Endpoint.publish(address , new WebServiceImpl());
        System.out.println("使用WebServicePublishServlet發佈webservice成功!");
    }
}
將Web應用部署到服務器運行時,在初始化WebServicePublishServlet時,就會發布WebService了。如下圖所示:
接着我們可以使用發佈的URL地址訪問WebService,如下圖所示:

 關於發佈WebService主要就是通過javax.xml.ws.Endpoint類提供的靜態方法publish進行發佈,如果是普通的java項目,那麼可以專門寫一個類用於發佈WebService,如果是Web項目,那麼可以使用ServletContextListener或者Servlet進行發佈。

2.2、開發WebService客戶端

  1、藉助jdk的wsimort.exe工具生成客戶端代碼,wsimort.exe工具位於Jdk的bin目錄下,如下圖所示:

  執行命令:wsimport -keep url(url爲wsdl文件的路徑)生成客戶端代碼。

  創建一個WebService客戶端測試項目,如下圖所示:

  

  打開命令行窗口,切換到src目錄,執行"wsimport -keep http://192.168.1.100:8888/WebService?wsdl"生成客戶端代碼如下圖所示:

  

  執行命令的過程中沒有出現任何錯誤,那麼代碼就生成成功了,刷新一下src目錄,就可以看到生成的代碼了,如下圖所示:

  

  2、 藉助生成的代碼編寫調用WebService對外提供的方法

  wsimport工具幫我們生成了好幾個java類,但我們只需要關心WebServiceImplService類和WebServiceImpl接口的使用即可,如下所示:

package me.gacl.ws.client;


import me.gacl.ws.WebServiceImpl;
import me.gacl.ws.WebServiceImplService;


/**
 * @author gacl
 * 調用WebService的客戶端
 */
public class WSClient {


    public static void main(String[] args) {
        //創建一個用於產生WebServiceImpl實例的工廠,WebServiceImplService類是wsimport工具生成的
        WebServiceImplService factory = new WebServiceImplService();
        //通過工廠生成一個WebServiceImpl實例,WebServiceImpl是wsimport工具生成的
        WebServiceImpl wsImpl = factory.getWebServiceImplPort();
        //調用WebService的sayHello方法
        String resResult = wsImpl.sayHello("孤傲蒼狼");
        System.out.println("調用WebService的sayHello方法返回的結果是:"+resResult);
        System.out.println("---------------------------------------------------");
        //調用WebService的save方法
        resResult = wsImpl.save("孤傲蒼狼","123");
        System.out.println("調用WebService的save方法返回的結果是:"+resResult);
    }
}

客戶端調用服務器端的WebService方法運行結果如下:

  

  從調用返回的結果顯示,藉助wsimport工具生成的客戶端代碼已經成功調用到了WebService中的方法。以上就是使用JDK開發WebService的相關內容。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章