Java6 WebService的發佈

WebService服務發佈每每比較混亂,Axis2的發佈形式與XFire發佈方式差異很大,而Java6 Web服務的發佈與Axis二、XFire的Web服務的發佈方式也有着天壤之別,它們之間沒有經驗能夠借鑑。
 
所以,頗有必要鑽研下Java6的Web服務的發佈方式。
 
從前面兩篇文章能夠看出Java6對WebService的發佈提供了API級別的直接支持,發佈只須要一行代碼就搞定了。可是做爲一個服務,就須要啓動,總不能每次啓動都去運行一個Main方法來啓動吧。
 
實際中Web服務的發佈經常伴隨着Web容器的啓動而發佈,而在Java6中,咱們無法直接像Axis2和XFire那樣直接去發佈,可是能夠經過變通的方法,經過Servlet來和容器綁定起來,在容器啓動的時候發佈服務。
 
下面以Tomcat爲例,來實現Java6 Web服務的發佈。
 
一、開發WebService服務
 
import javax.jws.WebService;

/**
* Java6開發的WebService服務端
*
* @author leizhimin 2009-11-16 10:24:13
*/

@WebService
public class Java6WS {

         /**
         * Web服務中的業務方法
         *
         * @return 一個字符串
         */

         public String doSomething(String username) {
                 return username + " is doing something!";
        }
}
 
二、開發發佈服務的Servlet,爲了通用性,最好選擇GenericServlet來繼承
 
import lavasoft.server.Java6WS;

import javax.servlet.*;
import javax.xml.ws.Endpoint;
import java.io.IOException;

/**
* 發佈Java6 WebService的Servlet,
*
* @author leizhimin 2009-11-16 13:52:49
*/

public class WSServlet extends GenericServlet {
        @Override
         public void init(ServletConfig servletConfig) throws ServletException {
                 super.init(servletConfig);
                System.out.println( "準備啓動WebService服務:http://192.168.14.117:8888/java6ws/Java6WS");
                //發佈一個WebService
                Endpoint.publish("http://192.168.14.117:8888/java6ws/Java6WS", new Java6WS());
                System.out.println("已成功啓動WebService服務:http://192.168.14.117:8888/java6ws/Java6WS");

        }

        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
                System.out.println("此Servlet不處理任何業務邏輯,僅僅yonglai發佈一個Web服務:http://192.168.14.117:8888/java6ws/Java6WS");
        }
}
 
這裏將服務發佈的代碼寫在了Servlet的init()方法中,當Servlet加載時候,會自動執行init()裏面的方法。從而達到發佈服務的目的,因爲此Servlet不處理任何業務,所以,在Service裏面僅僅寫了一個提示性的語句。
 
三、配置web.xml
 
xml version ="1.0" encoding ="UTF-8" ?>
< web-app xmlns ="http://java.sun.com/xml/ns/javaee"
                 xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
                 version ="2.5" >

         < welcome-file-list >
                 < welcome-file >index.jsp </ welcome-file >
         </ welcome-file-list >

         < servlet >
                 < servlet-name >WSServlet </ servlet-name >
                 < servlet-class >lavasoft.servlet.WSServlet </ servlet-class >
                 < load-on-startup >1 </ load-on-startup >
         </ servlet >
         < servlet-mapping >
                 < servlet-name >WSServlet </ servlet-name >
                 < url-pattern >/servlet/WSServlet </ url-pattern >
         </ servlet-mapping >
</ web-app >
 
注意,上面的Servlet比通常Servlet配置多了一行:
<load-on-startup>1</load-on-startup>
,這樣寫的目的是Servlet能伴隨容易的啓動在第一時間加載。以便服務能儘量早的發佈,不然,只有在第一次請求該Servlet的時候,纔會被加載到容器。
 
四、部署、啓動並測試
 
啓動Tocmat6,瀏覽器中輸入: http://localhost:8080/java6ws/
 
點擊超連接,能夠獲取到WSDL以下:

可見,服務伴隨着tomcat的啓動發佈成功。
 
五、總結
 
1)、Java6的服務發佈的整體思想是經過Java6 API的調用達到發佈的目的,截止目前,已經看到兩種發佈方式,一種是直接調用API:
Endpoint.publish( "http://192.168.14.117:8888/java6ws/Java6WS", new Java6WS());
另外一種是,本例中Servlet方式。
 
2)、Endpoint.publish是一個後臺線程,一旦發佈了就會一直等待處理Web服務的請求,只有當main方法退出,或者容器關閉的時候,才自動退出。
 
3)、其實除了這種方式,也能夠整合Spring來實現服務的發佈,這就和Spring的Ioc容器整合在一塊兒了。無論什麼,道理就一個,調用Endpoint.publish()方法來實現服務的發佈。
 
4)、在發佈服務的時候,應該避免使用Tomcat容器的端口,一面發生衝突,在本文中,Tomcat使用的端口是8080,而Web服務發佈使用的端口是8888。
相關文章
相關標籤/搜索