程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java6 WebService的發布

Java6 WebService的發布

編輯:關於JAVA

WebService服務發布往往比較混亂,Axis2的發布形式與XFire發布方式差別很大,而Java6 Web服務的發布與Axis2、XFire的Web服務的發布方式也有著天壤之別,它們之間沒有經驗可以借鑒。

因此,很有必要鑽研下Java6的Web服務的發布方式。

從前面兩篇文章可以看出Java6對WebService的發布提供了API級別的直接支持,發布只需要一行代碼就搞定了。但是作為一個服務,就需要啟動,總不能每次啟動都去運行一個Main方法來啟動吧。

實際中Web服務的發布常常伴隨著Web容器的啟動而發布,而在Java6中,我們沒法直接像Axis2和XFire那樣直接去發布,但是可以通過變通的方法,通過Servlet來和容器綁定起來,在容器啟動的時候發布服務。

下面以Tomcat為例,來實現Java6 Web服務的發布。

1、開發WebService服務

package lavasoft.server;
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!";
         }
}

2、開發發布服務的Servlet,為了通用性,最好選擇GenericServlet來繼承

package lavasoft.servlet;
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裡面僅僅寫了一個提示性的語句。

3、配置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的時候,才會被加載到容器。

4、部署、啟動並測試

啟動Tocmat6,浏覽器中輸入:http://localhost:8080/java6ws/

點擊超鏈接,可以獲取到WSDL如下:

可見,服務伴隨著tomcat的啟動發布成功。

5、總結

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。

出處:http://lavasoft.blog.51cto.com/62575/227988

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved