Перенаправление Java запросов.

Август 12, 2011

Качественные автошины в киеве. Ассортимент просто поражает, цены супер, особенно сейчас. Самое время брать зимнюю резину, чтобы осенью не брать на 20% дороже. Рекомендую!
_________________________

При разработке сложных веб-приложений содержащих несколько веб-компонентов, участвующих в обработке запросов, часто возникает необходимость организовать взаимодействие между ними в рамках процедуры обработки одного запроса. Делается это путем перенаправления запроса, поступившего к одному из веб-компонентов на обработку другому веб-компоненту; Например, запрос на получение списка продукции от производителя, не прошедшего аутентификацию, может быть перенаправлен на страницу ввода имени пользователя и пароля. Перенаправление может выполняться двумя разными способами. Первый основан на механизме, который является частью протокола HTTP. Его суть в том, что клиенту генерируется спец. Перенаправляющий ответ, который не содержит запрошенных данных, а содержит только URL по которому клиенту на самом деле нужно обратиться для их получения. В ответ на этот перенаправленный ответ веб-клиент (браузер) генерирует новый запрос, по полученному URL. Генерация перенаправляемого ответа выполняется методом sendRedirect ин-са javax.Servlet.http.HttpServletResponse.

В качестве параметра ему указывается URL того веб-компонента на который мы перенаправляем клиента (этот URL м.б. указан как относительный).

Специфика данного способа в том, что после генерации перенаправляющего ответа обработка исходного запроса считается законченной и инф-ция о нем теряется.

При использовании метода SendRedirect сущ. ограничения

1. вызавать его можно только тогда, когда ответ в состоянии notCommitted, если ответ сommitted, то вызов приводит к выбросу исключения java.long.IllegalStateException

2. если в момент вызова метода буфер вывода был непустой, он очищается

3. после вызова этого метода запрос считается обработанным, а весь вывод, генерируемый далее, игнорируется

4. после вызова ответ переходит в состояние сommitted.

Второй способ перенаправления заключается в использовании объекта типа javax.Servlet.RequestDispatcher, кот можно получить методом getRequestDispatcher (по относительному URL целевого компонента) или методом getNamedDispatcher (по имени целевого компонента) ин-са javax.servlet.ServletContext

Собственно перенаправление м.б. сделано одним из двух методов ин-са RequestDispatcher

м-дом forward и м-дом include. В обоих случаях в качестве параметров передаются запрос и ответ (ServletRequest, ServletResponse). Метод forward передает запрос на обработку другому компоненту и именно он должен сгенерировать ответ. Ограничения, относящиеся к м. forward аналогичны тем, что имеют место для мет sendRedirect ин-са ServletResponse

М. include позволяет включить ответ, генерируемый другим компонентом в состав ответа, генерируемого данным компонентом. Это использ. для блочного конструирования ответов на этапе выполнения. Ограничение для include запрещает другому компоненту, ответ кот включается в состав ответа данного компонента изменить заголовки ответа. М include м.б. вызван в любой момент обработки запроса вне зависимости от состояния ответа (сommitted/notCommitted).

В ин-се ServletResponse сущ. метод sendError, кот позволяет легко послать в кач-ве ответа клиенту стандартное сообщ-е об ошибке, оформленное специфичным для данной реализации сервера приложений образом с указанием кода ошибки (статуса http-ответа) и сообщ-я об ошибке.

Ограничения для метода sendError такие же, как и для мет sendRedirect