我如何更改它以用 html 页面替换 404 页面错误?
how can i change this to replace the 404 page error with a html page?
我必须使用 html 文件中的自定义页面更改 404 错误页面。
我写了这段代码,但它不起作用,and/or我不知道如何使用它。
public static void main(String[] args) throws Exception {
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
Server jettyServer = new Server(8080);
context.setWelcomeFiles(new String[] { "./src/main/resources/index.html" });
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "./src/main/resources/error.html");
context.setErrorHandler(errorHandler);
// HTML
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
context.addServlet(holderPwd, "/*");
// SERVICES
ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class,
"/ajax/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
DiskServiceWS.class.getCanonicalName() + "," + RamServiceWS.class.getCanonicalName() + ","
+ CpuServiceWS.class.getCanonicalName());
jettyServer.setHandler(context);
try {
jettyServer.start();
jettyServer.join();
} finally {
jettyServer.destroy();
}
}
您没有指出您遇到的是哪种 404 错误。
如果 404 来自 Jetty 本身(不是上下文的一部分),那么它由 Server
级别 ErrorHandler
控制。 (例如在您的场景中对 http://<machine>/foo/bar
的 GET 请求,因为“/foo”不是您的“/wac”上下文的一部分)
如果 404 从错误回流到 ServletContextHandler
,那么您现有的 ErrorPageErrorHandler
大部分是正确的。
addErrorPage
上的第二个参数是 URL 路径(相对于您声明的基础资源),而不是文件系统路径。
示例(假设 /error.html
可通过网络 GET 请求访问):
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "/error.html");
context.setErrorHandler(errorHandler);
注意:URL 路径可以指向一个 Servlet(你的,一个 jsp,一个球衣端点,等等)如果你愿意,它不一定是 HTML.
如果 404 来自 JAX-RS / Jersey 请求,则 JAX-RS / Jersey 中有特定处理以根据传入请求详细信息生成有效的 404 错误响应。
例如,REST 客户端请求 JSON 资源,而 Jersey 生成 404 响应,其中 JSON 正文指示错误详细信息。
其他注意事项...
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
不要在 DefaultServlet
上声明你的 resourceBase
,在你的 ServletContextHandler
上声明它。
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
context.setBaseResource(Resource.newResource("/path/to/my/base/directory"));
此外,resourceBase
是完全限定的目录路径(或 URI),绝不是文件或相对路径。
和 setWelcomeFiles
是文件名或相对路径 URL 如果传入的 GET 请求是针对目录资源,则要使用的位置。
示例:
context.setWelcomeFiles(new String[] { "index.html", "welcome.html", "index.jsp" });
这样一个请求说 http://<machine>/wac/
将导致实际服务 http://<machine>/wac/index.html
(如果存在)。
这也适用于深层目录请求,例如 http://<machine>/wac/app/deps/scripts/jquery/
将导致提供 http://<machine>/wac/app/deps/scripts/jquery/index.html
的内容
我必须使用 html 文件中的自定义页面更改 404 错误页面。 我写了这段代码,但它不起作用,and/or我不知道如何使用它。
public static void main(String[] args) throws Exception {
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
Server jettyServer = new Server(8080);
context.setWelcomeFiles(new String[] { "./src/main/resources/index.html" });
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "./src/main/resources/error.html");
context.setErrorHandler(errorHandler);
// HTML
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
context.addServlet(holderPwd, "/*");
// SERVICES
ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class,
"/ajax/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
DiskServiceWS.class.getCanonicalName() + "," + RamServiceWS.class.getCanonicalName() + ","
+ CpuServiceWS.class.getCanonicalName());
jettyServer.setHandler(context);
try {
jettyServer.start();
jettyServer.join();
} finally {
jettyServer.destroy();
}
}
您没有指出您遇到的是哪种 404 错误。
如果 404 来自 Jetty 本身(不是上下文的一部分),那么它由 Server
级别 ErrorHandler
控制。 (例如在您的场景中对 http://<machine>/foo/bar
的 GET 请求,因为“/foo”不是您的“/wac”上下文的一部分)
如果 404 从错误回流到 ServletContextHandler
,那么您现有的 ErrorPageErrorHandler
大部分是正确的。
addErrorPage
上的第二个参数是 URL 路径(相对于您声明的基础资源),而不是文件系统路径。
示例(假设 /error.html
可通过网络 GET 请求访问):
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "/error.html");
context.setErrorHandler(errorHandler);
注意:URL 路径可以指向一个 Servlet(你的,一个 jsp,一个球衣端点,等等)如果你愿意,它不一定是 HTML.
如果 404 来自 JAX-RS / Jersey 请求,则 JAX-RS / Jersey 中有特定处理以根据传入请求详细信息生成有效的 404 错误响应。
例如,REST 客户端请求 JSON 资源,而 Jersey 生成 404 响应,其中 JSON 正文指示错误详细信息。
其他注意事项...
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
不要在 DefaultServlet
上声明你的 resourceBase
,在你的 ServletContextHandler
上声明它。
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
context.setBaseResource(Resource.newResource("/path/to/my/base/directory"));
此外,resourceBase
是完全限定的目录路径(或 URI),绝不是文件或相对路径。
和 setWelcomeFiles
是文件名或相对路径 URL 如果传入的 GET 请求是针对目录资源,则要使用的位置。
示例:
context.setWelcomeFiles(new String[] { "index.html", "welcome.html", "index.jsp" });
这样一个请求说 http://<machine>/wac/
将导致实际服务 http://<machine>/wac/index.html
(如果存在)。
这也适用于深层目录请求,例如 http://<machine>/wac/app/deps/scripts/jquery/
将导致提供 http://<machine>/wac/app/deps/scripts/jquery/index.html