Как отловить исключение сервлета из JSP с атрибутом errorPage? - PullRequest
0 голосов
/ 04 марта 2019

В настоящее время я занимаюсь разработкой веб-проекта с помощью веб-компонентов (сервлетов и JSP), компонент Jsp использует «элементы сценариев» для перенаправления запроса при возникновении исключения (особенно элемент директивы и атрибут errorPage, например,следующий пример):

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" errorPage="Error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
</head>
<body>
    <form name="formulario" method="get" action="http://localhost:8080/Pruebas/LanzaError">
    User: <input type="text" name="user">
    <input type="submit" value="Send">
</form>
</body>
</html>

Приведенный выше JSP вызывает LanzaError Сервлет, который содержит следующий код в doGet Метод:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
    if (true) {
            throw new ServletException("Error de Servlet");
    }

}

Как вы можете видеть, намеренноЯ создал ServletException.

Как я использовал атрибут errorPage в элементе директивы, я думаю, JSP должен перенаправить на страницу Error.jsp, которая содержит следующий код:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
</head>
<body>
    <h1><%= exception.getLocalizedMessage() %></h1>
</body>
</html>

Однако этого не произошло, когда из сервлета было сгенерировано исключение.

Кто-нибудь знает, как я могу выполнить перенаправление на страницу Error.jsp, когда в сервлете было создано исключение ?.Я не хотел бы делать это с RequestDispatcher кодом. Я хотел бы бросить исключение из метода (как подпись метода говорит: throws ServletException, IOException`).

Спасибо за вашу помощь.

Отредактировано --------------:

На веб-сайте ссылка Прочитал следующий комментарий:

Один из способов справиться с этим общим способом - использовать web.xml, как показано ниже:

<error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Я только что включил исключение ввода-вывода, но вы могли бы сказать SQLException, что вы вполне могли бы добавить еще одну страницу ошибкии другое место для того же.Точно так же можно сказать тип java.lang.Exception и один обработчик, обрабатывающий все.

¡Это работает !, однако если я добавлю элемент xml error-page, то управление исключением будет абсолютным,т.е. все типы исключений, которые они разделяют среди сервлетов (или с одинаковым кодом состояния), должны иметь одну и ту же страницу с ошибкой (из-за этого способ был объявлен в дескрипторе web.xml).Пожалуйста, исправьте меня, если я ошибаюсь.

По этой причине я думаю, что в любых случаях, когда только один сервлет выбрасывает определенную страницу с ошибкой, наиболее подходящим является использование `RequestDispatche '(и таким образом вы делаетене нужно добавлять какой-либо другой новый элемент в web.xml).

Но теперь у меня возникла новая проблема. В этом коде я добавил RequestDispatcher:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
        try {
            if (true) {
                throw new ServletException("Error de Servlet");
            }
        }catch(Exception e) {
            RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
            rd.forward(request, response);
        }
    }

Когда запрос имеетнаконец, достиг Error.jsp, он не обнаруживает запрос как ошибку, по этой причине он не обнаруживает неявный объект exception, а Error.jsp вызывает nullPointerException.Кто-нибудь знает, как мне поступить?

Другим способом doint может быть добавление атрибута объекта ответа из catch сервлета с сообщением об ошибке, но я не верю, что это будет правильный способ сделать это (это сделает маленькийпотеря атрибута isErrorPage в веб-компоненте jsp).

Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...