2017-02-17 5 views
-2

私はしばらくこのことをしてきましたが、今私は考え始めました。なぜjavax.servlet.http.HttpServletRequestの標準的な定義がないのですか?

HttpServletRequestは、Java標準で定義されたインタフェースです。なぜ我々は常に(アパッチを使用して)以下のような、でもコンパイルのために、具体的な、それのサードパーティ製の定義が必要です:

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

これはjavaxのを使用している純粋な標準、ベンダーに依存しないコードを書くことを意味しています。サーブレットは不可能ですか?

P.S.私はApacheの代わりにGlassfishを手に入れることができます。しかし、これは、共通のインターフェイスにコーディングするのではなく、別の具体的な実装を使用することを意味します。

P.P.S.私の質問をさらに明確にしましょう。 HttpServletRequestインターフェース(と私は実装について話していません)は、ApacheとGlassfishの両方のライブラリーで定義されています。 1つはApache Software Foundationにライセンスされ、もう1つはOracleによって著作権が保護されています。標準的なHttpServletRequestインターフェイスのようなものはありますか?

P.P.P.S.今私は私の質問をさらに洗練することができるように見えます。規格が、複数のベンダーの間にバラツキがないようにインターフェイスをきちんと定義している場合、それを標準ライブラリの一部にしないのはなぜですか?なぜ真実の複数のソースを許可するのですか?

+1

あなたの依存関係の例には、Apacheに関連する** nothing **があります。 – Kayaman

+1

_Java標準を定義します。 –

+0

私は、3.0.1 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がインターフェースとして含む理由です。つまり、準拠のサーブレットコンテナ(TomcatまたはGlassfishまたはWeblogic)が従う必要があるという契約です。準拠していないコンテナが、JEE仕様で指定されたコントラクトに従わないサーブレットAPIを提供しているとします。この場合、実際には、ベンダ依存のコードを書いて、要求コンテキストからパラメータを取得する、または要求コンテキストに関連付けられたセッションオブジェクトを取得するなどの作業を行う必要があります。

しかし、すべてのJEE準拠のコンテナがJEE仕様(例:HttpServletRequestHttpServletResponse)、コンテナを切り替えると破損するベンダー固有のコードを書く必要はありません。

関連する問題