javax.servlet.jsp-api 的目的是啥

Posted

技术标签:

【中文标题】javax.servlet.jsp-api 的目的是啥【英文标题】:What is the purpose of javax.servlet.jsp-apijavax.servlet.jsp-api 的目的是什么 【发布时间】:2016-08-23 08:53:23 【问题描述】:

我正在学习如何制作一个符合 servlet 3.1 的 webapp,它将在 JBoss wildfly 10 上运行。我使用 maven 作为依赖项,但我不确定以下依赖项的确切作用,以及它们是否包含/不包含在 servlet 容器中:

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>$servlet.version</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>$jstl.version</version>
        </dependency>

我已经进行了一些谷歌搜索,并希望验证或完成以下信息:

servlet api是servlet容器提供的,所以我可以在Maven中添加&lt;scope&gt;provided&lt;/scope&gt;。但是,为什么我需要包含这个 jar?当我删除它时,哪些类或文件会出现错误? 我不确定 javax.servlet.jsp-api 的作用。如果我不包含它,我的 hello world 示例似乎运行得很好。这是做什么的?我是否需要添加&lt;scope&gt;provided&lt;/scope&gt;? JSTL 不是由任何 servlet 容器提供的,因此必须显式添加。这个 jar 确保 &lt;c:xxx&gt; 和其他基本标记在我的 jsp 中得到正确处理。

【问题讨论】:

【参考方案1】:

将依赖项标记为已提供将使其可用于编译时和测试类路径,但不适用于运行时类路径 - 正如您所说,容器将在运行时提供这些 API 的实现。

    如果您正在开发一个 Web 应用程序,则不太可能不使用 Servlet API 中的类(HttpServletRequest、HttpServletResponse、Filter 等)。尽管许多框架抽象出大部分 Servlet API,但您仍然可能需要使用这些底层 API。

    是的,添加提供的范围。但是,例如,如果您通过扩展 javax.servlet.jsp.tagext.TagSupport 来创建自定义 JSP 标记(尽管标记文件提供了一种更现代的方式来创建自定义标记),那么您只需要在编译时类路径中使用它.

    是的,是的。

【讨论】:

在依赖项中包含 JSP API 的另一个原因是,如果您使用的是 Eclipse; Eclipse 喜欢它的存在,因为它会执行 JSP 文件的测试编译以扫描它们是否存在错误,因此您会收到有关标识符的错误,例如 PageContext 和其他基本 JSP 类型如果不存在则不可用。

以上是关于javax.servlet.jsp-api 的目的是啥的主要内容,如果未能解决你的问题,请参考以下文章

jsp自定义标签

SSM项目搭建步骤

Eplan画图时如何关联电缆的源和目的?

html5的设计目的

动词不定式 作状语,修饰动词或句子,表示原因或目的

源IP源MAC目的IP目的MAC,在整个网络中的变化