【问题标题】:IntelliJ servlet errors, unable to open servletIntelliJ servlet 错误,无法打开 servlet
【发布时间】:2022-02-20 01:26:10
【问题描述】:

我正在尝试创建一个 Web 应用程序,并希望在提交 HTML 表单时打开一个 java servlet。 servlet 不断出现错误(主要是 404 错误),我已经尝试了所有我看到的解决方案,但没有一个有效。

package com.example.kahootwebapp;

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("/HelloServlet")
public class HelloServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter writer = response.getWriter();

        writer.println("<html><body>");
        writer.println("<h1>This is a test</h1>");
        writer.println("</html></body>");

    }

}
<form name="HelloServlet" method="post" action="HelloServlet">
   <label id="label" for="input">Enter kahoot account email: </label><input type="text" id="input" name="username"/>
</form>

Code organization

我在 Apache Tomcat 版本 10.0.16 上运行服务器。目前,我只是试图让 servlet 无错误地打开和运行,然后计划向其中添加代码。谢谢。

【问题讨论】:

  • 将代码添加为文本而不是图像
  • 抱歉,stackoverflow 的新手。编辑消息
  • 您的 Tomcat 服务器日志告诉您什么?

标签: java html tomcat servlets web-applications


【解决方案1】:

雅加达 EE 过渡

您的 Servlet 代码正在使用 javax.* 包名称。这仅适用于 Tomcat 9 及更早版本。将这样的 Servlet 部署到 Tomcat 10+ 会失败。

Tomcat 10+ 使用 jakarta.* 包。

此包名称更改与 Java EE 技术从 Oracle 转移到 Eclipse 基金会有关。该技术正在重命名为 Jakarta EE。在网络上快速搜索将提供许多关于过渡的文章和视频。

您需要在使用老式命名或现代命名之间进行选择。对于较大的复杂项目,您可能希望继续老派,同时将过渡推迟到以后。如果开始一个新项目,我建议考虑现代命名。但是请研究一下您需要的重要库是否已在使用新命名的版本中发布。

如果您选择现代命名,请调整您的 POM 以匹配。您正在编写一个从 Servlet API 中的类扩展而来的 Servlet 类。因此,您的 IDE 和编译器需要该 Servlet API 的副本才能进行编译。请务必使用provided 或scope 标记您的POM,以便不将副本捆绑到最终的Servlet 工件(可能是WAR 文件)中。您的 Servlet 容器(例如 Tomcat 或 Jetty)带有它们自己的 Servlet API 副本。请参阅how to add the servlet api to my pom.xml,但调整这些答案以使用适当的雅加达命名。我通过该调整添加了an Answer there。

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>

Tomcat 版本

知道 Tomcat 9 和 10.0.* 是同等产品,并行开发。期待相同的功能和性能。包命名是主要区别。这两个版本的 Tomcat 分别实现了 Servlet 规范版本 4.3 和 5。 Servlet 5 规范与 4.3 相同,只是合法名称从 Oracle 和 Java 更改为 Eclipse Foundation 和 Jakarta .

Tomcat 10.1.x 目前正在开发中以支持 Jakarta Servlet 6 规范。 Tomcat 10.1.x 现在作为 alpha 预发行版提供。 Jakarta Servlet 6 规范将于 2022 年晚些时候完成。

【讨论】:

  • 当我将导入从 javax.* 更改为 jakarta.* 时,我只会收到整个 servlet 代码的错误,以及“在 Web 上查找 JAR”的建议。我需要下载什么来实现jakarta.* 与实现javax.*?
  • 我的 pom 文件中还有什么需要更改的吗?
  • @Malware 是的,您必须调整您的 POM 以匹配。您正在编写一个从 Servlet API 中的类扩展而来的 Servlet 类。因此,您的 IDE 和编译器需要该 Servlet API 的副本才能进行编译。请务必使用provided 或scope 标记您的POM,以便不 在您的最终Servlet 工件(可能是WAR 文件)中捆绑一个副本。您的 Servlet 容器(例如 Tomcat 或 Jetty)带有它们自己的 Servlet API 副本。请参阅how to add the servlet api to my pom.xml,但调整这些答案以使用适当的雅加达命名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2018-03-10
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多