Мне нужно изменить страницу ошибки 404 на пользовательскую страницу из моего html-файла. Я написал этот код, но он не работает, и/или я не знаю, как его использовать.
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. (например, запрос GET для http://<machine>/foo/bar в вашем сценарии, поскольку «/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-адрес может указывать на сервлет (ваш, jsp, конечную точку трикотажа и т. д.), если вы хотите, это не обязательно должен быть HTML.
Если 404 исходит из запроса JAX-RS/Джерси, то в JAX-RS/Джерси есть специальная обработка для получения действительного ответа об ошибке 404 на основе сведений о входящем запросе.
Примером может служить клиент REST, запрашивающий ресурс JSON, и Джерси, создающий ответ 404 с телом JSON, указывающим детали ошибки.
Другие заметки...
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
Не объявляйте свой resourceBase на своем DefaultServlet, объявляйте его на своем 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
Какая ошибка 404? Из пристани? Из вашего ServletContextHandler? или из вашего слоя Джерси?