Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / В чем принципиально важное значение service() метода сервлета помимо известного? / 9 сообщений из 9, страница 1 из 1
24.10.2006, 21:10:31
    #34078487
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
Добрый день!
известно, что:
1. service вызывается контейнером при каждом запросе веб-серверу, ему передается request/response
2. service вызывает метод, соответсвующий типу запроса(doGet, doPost и т.д.)

Остается непонятным:
1. Как определяется тип запроса? По каким-нибудь свойствам, инкапсулированным в объекте request-а?
2. Перед тем как перенаправить на соответсвующий doGet, doPost и т.д. - метод что-нибудь делает(иницирует)? Всмысле может инициализация чего-нибудь связанного с контекстом данного веб-приложения или в этом роде?
3. Какие последствия могут возникнуть, если всю логику обработки запроса писать в переопределенном service?
...
Рейтинг: 0 / 0
24.10.2006, 22:25:02
    #34078548
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
ddockerКак определяется тип запроса? По каким-нибудь свойствам, инкапсулированным в объекте request-а?

- с помощью условного перехода и метода getMethod() интерфейса HttpServletRequest

ddockerПеред тем как перенаправить на соответсвующий doGet, doPost и т.д. - метод что-нибудь делает(иницирует)? Всмысле может инициализация чего-нибудь связанного с контекстом данного веб-приложения или в этом роде?

- насколько помню, ничего такого он не делает

ddocker
Какие последствия могут возникнуть, если всю логику обработки запроса писать в переопределенном service?
- перестанут автоматически вызываться методы doGet, doPost и т. д. :)
...
Рейтинг: 0 / 0
24.10.2006, 23:48:19
    #34078618
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
ясно.
в таком случае, совсем необязательно в переопределенном service() вызывать super.service() [если у нас конечно нет переопределенных doPost/doGet...], как в случае с методом init()
...
Рейтинг: 0 / 0
25.10.2006, 00:36:27
    #34078656
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
Нашел таки еще одну важную функцию service()!
Вернее на другом форуме статейку подкинули (http://www.informit.com/articles/article.asp?p=29817&seqNum=3&rl=1):
...Second, you can add support for modification dates by adding a getLastModified method. Since getLastModified is invoked by the default service method, overriding service eliminates this option. Finally, you get automatic support for HEAD, OPTION, and TRACE requests....

Т.е. если мы не вызываем super.service() в нашем переопределенном service() - то не сможем указать нужный LastModified в заголовке ответа!
...
Рейтинг: 0 / 0
25.10.2006, 01:01:47
    #34078673
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
ddockerТ.е. если мы не вызываем super.service() в нашем переопределенном service() - то не сможем указать нужный LastModified в заголовке ответа!
- Вы ошибаетесь, переопределение service никак не влияет на отправку заголовков HTTP. Любые заголовки можно гарантировано отправлять до вызова метода getWriter() или getOutputStream(), в том числе и Last-Modified. При использовании буферизации это можно сделать и после вызова соответветствующих методов, но в данном случае это не актуально.
...
Рейтинг: 0 / 0
25.10.2006, 01:15:35
    #34078677
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
Kachalov- Вы ошибаетесь, переопределение service никак не влияет на отправку заголовков HTTP.
Как же так..?
Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public   class  go1  extends  HttpServlet {
    @Override
     protected   long  getLastModified(HttpServletRequest req) {
         return  System.currentTimeMillis() -  1000  *  10 ;
    }

    @Override
     protected   void  doGet(HttpServletRequest req, HttpServletResponse resp)
             throws  ServletException, IOException {

    }

    @Override
     protected   void  service(HttpServletRequest req, HttpServletResponse resp)
             throws  ServletException, IOException {
         super .service(req, resp);
    }
}
Запускаем, смотрим - lastmodified посылается. Теперь комментируем super.init(), деплой-запуск - не посылается. (tomcat 5.5.17)
При этом если getLastModified - вообще не переопределен, то он в любом случае не посылается (ну если его вручную через response не устанавливать, о чем ниже)

Kachalov
Любые заголовки можно гарантировано отправлять до вызова метода getWriter() или getOutputStream(), в том числе и Last-Modified. При использовании буферизации это можно сделать и после вызова соответветствующих методов, но в данном случае это не актуально.

Да, конечно, как это я про HttpResponse.setHeader забыл...

Видимо этот описанный механизм c вызовом getLastModified относится к что-то вроде механизму по-умалчанию....
...
Рейтинг: 0 / 0
25.10.2006, 01:22:20
    #34078680
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
ddockertomcat 5.5.17
- а в других контейнерах? Спецификация ничего не говорит об автоматической отправке Last-Modified, так что респект разработчикам Tomcat :)
...
Рейтинг: 0 / 0
25.10.2006, 12:44:55
    #34079807
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
Kachalov ddockertomcat 5.5.17
- а в других контейнерах? Спецификация ничего не говорит об автоматической отправке Last-Modified, так что респект разработчикам Tomcat :)
А разве Tomcat не является эталоном реализации WEB-технологий от Sun (Servlet)? Есть же такое понятие, что все что идет на Tomcat идет и на других веб-серверах. Или это только в теории?
...
Рейтинг: 0 / 0
25.10.2006, 21:14:06
    #34081769
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем принципиально важное значение service() метода сервлета помимо известного?
LeonidvА разве Tomcat не является эталоном реализации WEB-технологий от Sun (Servlet)? Есть же такое понятие, что все что идет на Tomcat идет и на других веб-серверах. Или это только в теории?
- Tomcat создается группой независимых разработчиков не имеющих никакого отношения к компании Sun и содержит ряд механизмов и библиотек не описаных в спецификации сервлетов и JSP. Собственно компания Sun разрабатывает спецификацию в виде Servlet/JSP API (в основном в виде интерфейсов), а реализация этой спецификации ложится на плечи разработчиков контейнера сервлетов. Так же Sun специфицирует структуру папок web-приложения и синтаксис конфигурационного файла web.xml.

- в отношении сервлетов, как правило, действительно "все что идет на Tomcat идет и на других веб-серверах", хотя и здесь есть подводные камни: вот всплыл вопрос заголовков HTTP, есть еще вопрос размера буфера вывода по умолчанию, есть вопрос авторизации с помощью форм (такой способ предусмотрен в спецификации сервлетов), авторизация SSL - все это зависит от контейнера. В EJB такого рода проблем еще больше.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / В чем принципиально важное значение service() метода сервлета помимо известного? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]