2012-03-16 38 views
1

我很長一段時間嘗試自學java的ASP.NET開發人員。我有Jetty下載和一個基本的網絡應用程序設置。 Head First Servlets和JSP中的教程告訴我在編譯時引用容器的servlet-api.jar(或者Jetty的案例中的servlet-api-3.0.jar)文件,這是有道理的,因爲我擴展了servlet類和所有的類,但是這不會將我的應用程序綁定到特定容器的servlet實現嗎?如果我用Jetty編譯我的應用程序,我還可以在Tomcat或任何EE服務器(glassfish,jboss等)下部署應用程序嗎?我是否必須針對特定的servlet容器編譯我的java web應用程序類?

+0

我假設你正在擴展HttpServlet?一般來說Jetty沒有任何關於這個類或者http servlet框架的具體內容;你不會被綁定到特定的容器實現。 – skiller3 2012-03-16 19:00:32

+0

那麼爲什麼每個容器都有自己的servlet實現。爲什麼不是Java核心庫的servlet API部分或某個獨立包? – Chris 2012-03-16 19:01:40

+0

據我所知,容器沒有自己的servlet實現。 Jetty維護人員簡單地將servlet-api-3.0.jar與下載捆綁在一起,這是爲了方便您,因爲Jetty(像所有容器)在運行時需要它的類。這些類不是核心Java的一部分,僅僅是因爲它們迎合了非常特殊的上下文(假設世界上有很多生產servlet代碼) – skiller3 2012-03-16 19:05:52

回答

2

不,這不應該成爲問題,因爲您沒有引用特定於servlet的類。 servlet-api.jar是幾個接口和抽象類形式的詳細說明文檔。

每個容器都必須具有此JAR的副本(可能使用不同的Java版本或編譯器進行編譯),因爲它實現了規範,但API本身從不更改。但是請注意,您並不需要引用容器提供的JAR。您可以安全地使用maven的版本或任何其他您可以找到的版本。它們都是兼容的。有時,由於各種許可不兼容,它們並未捆綁在一起。

這就是說:寫一次,到處跑也適用於此處。

1

你沒有對jar編碼,而是編碼到jar恰好包含的規範。任何提供Web容器的服務器都會有這個規範的實現,它所包含的jar是完全不相關的。

只要你只對規範進行編碼,那麼你就沒有綁定到任何服務器實現。

JAR在編譯和運行時使用來解決您所需的類依賴關係。您可以使用任何在編譯時提供必要API依賴項的jar,但是在運行時您將隱式使用特定服務器提供的實現。我隱含地說,因爲你不必爲自己的webapp做任何特定的配置來包含標準的API或其實現,服務器已經爲你提供了,不像獨立的應用程序。

相關問題