为什么javax.servlet.http.HttpServletRequest没有规范定义?

为什么javax.servlet.http.HttpServletRequest没有规范定义?,java,servlets,Java,Servlets,我这样做已经有一段时间了,但现在我开始思考 HttpServletRequest是Java标准中定义的接口。为什么我们总是需要一个具体的、第三方的定义,即使是在编译时,比如下面(使用Apache): javax.servlet servlet api 3.0.1 假如 这是否意味着不可能编写使用javax.servlet的纯标准、独立于供应商的代码 另外,我知道我可以买玻璃鱼而不是阿帕奇。但这意味着我将使用另一个具体的实现,而不是对公共接口进行编码 请允许我进一步澄清我的问题。HttpSer

我这样做已经有一段时间了,但现在我开始思考

HttpServletRequest是Java标准中定义的接口。为什么我们总是需要一个具体的、第三方的定义,即使是在编译时,比如下面(使用Apache):


javax.servlet
servlet api
3.0.1
假如
这是否意味着不可能编写使用javax.servlet的纯标准、独立于供应商的代码

另外,我知道我可以买玻璃鱼而不是阿帕奇。但这意味着我将使用另一个具体的实现,而不是对公共接口进行编码

请允许我进一步澄清我的问题。HttpServletRequest接口(我不是说实现)在Apache和Glassfish库中都有定义。其中一个被授权给Apache软件基金会,另一个则被甲骨文版权保护。是否存在规范的HttpServletRequest接口

p.p.p.S.看来现在我可以进一步完善我的问题了。如果一个标准对一个接口的定义非常严格,以至于多个供应商之间没有可能的差异,那么为什么不将其作为标准库的一部分呢?为什么允许多个真相来源

但这意味着我将使用另一个具体的实现,而不是对公共接口进行编码

不,那完全不是真的。当您向
javax.servlet:ServletAPI
添加依赖项时,您正在指定要编码到公共接口。然后还必须向该接口的特定实现添加依赖项

关键是,java开箱即用不可能包含所有可能的通用接口,供您编写代码。因此,您必须获得感兴趣的接口,然后还必须为其获取特定的实现

javax.servlet.http.HttpServletRequest-它是JavaEE的一部分吗

javax.servlet.http.HttpServletRequest
是JavaEE规范中定义的接口。读这本书

这是否意味着编写纯粹标准的、独立于供应商的代码 哪个使用javax.servlet是不可能的

当您使用实现此接口的任何类时,您正在编写独立于供应商的代码。这就是JEE将其作为一个接口包含的原因——每个兼容servlet容器(Tomcat、Glassfish或Weblogic)都必须遵守的契约。假设一个不兼容的容器提供了一个ServletAPI,它不遵守JEE规范中指定的契约。在这种情况下,您实际上必须编写一个依赖于供应商的代码,以执行从请求上下文检索参数或检索绑定到请求上下文的会话对象等操作


然而,事实上,所有符合JEE的容器都实现了JEE规范中指定的接口(例如,
HttpServletRequest
HttpServletResponse
),您不必编写任何特定于供应商的代码,如果在容器之间切换,这些代码就会中断

您的依赖关系示例与apache.Define Java standard没有任何关系。我怀疑混淆是因为3.0.1 jar(至少是我能够找到的那个jar)确实包含apache实现。但是,如果你看一下,例如,3.0-alpha-1JAR,它只是javax包(即标准API)javax.servlet:ServletAPI在某种意义上是通用的,但不是规范的。我不确定你这样说是反对还是观察。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>