我读了 Tomasz Nurkiewicz 的答案,到目前为止有 22 人赞成。请注意,他在4 年前回答。
我想知道为什么我需要一个几乎是空的 xml 文件?
我用 Servlet 3 尝试了一个 hello world。
package com.servlet3;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/helloServlet3")
public class HelloServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h3>Hello Servlet</h3>");
out.print("</body></html>");
}
}
而且我能够成功运行这个小型 Web 应用程序。

重要的提示:
请注意,此示例中不存在 web.xml 。

所以,我们不需要这种几乎是空的web.xml。
但是,web.xml 是强制性的,如果您需要基于表单的身份验证(但是,没有 Spring安全性)。因为,没有可用于>的等效注释。<login-config
根据SO中的这篇文章
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login</form-login-page>
<form-error-page>/login?event=Retry</form-error-page>
</form-login-config>
</login-config>
...配置基于表单的身份验证的唯一方法是使用部署描述符(web.xml 或 web-fragment.xml)。
根据 JSR-315 Servlet 3.0 规范 :: Ch13.6.3 (pg132):
“Web 应用程序部署描述符包含登录表单和错误页面的条目......”
规范仅指表单登录配置的 Web 部署描述符,而不是任何基于注释的配置。
更新:
以上删除信息与 Java EE6有关。
在 Java EE7中,我们可以做基于表单的身份验证编程方式..
来自Java EE7官方教程,
48.3.1 以编程方式认证用户
HttpServletRequest 接口的以下方法使您能够以编程方式对 Web 应用程序的用户进行身份验证。
authenticate允许应用程序在不受约束的请求上下文中发起容器对请求调用者的身份验证。登录对话框显示并收集用户名和密码以进行身份验证。
login允许应用程序收集用户名和密码信息,作为在应用程序部署描述符中指定基于表单的身份验证的替代方法。
注销允许应用程序重置请求的调用者身份。