2016-12-20 4 views
0

У меня есть весенняя 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 ясно мне:

  1. Почему кто-то здесь продлил HttpServlet класс? Разве это не так, как аннотация @RequestMapping? Но когда я удаляю extends HttpServlet и ставил @RequestMapping на метод doGet, что мне нужно установить для значения? Или есть отображение вообще?
    Как я могу избавиться от расширения?
  2. <exception-type>java.lang.Throwable</exception-type> должен быть эквивалентен @ExceptionHandler(value={Throwable.class}) с @RestControllerAdvice. Или я здесь не прав?
  3. И что такое <error-code>404</error-code>? Является ли это эквивалентом @ExceptionHandler(value={ResourceNotFoundException.class})? Или это enouph, что Trowable.class поймали?
  4. И я что-то упускаю? Новый код должен быть минимальным, как старый. Таким образом, должна быть, по крайней мере, одна и та же функциональность, но все же это нормально (ModelAndView как возврат вместо void и PrintWriter. И перемещение класса в другие пакеты без изменения web.xml, ....)

Спасибо за любую помощь :)

ответ

1

Кстати, ваш web.xml выглядит так, будто мне не кажется, что это приложение Spring MVC как таковое основано на DispatcherServlet, которые не были включены в дескриптор развертывания. Тем не менее я попытался ответить на ваши вопросы.

Расширяя свой класс с HttpServlet, вы делаете этот класс подходящим для управления http-запросами путем переопределения методов, таких как doPost или doGet. Затем вы можете зарегистрировать свой сервлет внутри web.xml и указать для него сопоставление. Это не эквивалентно аннотациям, специфичным для Spring, @RequestMapping. Если вы хотите обрабатывать исключения с помощью Spring MVC (и поэтому не используете для этого класс HttpServlet), вам нужно настроить свой web.xml для поддержки Spring MVC, создать класс @Controller и создать внутри него метод @ExceptionHandler, который будет вызываться всякий раз, когда данный исключение было выбрано внутри области действия контроллера. Другим способом обработки исключений в Spring MVC может быть класс, аннотированный @ControllerAdvice. Если Spring не смог найти обработчик исключений для исключения в области контроллера, в котором было выбрано исключение, он будет искать его в классе, аннотированном с помощью @ControllerAdvice.

Если вы еще не работали с Spring MVC, и вы не знаете, как это работает, проверьте этот учебник: https://www.tutorialspoint.com/spring/.

Надеюсь, что я смог прояснить несколько вещей для вас.

+0

Архитектура этого проекта - полный беспорядок. В целом проект имеет относительно нормальную весеннюю архитектуру mvc. RequestMappings используются вместе с hibernate и JPA для обеспечения устойчивости. Но обработка ошибок «специальная». И единственное, что я пытаюсь сделать, - использовать шаблон jsp для страницы с ошибкой. но я не могу вернуть ModelAndView, потому что методы из HttpServlet недействительны. '@ ExceptionHandler' внутри' @ ControllerAdvice' может уловить внутренние 500 ошибок. Но как я могу поймать ошибки 404 и 403? Или есть даже «поймать все»? – christopher2007

+1

Не работает ваш 'ErrorHandler' в случае ошибок 404 или 403? На основе вашего web.xml он должен вызываться всякий раз, когда вызывается это исключение. Если вы хотите использовать файл jsp вместо «PrintWriter», вы можете его достичь: request.getRequestDispatcher («/ WEB-INF/examplePage.jsp»). Forward (request, response); 'в конце вашего 'doGet'. Вы также можете передать некоторые дополнительные атрибуты и отобразить их внутри jsp-файла по запросу, используя: 'request.setAttribute (« данные », данные);'. –

+0

Теперь я удалил все, что связано с обработкой ошибок из 'web.xml'. Я добавил ' throwExceptionIfNoHandlerFound' -> 'true' диспетчеру и имеет' @ ExceptionHandler' метод весны. Теперь выхватываются внутренние 500 ошибок, а также 404. '' НО '' в голове нет правильного кода состояния. Это всегда 200. Я должен установить его вручную? Если да, то как? Или мне не хватает конфигурации? – christopher2007

Смежные вопросы