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
本文配套源碼