У меня есть весенняя web-архитектура mvc, которую я не совсем понимаю.Эквивалентен расширению HttpServlet
Java код:
public class ErrorHandler extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
out.println("<html><head><title>ERROR</title></head><body>");
out.println("<h1>An error occured</h1>");
out.println("</body></html>");
}
}
web.xml
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>some.package.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>403</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ErrorHandler</location>
</error-page>
Семантика этого кода ясно, я думаю: это обработчик ошибок, который перехватывает ошибки статуса HTTP с одной стороны (403 и 404), но также задерживает внутренние исключения (например, деление на 0, поэтому внутренние 500 ошибок).
Теперь я хочу реорганизовать его. Это означает, что я хочу создать только код Java только потому, что остальная часть проекта также находится в этой структуре, и я хочу, чтобы это было равномерно.
Но вот мои проблемы, потому что от того, что я исследовал, не compleatly ясно мне:
- Почему кто-то здесь продлил
HttpServlet
класс? Разве это не так, как аннотация@RequestMapping
? Но когда я удаляюextends HttpServlet
и ставил@RequestMapping
на методdoGet
, что мне нужно установить для значения? Или есть отображение вообще?
Как я могу избавиться от расширения? <exception-type>java.lang.Throwable</exception-type>
должен быть эквивалентен@ExceptionHandler(value={Throwable.class})
с@RestControllerAdvice
. Или я здесь не прав?- И что такое
<error-code>404</error-code>
? Является ли это эквивалентом@ExceptionHandler(value={ResourceNotFoundException.class})
? Или это enouph, что Trowable.class поймали? - И я что-то упускаю? Новый код должен быть минимальным, как старый. Таким образом, должна быть, по крайней мере, одна и та же функциональность, но все же это нормально (ModelAndView как возврат вместо void и PrintWriter. И перемещение класса в другие пакеты без изменения web.xml, ....)
Спасибо за любую помощь :)
Архитектура этого проекта - полный беспорядок. В целом проект имеет относительно нормальную весеннюю архитектуру mvc. RequestMappings используются вместе с hibernate и JPA для обеспечения устойчивости. Но обработка ошибок «специальная». И единственное, что я пытаюсь сделать, - использовать шаблон jsp для страницы с ошибкой. но я не могу вернуть ModelAndView, потому что методы из HttpServlet недействительны. '@ ExceptionHandler' внутри' @ ControllerAdvice' может уловить внутренние 500 ошибок. Но как я могу поймать ошибки 404 и 403? Или есть даже «поймать все»? – christopher2007
Не работает ваш 'ErrorHandler' в случае ошибок 404 или 403? На основе вашего web.xml он должен вызываться всякий раз, когда вызывается это исключение. Если вы хотите использовать файл jsp вместо «PrintWriter», вы можете его достичь: request.getRequestDispatcher («/ WEB-INF/examplePage.jsp»). Forward (request, response); 'в конце вашего 'doGet'. Вы также можете передать некоторые дополнительные атрибуты и отобразить их внутри jsp-файла по запросу, используя: 'request.setAttribute (« данные », данные);'. –
Теперь я удалил все, что связано с обработкой ошибок из 'web.xml'. Я добавил ' throwExceptionIfNoHandlerFound ' -> 'true' диспетчеру и имеет' @ ExceptionHandler' метод весны. Теперь выхватываются внутренние 500 ошибок, а также 404. '' НО '' в голове нет правильного кода состояния. Это всегда 200. Я должен установить его вручную? Если да, то как? Или мне не хватает конфигурации? –
christopher2007