Correcting errors in the file servlets.md
This commit is contained in:
parent
76fef83d31
commit
ae77b44fbe
30
servlets.md
30
servlets.md
|
@ -115,7 +115,7 @@ __Сервлет__ является интерфейсом, реализация
|
|||
|
||||
## В чем заключаются преимущества технологии сервлетов над CGI (Common Gateway Interface)?
|
||||
+ Сервлеты предоставляют лучшую производительность обработки запросов и более эффективное использование памяти за счет использования преимущество многопоточности (на каждый запрос создается новая нить, что быстрее выделения памяти под новый объект для каждого запроса, как это происходит в CGI).
|
||||
+ Сервлеты, как платформа и система являются независимыми. Таким образом веб-приложение написанное с использованием сервлетов может быть запущена в любом контейнере сервлетов, реализующим этот стандарт и в любой операционной системе.
|
||||
+ Сервлеты, как платформа и система являются независимыми. Таким образом веб-приложение, написанное с использованием сервлетов может быть запущена в любом контейнере сервлетов, реализующим этот стандарт и в любой операционной системе.
|
||||
+ Использование сервлетов повышает надежность программы, т.к. контейнер сервлетов самостоятельно заботится о жизненном цикле сервлетов (а значит и за утечками памяти), безопасности и сборщике мусора.
|
||||
+ Сервлеты относительно легки в изучении и поддержке, таким образом разработчику необходимо заботиться только о бизнес-логике приложения, а не внутренней реализации веб-технологий.
|
||||
|
||||
|
@ -187,7 +187,7 @@ __Контейнер сервлетов__ — программа, предста
|
|||
+ Доступность _Single-Sign-On_ (возможности разделения пользовательской сессии между приложениями) посредством _Security Assertion Markup Language (SAML) 1/2_ или _Simple and Protected Negotiate (SPNEGO)_ и _Kerberos_: один из серверов выступает в роли базы для хранения пользователей, все другие сервера при аутентификации пользователя обращаются к этой базе.
|
||||
+ Возможность авторизации посредством протокола _eXtensible Access Control Markup Language (XACML)_, позволяющего описывать довольно сложные политики (например, приложение доступно пользователю только в рабочее время).
|
||||
+ Кластеризация всего вышеперечисленного
|
||||
+ __Масштабируемость и высокая доступность__ Для контейнера сервлетов обычно так же возможно настроить кластеризацию, но она будет довольно примитивной, так как в случае его использования имееются следующие ограничения:
|
||||
+ __Масштабируемость и высокая доступность__ Для контейнера сервлетов обычно так же возможно настроить кластеризацию, но она будет довольно примитивной, так как в случае его использования имеются следующие ограничения:
|
||||
+ Сложность передачи пользовательской сессии из одного _центра обработки данных (ЦоД)_ в другой через Интернет
|
||||
+ Отсутствие возможности эффективно настроить репликации сессий на большом (состоящем из 40-50 экземпляров серверов) кластере
|
||||
+ Невозможность обеспечения миграции экземпляров приложения на другой сервер
|
||||
|
@ -213,7 +213,7 @@ __Контейнер сервлетов__ — программа, предста
|
|||
+ Обработка запросов — после инициализации сервлет готов к обработке запросов. Для каждого запроса клиента сервлет контейнер порождает новый поток и вызывает метод `service()` путем передачи ссылки на объекты ответа и запроса.
|
||||
+ Удаление - когда контейнер останавливается или останавливается приложение, то контейнер сервлетов уничтожает классы сервлетов путем вызова `destroy()` метода.
|
||||
|
||||
Таким образом, сервлет создаётся при первом обращении к нему и живёт на протяжении всего времени работы приложения (в отличии от объектов классов, которые уничтожаются сборщиком мусора после того как они уже не используются) и весь жизненный цикл сервлета можно описать как последовательность вызова методов:
|
||||
Таким образом, сервлет создаётся при первом обращении к нему и живёт на протяжении всего времени работы приложения (в отличии от объектов классов, которые уничтожаются сборщиком мусора после того, как они уже не используются) и весь жизненный цикл сервлета можно описать как последовательность вызова методов:
|
||||
|
||||
+ `public void init(ServletConfig config)` – используется контейнером для инициализации сервлета. Вызывается один раз за время жизни сервлета.
|
||||
+ `public void service(ServletRequest request, ServletResponse response)` – вызывается для каждого запроса. Метод не может быть вызван раньше выполнения `init()` метода.
|
||||
|
@ -311,7 +311,7 @@ __Контейнер сервлетов__ — программа, предста
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Какие наиболее распространенные задачи выполняются в контейнере сервлетов?
|
||||
+ Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а так же разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес логике приложения.
|
||||
+ Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а также разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес логике приложения.
|
||||
+ Управление жизненным циклом сервлетов и ресурсов. Начиная от загрузки сервлета в память, инициализации, внедрения методов и заканчивая уничтожением сервлета. Контейнер так же предоставляет дополнительные утилиты, например JNDI, для управления пулом ресурсов.
|
||||
+ Поддержка многопоточности. Контейнер самостоятельно создает новую нить для каждого запроса и предоставляет ей запрос и ответ для обработки. Таким образом сервлет не инициализируется заново для каждого запроса и тем самым сохраняет память и уменьшает время до обработки запроса.
|
||||
+ Поддержка JSP. JSP классы не похожи на стандартные классы джавы, но контейнер сервлетов преобразует каждую JSP в сервлет и далее управляется контейнером как обычным сервлетом.
|
||||
|
@ -390,15 +390,15 @@ __Listener (слушатель)__ работает как триггер, вып
|
|||
|
||||
+ _Request_:
|
||||
+ `ServletRequestListener` используется для того, чтобы поймать момент создания и уничтожения запроса;
|
||||
+ `ServletRequestAttributeListener` используется для прослушивании событий происходящих с атрибутами запроса.
|
||||
+ `ServletRequestAttributeListener` используется для прослушивания событий, происходящих с атрибутами запроса.
|
||||
+ _Context_:
|
||||
+ `ServletContextListener` позволяет поймать момент, когда контекст инициализируется либо уничтожается;
|
||||
+ `ServletContextAttributeListener` используется для прослушивании событий происходящих с атрибутами в контексте.
|
||||
+ `ServletContextAttributeListener` используется для прослушивании событий, происходящих с атрибутами в контексте.
|
||||
+ _Session_:
|
||||
+ `HttpSessionListener` позволяет поймать момент создания и уничтожения сессии;
|
||||
+ `HttpSessionAttributeListener` используется при прослушивании событий происходящих с атрибутами в сессии;
|
||||
+ `HttpSessionActivationListener` используется в случае, если происходит миграция сессии между различными JVM в распределённых приложениях;
|
||||
+ `HttpSessionBindingListener` так же используется для прослушивания событий происходящих с атрибутами в сессии. Разница между `HttpSessionAttributeListener` и `HttpSessionBindingListener` слушателями: первый декларируется в `web.xml`; экземпляр класса создается контейнером автоматически в единственном числе и применяется ко всем сессиям; второй: экземпляр класса должен быть создан и закреплён за определённой сессией «вручную», количество экземпляров также регулируется самостоятельно.
|
||||
+ `HttpSessionBindingListener` так же используется для прослушивания событий, происходящих с атрибутами в сессии. Разница между `HttpSessionAttributeListener` и `HttpSessionBindingListener` слушателями: первый декларируется в `web.xml`; экземпляр класса создается контейнером автоматически в единственном числе и применяется ко всем сессиям; второй: экземпляр класса должен быть создан и закреплён за определённой сессией «вручную», количество экземпляров также регулируется самостоятельно.
|
||||
|
||||
Подключение слушателей:
|
||||
|
||||
|
@ -414,7 +414,7 @@ __Listener (слушатель)__ работает как триггер, вып
|
|||
|
||||
`HttpSessionBindingListener` подключается в качестве атрибута непосредственно в сессию, т.е., чтобы его подключить необходимо:
|
||||
|
||||
+ создать экземпляр класса реализующего этот интерфейс;
|
||||
+ создать экземпляр класса, реализующего этот интерфейс;
|
||||
+ положить созданный экземпляр в сессию при помощи `setAttribute(String, Object)`.
|
||||
|
||||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
@ -442,7 +442,7 @@ __Listener (слушатель)__ работает как триггер, вып
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Как обработать в приложении исключения, выброшенные другим сервлетом?
|
||||
Когда приложение выбрасывет исключение контейнер сервлетов обрабатывает его и создаёт ответ в формате HTML. Это аналогично тому что происходит при кодах ошибок вроде 404, 403 и т.д.
|
||||
Когда приложение выбрасывет исключение контейнер сервлетов обрабатывает его и создаёт ответ в формате HTML. Это аналогично тому, что происходит при кодах ошибок вроде 404, 403 и т.д.
|
||||
|
||||
В дополнении к этому существует возможность написания собственных сервлетов для обработки исключений и ошибок с указанием их в дескрипторе развертывания:
|
||||
|
||||
|
@ -530,7 +530,7 @@ public class ExampleServlet extends HttpServlet {
|
|||
+ `ServletOutputStream getOutputStream()`/`PrintWriter getWriter()` - возвращают потоки вывода данных;
|
||||
+ `void setContentLength(int len)` - устанавливает значение поля HTTP заголовка _Content-Length_;
|
||||
+ `void setContentType(String type)` - устанавливает значение поля HTTP заголовка _Content-Type_.
|
||||
+ `void reset()` - позволяет сбрасить HTTP заголовок к значениям по-умолчанию, если он ещё не был отправлен
|
||||
+ `void reset()` - позволяет сбросить HTTP заголовок к значениям по-умолчанию, если он ещё не был отправлен
|
||||
+ и др.
|
||||
|
||||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
@ -541,7 +541,7 @@ public class ExampleServlet extends HttpServlet {
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Что такое `Request Dispatcher`?
|
||||
Интерфейс `RequestDispatcher` используется для передачи запроса другому ресурсу, при этом существует возможность добавления данных полученных из этого ресурса к собственному ответу сервлета. Так же этот интерфейс используется для внутренней коммуникации между сервлетами в одном контексте.
|
||||
Интерфейс `RequestDispatcher` используется для передачи запроса другому ресурсу, при этом существует возможность добавления данных, полученных из этого ресурса к собственному ответу сервлета. Так же этот интерфейс используется для внутренней коммуникации между сервлетами в одном контексте.
|
||||
|
||||
В интерфейсе объявлено два метода:
|
||||
|
||||
|
@ -617,7 +617,7 @@ IP адрес клиента можно получить вызвав `request.g
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Какие классы-обертки для сервлетов вы знаете?
|
||||
Собственные обработчики `ServletRequest` и `ServletResponse` можно реализовать добавив новые или переопределив существующие методы у классов-обёрток `ServletRequestWrapper` (`HttpServletRequestWrapper`) и `ServletResponseWrapper` (`HttpServletRequestWrapper`).
|
||||
Собственные обработчики `ServletRequest` и `ServletResponse` можно реализовать, добавив новые или переопределив существующие методы у классов-обёрток `ServletRequestWrapper` (`HttpServletRequestWrapper`) и `ServletResponseWrapper` (`HttpServletRequestWrapper`).
|
||||
|
||||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
|
@ -703,7 +703,7 @@ __URL Encoding__ — процесс преобразования данных в
|
|||
+ __HTML Hidden Field__ – Присвоение уникального значения скрытому полю HTML страницы, в момент когда пользователь начинает сеанс. Этот метод не может быть использован со ссылками, потому что нуждается в подтверждении формы со скрытым полем каждый раз во время формирования запроса. Кроме того, это не безопасно, т.к. существует возможность простой подмены такого идентификатора.
|
||||
+ __URL Rewriting__ – Добавление идентификатора сеанса как параметра URL. Достаточно утомительная операция, потому что требует постоянного отслеживания этого идентификатора при каждом запросе или ответе.
|
||||
+ __Cookies__ – Использование небольших фрагментов данных, отправленных web-сервером и хранимых на устройстве пользователя. Данный метод не будет работать, если клиент отключает использование cookies.
|
||||
+ __Session Management API__ – Использование специального API для отслеживания сеанса, построенный на основе и на методах описанных выше и который решает частные проблемы перечисленных способов:
|
||||
+ __Session Management API__ – Использование специального API для отслеживания сеанса, построенный на основе и на методах, описанных выше и который решает частные проблемы перечисленных способов:
|
||||
+ Чаще всего недостаточно просто отслеживать сессию, необходимо ещё и сохранять какие-либо дополнительные данные о ней, которые могут потребоваться при обработке последующих запросов. Осуществление такого поведения требует много дополнительных усилий.
|
||||
+ Все вышеперечисленные методы не являются универсальными: для каждого из них можно подобрать конкретный сценарий, при котором они не будут работать.
|
||||
|
||||
|
@ -919,7 +919,7 @@ _«JSP - сервлет - JSP»_ архитектура построения п
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Какие области видимости переменных существуют в JSP?
|
||||
Область видимости объектов определяется тем контекстом в который помещается данный объект. В зависимости от той или иной области действия так же определяется время существования объекта.
|
||||
Область видимости объектов определяется тем контекстом, в который помещается данный объект. В зависимости от той или иной области действия так же определяется время существования объекта.
|
||||
|
||||
В JSP предусмотрены следующие области действия переменных (объектов):
|
||||
|
||||
|
@ -1042,7 +1042,7 @@ __JSP implicit objects (неявные объекты)__ создаются ко
|
|||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
## Почему не рекомендуется использовать скриплеты (скриптовые элементы) в JSP?
|
||||
JSP страницы используются в основном для целей отображения представления (_view_), а вся бизнес-логика (_controller_) и модель (_model_) должны быть реализованы в сервлетах или классах-моделях. Обязанность JSP страницы - создание HTML ответа из переданных через атрибуты параметров. Большая часть JSP содержит HTML код а для того, чтобы помочь верстальщикам понять JSP код страницы предоставляется функционал элементов _action_, _JSP EL_, _JSP Standart Tag Library_. Именно их и необходимо использовать вместо скриптлетов для создания моста между (JSP)HTML и (JSP)Java частями.
|
||||
JSP страницы используются в основном для целей отображения представления (_view_), а вся бизнес-логика (_controller_) и модель (_model_) должны быть реализованы в сервлетах или классах-моделях. Обязанность JSP страницы - создание HTML ответа из переданных через атрибуты параметров. Большая часть JSP содержит HTML код, а для того, чтобы помочь верстальщикам понять JSP код страницы предоставляется функционал элементов _action_, _JSP EL_, _JSP Standart Tag Library_. Именно их и необходимо использовать вместо скриптлетов для создания моста между (JSP)HTML и (JSP)Java частями.
|
||||
|
||||
[к оглавлению](#servlets-jsp-jstl)
|
||||
|
||||
|
|
Loading…
Reference in New Issue