Как я могу изменить это, чтобы заменить ошибку страницы 404 на html-страницу?

Мне нужно изменить страницу ошибки 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? Из пристани? Из вашего ServletContextHandler? или из вашего слоя Джерси?

Joakim Erdfelt 30.05.2019 19:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не указали, какую ошибку 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

Другие вопросы по теме