Java EE 7 中的 Servlet、JSP 和 JSTL 需要哪些 maven 依赖项?

Posted

技术标签:

【中文标题】Java EE 7 中的 Servlet、JSP 和 JSTL 需要哪些 maven 依赖项?【英文标题】:What maven dependencies needs for Servlet, JSP and JSTL in Java EE 7? 【发布时间】:2013-06-23 14:24:49 【问题描述】:

我想使用 SDK Java EE 7、Glassfish 4 和 Maven。 这是正确的吗?请注意范围。

1.对于 servlet:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

2。没有标准标签和 JSTL 的 JSP:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.0</version>
</dependency>

3。对于带有标准标签“c:”的 JSP

<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

4.对于带有 JSTL 的 JSP

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    <scope>runtime</scope>
</dependency>

您知道此信息包含的规范吗?

【问题讨论】:

您误解了“标准”标签库的含义。这并不意味着它只包含 c 标签。它基本上是 Apache 的整个 JSTL 1.1.2 实现。然后,您有另一个 JSTL 1.2 实现,它是参考实现(通常来自 Sun/Oracle)。他们显然只会相互冲突。基本上,您最终会得到两个不同的 JSTL 实现。你应该只声明其中之一。请注意,Glassfish 已经开箱即用,因此范围显然应该设置为“提供”。 【参考方案1】:

有多种选择。正如问题中所建议的,一种方法是导入整个 Java EE API。但你也可以更有选择性。您可以改为仅包含 servlet API(这适用于 servlet API 3.0.1;更新的版本可用于相同的工件数据,但旧版本使用工件 ID servlet-api 代替):

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

这个问题暗示 JSTL 包还引入了相关的 JSP 依赖项;情况并非如此:如果您需要使用 JSP API,您确实需要它的依赖项(但值得注意的是 you don't necessarily need it, as discussed at this question)。你应该使用the correct version of the JSP API that matches the Servlet API version you're using,所以对于我上面展示的servlet API 3.0.1,你应该使用2.2:

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

与 Servlet API 一样,JSP API 的依赖数据也发生了变化;在这种情况下,对于早于 2.0 的版本,组 ID 只是 javax.servlet,而对于高于 2.2 的版本,工件 ID 已更改为 javax.servlet.jsp-api

对于 JSTL,您几乎可以肯定只使用 1.2 版。此版本的新标准位置是:

    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

尽管问题中显示的旧位置继续正常工作。据推测,如果将来对该库进行任何更新,它们将包含在该组/工件 ID 中,因为这似乎旨在与所有其他最近的工件适当地匹配。与其他工件不同,JSTL 不是由容器提供的,因此不应将其范围设置为“已提供”。

【讨论】:

【参考方案2】:

您不应该将这些依赖项添加到您的项目中。 J2EE 规范的实例化(例如 servlet)应该由应用服务器的运行时提供。

在 Eclipse 中,为您的应用程序服务器添加服务器运行时。右键单击项目并选择属性。然后构建路径 > 添加库 > 服务器运行时。

【讨论】:

期待 JSTL?为什么? Glassfish 作为一个成熟的 Java EE 容器,已经随 JSTL 一起提供。您不会对 Tomcat 感到困惑,它只是一个准系统 JSP/Servlet 容器,它确实没有捆绑所有其他 Java EE 工件? @BalusC 你完全正确!当我说要从该列表中排除 JSTL 时,我想到了 Tomcat。除了 JSTL 错误之外,我只是想指出您应该依赖服务器来获取这些库,尤其是考虑到您可能会产生版本冲突。 这个答案完全不正确。 Maven 构建 web 应用程序时不参考服务器运行时,因此确实需要有关哪些 API 可用的信息,无论您正在运行哪个服务器。 我使用 Maven 和 package 构建我的应用程序到 war 以便 Tomcat 服务器运行。在这种情况下我该怎么办?

以上是关于Java EE 7 中的 Servlet、JSP 和 JSTL 需要哪些 maven 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Java EE JSP编程基础

Java EE 6:JSF 与 Servlet + JSP。我应该费心学习 JSF 吗?

J2EE:如何在 servlet 中获取一个数组列表,并在 JSP 中的隐藏字段中传递?

[J2EE基础]初识JSP和Servlet

Java EE基础之JSP

互联网大厂(字节华为)Java EE面试题:Servlet/JSP 部分解析+答案,最强八股文