2017-02-17 26 views
-2

我已經這樣做了一段時間了,但現在我開始思考了。爲什麼沒有javax.servlet.http.HttpServletRequest的規範定義?

HttpServletRequest是Java標準中定義的接口。爲什麼我們總是需要的是一個具體的,第三方的定義,甚至編譯,就像以下(使用Apache):

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    <version>3.0.1</version> 
    <scope>provided</scope> 
</dependency> 

這是否意味着寫這是使用的javax純粹的標準,廠商無關的代碼。 servlet是不可能的?

P.S.我知道我可以得到Glassfish而不是Apache。但這意味着我將使用另一個具體的實現,而不是編碼到一個通用接口。

P.P.S.讓我進一步澄清我的問題。 HttpServletRequest接口(我不是在談論實現)在Apache和Glassfish庫中都有定義。一個被許可給Apache軟件基金會,另一個受Oracle的版權保護。有沒有規範的HttpServletRequest接口這樣的事情?

P.P.P.S.看起來像現在我可以進一步完善我的問題。如果一個標準定義的接口非常緊密,以至於多個供應商之間沒有可能的差異 - 爲什麼不把它作爲標準庫的一部分呢?爲什麼要允許多個真相來源?

+1

你的依賴例子有**沒有**與Apache。 – Kayaman

+1

定義_J​​ava standard_。 –

+0

我懷疑這個混淆來自於3.0.1 jar(至少我能找到的那個jar)包含Apache實現。但是,如果您看一下例如3.0-alpha-1 jar,那麼它就是javax包(即標準API) –

回答

1

但是這意味着我將使用另一個具體的實現,而不是編碼到一個通用接口。

不,這是完全不正確的。當您向​​添加依賴關係時,您指定要編碼到通用接口。然後您將不得不添加一個依賴到該接口的特定實現。

問題是,開箱即用的java不可能包含所有可能的常見接口供您編碼。所以,你必須獲得你感興趣的接口,然後你還必須獲得一個特定的實現。

+0

javax.servlet:servlet-api在通常可用的意義上是常見的,但不是它是典型的。 – Alexander

+0

嗯,是的。我不確定你是否提出反對或觀察。 –

0

javax.servlet.http.HttpServletRequest - 它是Java EE的一部分嗎?

是的。 javax.servlet.http.HttpServletRequest是Java EE規範中定義的接口。閱讀docs

這是否意味着使用javax.servlet編寫純粹標準的獨立於供應商的代碼 是不可能的?

當您使用任何實現此接口的類時,您正在編寫與供應商無關的代碼。這就是JEE將它作爲一個接口的原因 - 合同兼容的servlet容器(Tomcat或GlassFish或Weblogic)必須遵守。設想一個不兼容的容器提供了一個不遵守JEE規範中指定的合約的servlet api。在這種情況下,您實際上必須編寫一個供應商依賴的代碼來執行諸如從請求上下文中檢索參數或檢索綁定到請求上下文的會話對象。然而,所有符合JEE的容器都實現JEE規範中指定的接口(例如,JEE規範)的事實。HttpServletRequest,HttpServletResponse),您不必編寫任何供應商特定的代碼,如果您在容器之間切換,該代碼將會中斷。

相關問題