Как отправить ответ сервлета на страницу настроенной ошибки web.xml - PullRequest
2 голосов
/ 12 января 2010

Я использую Tomcat. Я определил некоторые значения <error-page> в web.xml и отобразил ошибку 404 на странице /error/error.jsp. Мне нужно определить, существует ли ресурс, и установить статус ответа 404, если ресурс недоступен.

response.setStatus(404);

Но Tomcat не перенаправляет на страницу 404, которую я определил, поэтому мой вопрос: есть ли API для получения местоположения страницы, определенного в web.xml? Я не хочу разбирать web.xml самостоятельно.

Ответы [ 2 ]

4 голосов
/ 12 января 2010

Просто используйте HttpServletResponse#sendError() с кодом состояния . Э.Г.

File resource = new File(path, name);
if (!resource.exists()) {
    response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404.
    return;
}

Затем сервлет-контейнер отобразит соответствующую страницу ошибки.

Примечание: оператор return не предназначен для оформления. Это позволит избежать того, что оставшаяся часть кода в том же блоке метода продолжит выполняться и может выдать IllegalStateException s в журналах сервера приложений! Начинающие часто думают, что такие методы, как sendRedirect(), forward(), sendError() и т. Д., Каким-то образом автоматически выходят из блока метода при вызове. Таким образом, не верно;)

1 голос
/ 12 января 2010

Нет, API не существует. Параметр является внутренним для Tomcat, он не раскрывает его непосредственно внешнему миру. (Как вы сказали, вы можете разобрать web.xml - поскольку это XML, было бы просто написать XQuery, чтобы вытащить это).

Также я думаю, что вы, кажется, не понимаете, как именно это должно работать. Вы предоставляете Tomcat URI, который он будет использовать для обслуживания тела HTML ответа 404. Он должен быть в состоянии разрешить этот URI в фактический ресурс так же, как если бы он был предоставлен в запросе. Поэтому во многих случаях вам не нужен сервлет, чтобы определить, существует ли ресурс - вам нужен сервлет, содержащий ресурс для обслуживания . Исключение составляют случаи, когда вы используете Tomcat для предоставления статических данных файловой системы для некоторых URL-адресов, что, я считаю, возможно, хотя и используется редко.

Если у вас настроен Tomcat без каких-либо сервлетов, что вы ожидаете в любом случае? Откуда вы ожидаете, что он получит вашу страницу error.jsp? Откуда ты это знаешь? Вам нужно добавить хотя бы один сервлет в Tomcat (содержащий файл error.jsp), а затем убедитесь, что web.xml сопоставляет URL-адрес /error/error.jsp с этим сервлетом (а ресурс расположен в подкаталоге error). в сервлете).

Как только это будет сделано, вы сможете вручную перейти, например, к. http://localhost:8080/<context>/error/error.jsp и ответ получен (возможно, с каким-то странным контентом, поскольку нет фактического исключения, но файл должен быть найден). Точно так же, если вы правильно установили директиву страницы ошибок в файле web.xml, переход по размеченному URL-адресу (например, http://localhost:8080/<context>/asdfghjasgh) должен показать вашу страницу ошибки как ответ 404.

...