在groupId javax.servlet
下的maven资源库中,我有两个独立的servlet工件。我很困惑应该使用哪一个来构建一个简单的servlet应用程序?这两个工件之间有什么区别?
答案 0 :(得分:8)
您需要添加
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
到你的项目。您需要的版本可能有所不同 - 这取决于您的servlet容器,例如Tomcat的。
<scope>provided</scope>
因为你在运行时不需要它,它已经在你的servlet容器中了。
答案 1 :(得分:7)
javax.servlet-api 3.0.1版具有一个注释文件夹,其中包含不同的注释类,其中servlet-api版本2.5或更低版本(即版本2.4)不包含注释。
注释表示元数据。如果使用注释,则不需要部署描述符,即web.xml。例如,如果在servlet文件中使用@WebServlet("/hello")
之类的注释,则不需要在web.xml文件中提及servlet映射。
一些有用的注释是:
@HandlesTypes
@HttpConstraint
@HttpMethodConstraint
@MultipartConfig
@ServletSecurity
@WebFilter
@WebInitParam
@WebListener
@WebServlet
答案 2 :(得分:5)
使用 javax.servlet-api.jar ,许多开发人员错误地将servlet-api.jar包含在他们的WEB-INF / lib文件夹中。这不再导致异常,因为Tomcat和其他应用服务器在部署JAR文件时会将其识别为问题。但是,它确实会导致容器忽略包含javax / servlet / Servlet.class的任何JAR文件。
答案 3 :(得分:1)
如果您必须在不支持servlet 3.0规范的较旧的应用服务器版本上部署(希望不太可能),请坚持使用旧的servlet-api。
通过3.0规范,他们将其移至了javax.servlet-api。参见:https://javaee.github.io/servlet-spec/
现在,随着Java EE从Oracle迁移到Eclipse Foundation(Jakarta EE),该规范再次发生了变化。如果您想保持最新状态,请尽可能考虑使用新的组和工件:set x [regsub -all "***=r\[$bit\]" $p $value]
答案 4 :(得分:0)
对于使用 gradle ...
的用户如果我使用compileOnly
声明我的依赖关系,如下所示:
compileOnly "javax.servlet:javax.servlet-api:3.1.0"
然后我收到一个编译错误:
error: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
^
如果我按以下方式使用providedCompile
,则表示编译成功。
providedCompile "javax.servlet:javax.servlet-api:3.1.0"
要使用providedCompile
依赖项,您需要使用war插件。
apply plugin: 'war'