Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec-ServletLifeCycle-part2-v001

.pdf
Скачиваний:
22
Добавлен:
18.03.2015
Размер:
1.4 Mб
Скачать

3.5. HTTP-ОТВЕТЫ (ПРОДОЛЖЕНИЕ)

Объект, содержащий информацию ответа, также основан на интерфейсе ServletResponse:

Interface javax.servlet.http.HttpServletResponse { void addHeader( String name, String value ) void addIntHeader( String name, int value ) void addDateHeader( String name, long date ) boolean containsHeader( String name )

void setHeader( String name, String value ) void setIntHeader( String name, int value )

void setDateHeader( String name, long millisecs )

}

3.6. ТИПИЧНЫЕ ЗАГОЛОВКИ ОТВЕТА И ИХ ИСПОЛЬЗОВАНИЕ

Date - Задает текущее время сервера.

Expires - Задает время, когда контент может рассматриваться как неполный. Last-Modified - Время, когда документ был в последний раз модифицирован. Refresh - Указывает браузеру, что надо перезагрузить страницу.

Абстрактный субкласс HttpServlet добавляет дополнительные методы к базовому интерфейсу Servlet, которые автоматически вызываются методом service() в классе HttpServlet с целью обработки HTTP-запросов:

doGet

- для обработки HTTP GET

запросов

doPost

- для обработки HTTP POST

запросов

doPut

- для обработки HTTP PUT

запросов

doDelete - для обработки HTTP DELETE запросов doHead - для обработки HTTP HEAD запросов doOptions - для обработки HTTP OPTIONS запросов doTrace - для обработки HTTP TRACE запросов

Обычно именно методы doGet() и doPost() переопределяются сервлетами, порожденными от HttpServlet для создания ответа пользователю.

3.7. DOGET-ОТВЕТ (ПРОДОЛЖЕНИЕ)

(!) Важно: НЕЛЬЗЯ использовать метод GET для изменения состояния сервера, например, для записи данных в базу. Т.е. метод GET должен быть безопасным. Для изменения состояния данных можно использовать метод POST. Метод GET также должен быть идемпотентным, то есть способным выполняться многократно.

Interface javax.servlet.http. HttpServlet { protected void doGet(HttpServletRequest req,

HttpServletResponse resp) throws ServletException, IOException;

}

вызывается контейнером через метод service(), позволяя сервлету обрабатывать GET запрос. Переопределение этого метода для поддержки GET запроса автоматически поддерживает HTTP HEAD запрос. Запрос HEAD является GET запросом, который возвращает в ответе NO BODY, и только поля заголовка.

4. ОТПРАВКА КОДА ЗАВЕРШЕНИЯ

Код статуса отправляется клиенту для индикации ошибок.

Например, "Resource not found” или "Unauthorized access".

(!) Все стандартные коды определены как константы в интерфейсе HttpServletResponse. Для установки кода завершения есть методы:

Interface javax.servlet.http.HttpServletResponse {

sendError( int status_code )

sendError( int status_code, String message ) void setStatus( int status_code )

}

Например, если у клиента нет доступа к запрашиваемому ресурсу, сервлет может вызвать:

response.sendError( HttpServletResponse.SC_UNAUTHORIZED );

4.1. ОТПРАВКА КОДА ЗАВЕРШЕНИЯ

Когда браузер клиента примет от сервлета ответ с установленным кодом завершения (кодом статуса), он покажет пользователю соответствующее сообщение. Два первых метода sendError

выбрасывают исключение java.lang.IllegalStateException, если ответ уже зафиксирован. Соответственно засылка статуса фиксирует ответ.

Метод setStatus() не инициирует засылку страницы с ошибкой, в этой связи рекомендуется использовать этот метод для засылки кодов без ошибки, например SC_OK.

5. ПЕРЕНАПРАВЛЕНИЕ ЗАПРОСА

Вызов метода response.sendRedirect(…) немедленно возвращает браузеру требование перенаправить запрос по другому адресу. Однако вызов вышеуказанного метода после засылки заголовка браузеру вызовет порождение исключения java.lang.IllegalStateException.

Например, как в следующем примере:

public void doGet( HttpServletRequest req,

HttpServletResponse res )

throws ServletException, IOException { PrintWriter pw = res.getPrintWriter(); pw.println("<html><body>Hello World!</body></html>");

//Вызов flush() засылает заголовок и сгенерированный к

//этому моменту текст клиенту

pw.flush();

res.sendRedirect("http://www.another.com"); // так что здесь выбрасывается исключение IllegalStateException

}

6. СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ СЕРВЛЕТА

Контейнер сервлетов создает экземпляр некоторого класса сервлета,

используя вызов метода Class.forName(className).newInstance()

(!) Таким образом, сервлет обязан иметь явный public конструктор без аргументов или не иметь ни одного (чтобы java создал по-умолчанию).

Интерфейс ServletConfig реализован классом GenericServlet, что дает возможность из HTTP сервлета получить доступ к параметрам инициализации сервлета:

Interface javax.servlet.ServletConfig { java.lang.String getServletName()

ServletContext getServletContext() java.lang.String getInitParameter( String name ) java.util.Enumeration getInitParameterNames()

}

Метод getServletName() возвращает название сервлета, которое определено в субэлемента <servlet-name>, элемента <servlet> дескриптора развертывания.

6.2. СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ СЕРВЛЕТА (ПРОДОЛЖЕНИЕ)

При создании сервлета рекомендуется переопределять НЕ метод init( ServletConfig config ), а метод init(), в котором значения параметров получают вызовом.

Например, так:

String email=getInitParameter(―webMasterAdress‖)

Значения параметров объекта ServletConfig не могут быть изменены, а также в этот объект нельзя добавлять новые параметры. Описание инициализационных параметров сервлета и задание их значений производится в дескрипторе развертывания (файл web.xml), в элементе

<init-param> тега <servlet>.

Обязательный элемент <servlet-name> должен быть уникален в рамках приложения.

Одним элементом <init-param> нельзя описать массив или коллекцию.

6.3. СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ СЕРВЛЕТА (ПРОДОЛЖЕНИЕ)

Пример дескриптора приложения для сервлета названного «controller»:

<web-app>

...

<servlet> <servlet-name>controller</servlet-name>

<servlet-class>control.BController</servlet-class> <load-on-startup>1</load-on-startup>

<init-param>

<param-name>encoding</param-name> <param-value>Cp1251</param-value>

</init-param>

<init-param> <param-name>webMasterAdress</param-name> <param-value>myaddress@mail.ru</param-value>

</init-param>

</servlet>

...

</web-app>

6.4. СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ СЕРВЛЕТА (ПРОДОЛЖЕНИЕ)

Пример переопределения метода init() для получения значений параметров:

class MyServlet extends GenericServlet { private String enc;

private String webMastAdr;

@Override

public void init() throws ServletException { java.util.Enumeration en = getInitParameterNames(); while( en.hasMoreElements() )

System.out.println( en.nextElement() ); enc = getInitParameter("encoding");

webMastAdr = getInitParameter("webMasterAdress ");

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]