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中添加<scope>provided</scope>
。但是,为什么我需要包含这个 jar?当我删除它时,哪些类或文件会出现错误?
我不确定 javax.servlet.jsp-api 的作用。如果我不包含它,我的 hello world 示例似乎运行得很好。这是做什么的?我是否需要添加<scope>provided</scope>
?
JSTL 不是由任何 servlet 容器提供的,因此必须显式添加。这个 jar 确保 <c:xxx>
和其他基本标记在我的 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 的目的是啥的主要内容,如果未能解决你的问题,请参考以下文章