gpt4 book ai didi

servlets - @WebServlet 注释不适用于 Tomcat 8

转载 作者:行者123 更新时间:2023-12-03 23:29:49 25 4
gpt4 key购买 nike

我想用@WebServlet在 Tomcat 8 上运行的 Java EE webapp 中的注释。

我已经读到我需要在 web.xml 中声明 Servlet 版本 3.1并且我的 Servlet 需要扩展 HttpServlet .我做了所有这些,但仍然是 @WebServlet不起作用。我收到一个 HTTP 404。

我也用 metadata-complete="false" 尝试了我的配置在我的 web.xml ,但仍然没有成功。

这是我的 web.xml 和 Servlet。

完整的示例代码可以在 on GitHub 中找到.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>

<!-- http://stackoverflow.com/a/7924117/451634 -->
<!-- Put "-1" to disable this feature -->
<context-param>
<param-name>facelets.REFRESH_PERIOD</param-name>
<param-value>1</param-value>
</context-param>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<!-- JSF -->
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

<!-- CDI -->
<listener>
<listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
</listener>

</web-app>

TestServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "TestServlet", urlPatterns = {"*.serve"})
public class TestServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try (ServletOutputStream out = resp.getOutputStream()) {
out.write("Hello World".getBytes());
out.flush();
}
}

}

最佳答案

我让它工作了。我不得不扩展我启动 Tomcat 8.0.12 服务器的方式。

然而,必须做三件主要的事情:

  • web-app version web.xml 必须至少为 3.0(我使用 3.1)
  • metadata-complete web.xml 可能不是真的 ( default is "false" )
  • classes启动前必须将目录添加到嵌入式 Tomcat

  • 这是 的示例web.xml 文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app
    version="3.1"
    metadata-complete="false"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    </web-app>

    这是我的 Tomcat 主类的样子(现在支持 @WebServlet 注释):
    public static void main(String[] args) throws Exception {
    String contextPath = "/";
    String webappDirLocation = "src/main/webapp/";
    String baseDirectory = new File(webappDirLocation).getAbsolutePath();

    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8080);
    StandardContext context = (StandardContext) tomcat.addWebapp(contextPath, baseDirectory);

    // Additions to make @WebServlet work
    String buildPath = "target/classes";
    String webAppMount = "/WEB-INF/classes";

    File additionalWebInfClasses = new File(buildPath);
    WebResourceRoot resources = new StandardRoot(context);
    resources.addPreResources(new DirResourceSet(resources, webAppMount, additionalWebInfClasses.getAbsolutePath(), contextPath));
    context.setResources(resources);
    // End of additions

    tomcat.start();
    tomcat.getServer().await();
    }

    关于servlets - @WebServlet 注释不适用于 Tomcat 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26089902/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com