
本文旨在解决 jetty 服务器启动后出现 404 not found 错误的问题。核心在于正确配置和关联 servletcontexthandler 与 server 实例。许多开发者在初始化 servletcontexthandler 后,忘记将其附加到 server 上,导致请求无法被正确路由。教程将详细解释如何通过 server.sethandler(handler); 方法确保 servlet 上下文处理器被服务器识别并处理传入的请求,从而避免 404 错误,确保应用程序正常运行。
在使用 Jetty 构建 Web 应用程序时,开发者可能会遇到服务器启动成功但访问特定路径时返回 404 Not Found 错误的情况。这通常意味着 Jetty 服务器未能将传入的请求路由到正确的处理程序(Handler)或 Servlet。当请求到达服务器时,Jetty 会尝试根据其配置的处理器链来匹配请求路径。如果没有任何处理器被配置来处理该路径,或者处理器虽然存在但未被正确地附加到服务器实例上,那么服务器就无法找到对应的资源,从而返回 404 状态码。
在 Jetty 的架构中,Server 实例是核心,它负责监听端口、接收连接并分派请求。而具体的请求处理逻辑,例如 Servlet 上下文、静态文件服务等,都是通过各种类型的 Handler 来实现的。ServletContextHandler 是一种常见的 Handler,用于定义一个 Web 应用程序的上下文,包括其上下文路径、Servlet 映射等。
许多开发者在初始化 ServletContextHandler 后,可能会遗漏一个关键步骤:将其附加到 Server 实例上。以下是一个常见的错误示例代码片段:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
public class MyJettyApp {
public static void main(String[] args) throws Exception {
Server server = new Server(8080); // 创建 Jetty 服务器实例
// 创建 ServletContextHandler,并指定上下文路径
ServletContextHandler handler = new ServletContextHandler(server, "/example");
// 配置 Jersey ResourceConfig
ResourceConfig config = new ResourceConfig();
config.packages("api"); // 扫描 'api' 包下的 JAX-RS 资源
// config.register(new CORSConfig()); // 假设有一个CORS配置
// 创建 ServletHolder,包装 Jersey ServletContainer
ServletHolder holder = new ServletHolder(new ServletContainer(config));
// 将 ServletHolder 映射到 /api/* 路径
handler.addServlet(holder, "/api/*");
// !!! 错误点:这里缺少将 handler 附加到 server 的代码 !!!
try {
server.start(); // 启动服务器
server.join(); // 阻塞主线程,直到服务器停止
} finally {
server.stop(); // 停止服务器
server.destroy(); // 销毁服务器资源
}
}
}在上述代码中,ServletContextHandler 被创建,并且其内部配置了 Jersey Servlet,但这个 handler 实例并没有被告知给 server 实例。因此,当请求到达 localhost:8080/api 或 localhost:8080/example/api 时,Jetty 服务器并不知道应该由哪个处理器来处理这些请求,最终导致 404 错误。
解决上述 404 问题的关键在于,在 server.start() 之前,明确地将 ServletContextHandler 附加到 Server 实例上。这可以通过调用 server.setHandler(handler); 方法来实现。
修正后的代码示例如下:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
public class MyJettyApp {
public static void main(String[] args) throws Exception {
Server server = new Server(8080); // 创建 Jetty 服务器实例
// 创建 ServletContextHandler,并指定上下文路径
// 注意:这里的上下文路径是针对整个 Web 应用的根路径,例如 "/example"
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/example"); // 设置上下文路径
// 配置 Jersey ResourceConfig
ResourceConfig config = new ResourceConfig();
config.packages("api"); // 扫描 'api' 包下的 JAX-RS 资源
// config.register(new CORSConfig()); // 假设有一个CORS配置
// 创建 ServletHolder,包装 Jersey ServletContainer
ServletHolder holder = new ServletHolder(new ServletContainer(config));
// 将 ServletHolder 映射到 /api/* 路径
// 注意:这里的 /api/* 是相对于上下文路径 /example 的,
// 所以最终访问路径是 /example/api/*
handler.addServlet(holder, "/api/*");
// !!! 关键修正:将 handler 附加到 server !!!
server.setHandler(handler);
try {
server.start(); // 启动服务器
server.join(); // 阻塞主线程,直到服务器停止
} finally {
server.stop(); // 停止服务器
server.destroy(); // 销毁服务器资源
}
}
}代码解释:
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] { yourContextHandler, yourResourceHandler, new DefaultHandler() });
server.setHandler(handlers);Jetty 服务器出现 404 Not Found 错误,尤其是在 Servlet 或 RESTful API 配置后,最常见的原因是 ServletContextHandler 没有被正确地附加到 Server 实例上。通过在 server.start() 之前调用 server.setHandler(handler);,可以确保 Jetty 服务器能够识别并处理由该 handler 管理的请求。理解 Server、Handler 和 ServletContextHandler 之间的关系,并遵循正确的配置流程,是构建稳定可靠 Jetty 应用程序的关键。在遇到问题时,系统地检查配置、上下文路径、Servlet 映射以及利用日志进行调试,将有助于快速定位并解决问题。
以上就是Jetty 服务器 404 错误诊断与 Servlet 上下文处理器配置详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号