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的時候,纔會被加載到容器。
四、部署、啓動並測試
點擊超連接,能夠獲取到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。