Проект

Общее

Профиль

JSP SERVLETS JSTL » История » Версия 2

Александр Александров, 21.04.2019 17:51

1 1 Александр Александров
h1. JSP SERVLETS JSTL
2
3
h2. Вопросы
4
5
# Что такое сервлет?
6
# Какова структура веб-проекта?
7
# Что такое контейнер сервлетов? Жизненный цикл сервлета.
8
# Каковы задачи, функциональность контейнера сервлетов?
9
# Чем отличается sendRedirect() от forward()?
10
# Что вы знаете о сервлет фильтрах?
11
# Зачем нужны слушатели в сервлетах?
12
# Как обработать исключения, выброшенные другим сервлетом в приложении?
13
# Что такое дескриптор развертывания?
14
# Как реализовать запуск сервлета с запуском приложения?
15
# Что представляет собой объект ServletConfig?
16
# Что представляет собой объект ServletContext?
17
# В чем отличия ServletContext и ServletConfig?
18
# Интерфейс ServletResponse.
19
# Интерфейс ServletRequest.
20
# Что такое Request Dispatcher?
21
# Как можно создать блокировку (deadlock) в сервлете?
22
# Как получить адрес сервлета на сервере?
23
# Как получить информацию о сервере из сервлета?
24
# Как получить ip адрес клиента на сервере?
25
# Что вы знаете о классах обертках (wrapper) для сервлетов?
26
# Каков жизненный цикл сервлета и когда какие методы вызываются?
27
# Какие методы необходимо определить при создании сервлетов?
28
# В каком случае вы будете переопределять метод service()?
29
# Есть ли смысл определить конструктор для сервлета, как лучше инициализировать данные?
30
# В чем отличия GenericServlet и HttpServlet?
31
# Как вызвать из сервлета другой сервлет этого же и другого приложения?
32
# Стоит ли волноваться о “многопоточной безопасности” работая с сервлетами?
33
# Какой метод HTTP не является неизменяемым?
34
# Какие есть методы отправки данных с клиента на сервер? Чем они отличаются?
35
# Методы сервлета (обычно имеется ввиду HttpServlet).
36
# Почему HttpServlet класс объявлен как абстрактный?
37
# В чем разница между методами GET и POST?
38
# Назовите преимущества Servlet над CGI?
39
# Каковы наиболее распространенные задачи выполняются в Servlet контейнере?
40
# В чем разница между PrintWriter и ServletOutputStream?
41
# Можем ли мы получить PrintWriter и ServletOutputStream одновременно в сервлете?
42
# Расскажите об интерфейсе SingleThreadModel.
43
# Какие существуют атрибуты у сервлетов и какая сфера их применения?
44
# Почему необходимо переопределить только init() метод без аргументов?
45
# Что означает URL encoding? Зачем нужны методы encode() и decode()?
46
# Зачем нужны и чем отличаются методы encodeUrl() и encodeRedirectUrl()?
47
# Какие различные методы управления сессией в сервлетах вы знаете?
48
# Что означает URL Rewriting?
49
# Что такое Cookie?
50
# Как применяются Cookies в сервлетах?
51
# Как уведомить объект в сессии, что сессия недействительна или закончилась?
52
# Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с валидной сессией?
53
# Как мы можем обеспечить transport layer security для нашего веб приложения?
54
# Как организовать подключение к базе данных и обеспечить логирование log4j в сервлете?
55
# Какие особенности Servlet 3?
56
# Каковы различные способы аутентификации сервлета?
57
# Что такое Java Server Pages (JSP)?
58
# Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
59
# Расскажите об этапах (фазах) жизненного цикла jsp.
60
# Расскажите о методах жизненного цикла jsp.
61
# Какие методы жизненного цикла JSP могут быть переопределены?
62
# Как можно предотвратить прямой доступ к JSP странице из браузера?
63
# Какая разница между динамическим и статическим содержимым JSP?
64
# Как закомментировать код в jsp?
65
# Какие основные теги в JSP?
66
# Какие типы EL операторов вы знаете?
67
# Взаимодействие JSP - сервлет - JSP.
68
# Что такое сессия?
69
# Какие скоупы переменных существуют в JSP?
70
# Какие неявные, внутренние объекты и методы есть на jsp странице?
71
# Почему неявные объекты не доступны в обычной JSP странице?
72
# Что вы знаете о PageContext и какие преимущества его использования?
73
# Как сконфигурировать init параметры для JSP?
74
# Почему не рекомендуется использовать скриптовые элементы в jsp?
75
# Чем отличается <c:import> от <jsp:include> и директиви <%@include %>?
76
# Что вы знаете о jsp тегах? Объясните как вы понимаете Action tag и JSP Action Elements.
77
# Что такое JSTL (Jsp Standard tag library)?
78
# Из каких групп тегов состоит библиотека JSTL?
79
# Какая разница между тегом <c:set> и <jsp:useBean>?
80
# Назовите неявные, внутренние объекты JSP EL и их отличия от объектов jsp.
81
# Как узнать имя http метода используя JSP EL?
82
# Что вы знаете о написании пользовательских jsp тегов?
83
# Приведите пример использования собственных тегов.
84
# Почему не нужно конфигурировать стандартные JSP теги в web.xml?
85
# Как можно обработать ошибки jsp страниц?
86
# Как происходит обработка ошибок с помощью jstl?
87
# Приведите пример конфигурации JSP в дескрипторе развертывания.
88
# Как деактивировать использование EL на JSP?
89
# Можно ли использовать javascript на jsp странице?
90
# Всегда ли создается объект сессии на jsp странице, можно ли отключить его создание?
91
# Какая разница между JspWriter и Servlet PrintWriter?
92
# Как можно расширить функциональность jsp?
93
94
h2. Ответы
95
96
h3. Что такое сервлет?
97
98 2 Александр Александров
*Сервлеты (Servlets)* - это java-программы, которые выполняются насерверной стороне Web-приложения. Точно так же, как апплеты динамически расширяют функциональные возможности Web-браузера, 
99
 сервлеты динамически расширяют функциональные возможности Webсервера. Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные сервлет классы. Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и классы для создания сервлетов.
100
101
{{dmsf_image(237)}}
102
103 1 Александр Александров
h3. Какова структура веб-проекта?
104
105 2 Александр Александров
{{dmsf_image(238)}}
106
107
Источник maven.apache.org
108
109 1 Александр Александров
h3. Что такое контейнер сервлетов? Жизненный цикл сервлета.
110
111 2 Александр Александров
Контейнер сервлетов - программа, управляющая жизненным циклом сервлетов.
112
113
Жизненный цикл сервлета: им управляет контейнер сервлетов, при первом обращении к сервлету происходит его загрузка в память и вызывается метод init(). На протяжении работы приложения происходят вызовы методы service() для обработки запросов клиента. По завершению работы приложения вызывается метод destroy() и сервлет выгружается из памяти.
114
115 1 Александр Александров
h3. Каковы задачи, функциональность контейнера сервлетов?
116
117 2 Александр Александров
Контейнер сервлетов может работать как полноценный самостоятельный веб-сервер, быть поставщиком страниц для другого веб-сервера, например Apache, или интегрироваться в Java EE сервер приложений. Обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
118
119 1 Александр Александров
h3. Чем отличается sendRedirect() от forward()?
120
121 2 Александр Александров
Для вызова JSP по относительному пути применяется метод forward(), для обращения к JSP по абсолютному пути используется метод sendRedirect(). Отличие этих методов состоит в том, что с методом forward() передается уже существующий объект запроса request, а при вызове метода sendRedirect() формируется новый запрос. Информацию в последнем случае следует переда вать с другими объектами. К тому же метод forward() срабатывает быстрее.
122
123 1 Александр Александров
h3. Что вы знаете о сервлет фильтрах?
124
125 2 Александр Александров
Реализация интерфейса Filter позволяет создать объект, который перехватывает запрос, может трансформировать заголовок и содержимое запроса клиента. Фильтры не создают запрос или ответ, а только
126
модифицируют их. Фильтр выполняет предварительную обработку запроса, прежде чем тот попадает в сервлет, с последующей (если необходимо) обработкой ответа, исходящего из сервлета. Фильтр может взаимодействовать с разными типами ресурсов, в частности, и с сервлетами, и с JSP-страницами. Сервлетные фильтры могут:
127
128
* перехватывать инициацию сервлета прежде, чем сервлет будет инициирован.
129
* определить содержание запроса прежде, чем сервлет будет инициирован.
130
* модифицировать заголовки и данные запроса, в которые упаковывается поступающий запрос.
131
* модифицировать заголовки и данные ответа, в которые упаковывается получаемый ответ.
132
* перехватывать инициацию сервлета после обращения к сервлету.
133
134
Сервлетный фильтр может быть сконфигурирован так, что он будет работать с одним сервлетом или группой сервлетов. Основой для формирования фильтров служит интерфейс javax.servlet.Filter, который реализует три метода:
135
136
* void init (FilterConÙg conÙg) throws ServletException;
137
* void destroy();
138
* void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
139
140
Метод init() вызывается прежде, чем фильтр начинает работать, и настраивает конфигурационный объект фильтра. Метод doFilter выполняет непосредственно работу фильтра. Таким образом, сервер вызывает init() один раз, чтобы запустить фильтр в работу, а затем вызывает doFilter() столько раз, сколько запросов будет сделано непосредственно к данному фильтру. После того, как фильтр заканчивает свою работу, вызывается метод destroy().
141
142 1 Александр Александров
h3. Зачем нужны слушатели в сервлетах?
143
144 2 Александр Александров
Слушатели контекста и сессий - это классы, которые могут следить за тем, когда контекст или сессия были инициализированы, или отслеживать время, когда они должны быть уничтожены, и когда атрибуты были добавлены или удалены из контекста или сессии. Servlet 2.4 расширяет модель слушателей запроса, позволяя отслеживать, как запрос создается и уничтожается, и, как атрибуты добавляются и удаляются из сервлета. В Servlet 2.4 добавлены следующие классы:
145
146
* ServletRequestListener
147
* ServletRequestEvent
148
* ServletRequestAttributeListener
149
* ServletRequestAttributeEvent
150
151 1 Александр Александров
h3. Как обработать исключения, выброшенные другим сервлетом в приложении?
152
153 2 Александр Александров
Так как браузер понимает только HTML, то когда приложение выбросит исключение контейнер сервлетов обработает исключение и создаст HTML response. Это аналогично тому что происходит при кодах ошибок вроде 404, 403 и т.д. Servlet API предоставляет поддержку собственных сервлетов для обработки исключений и ошибок, которые мы можем задать в дескрипторе развертывания. Главная задача таких сервлетов - обработать ошибку или исключение и отправить понятный HTML ответ пользователю. Например, можно предоставить ссылку на главную страницу, а так же описание некоторых деталей об ошибке.
154
155
{{dmsf_image(239)}}
156
157 1 Александр Александров
h3. Что такое дескриптор развертывания?
158
159 2 Александр Александров
Дескриптор развертывания - это конфигурационный файл артефакта, который будет развернут в контейнере сервлетов. В спецификации Java Platform, Enterprise Edition дескриптор развертывания описывает то, как компонент, модуль или приложение (такое, как веб-приложение или приложение предприятия) должно быть развернуто. Этот конфигурационный файл указывает параметры развертывания для модуля или приложения с определенными настройками, параметры безопасности и описывает конкретные требования к конфигурации. Для синтаксиса файлов дескриптора развертывания используется язык XML.
160
161 1 Александр Александров
h3. Как реализовать запуск сервлета с запуском приложения?
162
163 2 Александр Александров
Контейнер сервлетов обычно загружает сервлет при первом запросе клиента, но иногда необходимо загрузить сервлет прямо на старте приложения (например если сервлет объемный и будет долго грузиться). Для этого необходимо использовать элемент load-on-startup в дескрипторе (или аннотацию loadOnStartup), который укажет необходимость загрузки сервлете при запуске.
164
165
{{dmsf_image(240)}}
166
167
Значение должно быть int. Если значение отрицательное, то сервлет будет загружен при запросе клиента, а если 0 и далее, то загрузится на старте приложения. Чем меньше число, тем раньше в очереди на загрузку будет сервлет.
168
169 1 Александр Александров
h3. Что представляет собой объект ServletConfig?
170
171 2 Александр Александров
Интерфейс javax.servlet.ServletConfig используется для передачи конфигурационной информации сервлету. Каждый сервлет имеет свой собственный объект ServletConÙg, за создание экземпляра которого ответственен контейнер сервлетов. Для установки параметров конфигурации используются init параметры в web.xml (или аннотации WebInitParam). Для получения объекта ServletConfig данного сервлета используется метод getServletConfig().
172
173 1 Александр Александров
h3. Что представляет собой объект ServletContext?
174
175 2 Александр Александров
Интерфейс javax.servlet.ServletContext определяет ряд методов, которые сервлет использует, чтобы связаться с его контейнером сервлета, например, получить тип MIME файла, диспетчеризировать запросы, или записать в файл журнала. Объект ServletContext является уникальным и доступен всем сервлетам веб приложения. Мы можем использовать объект ServletContext, когда нам необходимо предоставить доступ одному или нескольким сервлетам к инициализированным параметрам веб приложения. Для этого используется элемент <context-param> в web.xml. Объект ServletContext можно получить с помощью метода getServletContext() у интерфейса ServletConÙg. Контейнеры сервлетов так же могут предоставлять context объекты, уникальные для группы сервлетов. Каждая из групп будет связана со своим набором URL путей хоста. ServletContext был расширен в спецификации Servlet 3 и предоставляет программное добавление слушателей и фильтров в приложение. Так же у этого интерфейса имеются множество полезных методов вроде getMimeType(), getResourceAsStream() и т.д.
176
177 1 Александр Александров
h3. В чем отличия ServletContext и ServletConfig?
178
179 2 Александр Александров
Ниже приведены некоторые отличия:
180
181
* ServletConfig является уникальный объектом для каждого сервлета, в то время как ServletContext уникальный для всего приложения.
182
* ServletConfig используется для предоставления параметров инициализации сервлету, а ServletContext для предоставления параметров инициализации приложения для всех сервлетов.
183
* У нас нет возможности устанавливать атрибуты в объекте ServletConfig, в то время как можно установить атрибуты в объекте ServletContext, которые будут доступны другим сервлетам.
184
185 1 Александр Александров
h3. Интерфейс ServletResponse.
186
187 2 Александр Александров
Интерфейс ServletResponse - это инструмент для отправки данных клиенту. Все методы данного инструмента служат именно этой цели.
188
189 1 Александр Александров
h3. Интерфейс ServletRequest.
190
191 2 Александр Александров
Интерфейс ServletRequest - это инструмент для получения параметров HTTP запроса. Этот интерфейс имеет некоторые методы, идентичные по названию и назначению с ServletContext.
192
193 1 Александр Александров
h3. Что такое Request Dispatcher?
194
195 2 Александр Александров
Интерфейс RequestDispatcher используется для передачи запроса другому ресурсу (это может быть HTML, JSP или другой сервлет в том же приложении). Мы можем использовать это для добавления контента другого ресурса к ответу. Этот интерфейс используется для внутренней коммуникации между сервлетами в одном контексте. В интерфейса реализовано два метода:
196
197
* void forward(ServletRequest var1, ServletResponse var2) - передает запрос из сервлета к другому ресурсу (сервлету, JSP или HTML файлу) на сервере.
198
* void include(ServletRequest var1, ServletResponse var2) - включает контент ресурса (сервлет, JSP или HTML страница) в ответ.
199
200
Доступ к интерфейсу можно получить с помощью метода ServletContext getRequestDispatcher(String s). Путь должен начинаться с / , который будет интерпретироваться относительным текущего корневого пути контекста.
201
202 1 Александр Александров
h3. Как можно создать блокировку (deadlock) в сервлете?
203
204 2 Александр Александров
Дедлок (deadlock) можно получить реализовав зацикленный вызов метода, например вызвав метод doPost() в методе doGet() и вызвать doGet() в методе doPost().
205
206 1 Александр Александров
h3. Как получить адрес сервлета на сервере?
207
208 2 Александр Александров
Для получения актуального пути сервлета на сервере можно использовать эту конструкцию: getServletContext().getRealPath(request.getServletPath()).
209
210 1 Александр Александров
h3. Как получить информацию о сервере из сервлета?
211
212 2 Александр Александров
Информацию о сервере можно получить с использованием объекта ServletContext с помощью метода getServerInfo(). Т.е. getServletContext().getServerInfo().
213
214 1 Александр Александров
h3. Как получить ip адрес клиента на сервере?
215
216 2 Александр Александров
Использовать request.getRemoteAddr() для получения ip клиента в сервлете.
217
218 1 Александр Александров
h3. Что вы знаете о классах обертках (wrapper) для сервлетов?
219
220 2 Александр Александров
В Servlet HTTP API предоставляются два класса обертки - HttpServletRequestWrapper и HttpServletResponseWrapper. Они помогают разработчикам реализовывать собственные реализации типов request и response сервлета. Мы можем расширить эти классы и переопределить только необходимые методы для реализации собственных типов объектов ответов и запросов. Эти классы не используются в стандартном программировании сервлетов.
221
222 1 Александр Александров
h3. Каков жизненный цикл сервлета и когда какие методы вызываются?
223
224 2 Александр Александров
Контейнер сервлетов управляет четырьмя фазами жизненного цикла сервлета:
225
226
* Загрузка класса сервлета - когда контейнер получает запрос для сервлета, то происходит загрузка класса сервлета в память и вызов конструктора без параметров.
227
* Инициализация класса сервлета - после того как класс загружен контейнер инициализирует объект ServletContext для этого сервлета и внедряет его через init() метод. Это и есть место где сервлет класс преобразуется из обычного класса в сервлет.
228
* Обработка запросов - после инициализации сервлет готов к обработке запросов. Для каждого запроса клиента сервлет контейнер порождает новую нить (поток) и вызывает метод service() путем передачи ссылки на объект ответы и запроса.
229
* Удаление из Service - когда контейнер останавливается или останавливается приложение, то контейнер сервлетов уничтожает классы сервлетов путем вызова destroy() метода.
230
231
Можно описать как последовательность вызова методов: init(), service(), destroy().
232
233
* public void init(ServletConfig config) - используется контейнером для инициализации сервлета. Вызывается один раз за время жизни сервлета.
234
* public void service(ServletRequest request, ServletResponse response) - вызывается для каждого запроса. Метод не может быть вызван раньше выполнения init() метода.
235
* public void destroy() - вызывается для уничтожения сервлета (один раз за время жизни сервлета).
236
237 1 Александр Александров
h3. Какие методы необходимо определить при создании сервлетов?
238
239 2 Александр Александров
Чтобы создать сервлет, необходимо описать сервлет с помощью:
240
241
{{dmsf_image(241)}}
242
243
Затем расширить класс сервлета от класса HttpServlet. Реализовать метод service() или doGet(), doPost() (или первый или вторые).
244
245 1 Александр Александров
h3. В каком случае вы будете переопределять метод service()?
246
247 2 Александр Александров
Метод service() переопределяется, когда мы хотим, чтобы сервлет обрабатывал как GET так и POST запросы в одном методе. Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода service(), который в свою очередь вызывает doGet(), doPost() методы, основанные на HTTP методе запроса. Есть мнение, что метод service() переопределять особого смысла нет, кроме указанного вначале случая использования одного метода на два типа запросов.
248
249 1 Александр Александров
h3. Есть ли смысл определить конструктор для сервлета, как лучше инициализировать данные?
250
251 2 Александр Александров
Такая возможность есть, но считается бессмысленной. Инициализировать данные лучше переопределив метод init(), в котором получить доступ к параметрам инициализации сервлета через использование объекта ServletConfig.
252
253 1 Александр Александров
h3. В чем отличия GenericServlet и HttpServlet?
254
255 2 Александр Александров
Абстрактный класс GenericServlet - независимая от используемого протокола реализация интерфейса Servlet. HttpServlet, как понятно из название, реализация интерфейса сервлета для протокола HTTP. Следует отметить, что HttpServlet extends GenericServlet.
256
257 1 Александр Александров
h3. Как вызвать из сервлета другой сервлет этого же и другого приложения?
258
259 2 Александр Александров
Если необходимо вызывать сервлет из того же приложения, то необходимо использовать механизм внутренней коммуникации сервлетов. Мы можем вызвать другой сервлет с помощью RequestDispatcher forward() и include() методов для доступа к дополнительным атрибутам в запросе для использования в другом сервлете. Метод forward() используется для передачи обработки запроса в другой сервлет. Метод include() используется, если мы хотим вложить результат работы другого сервлета в возвращаемый ответ.
260
261
Если необходимо вызывать сервлет из другого приложения, то использовать RequestDispatcher уже не получится (определен для приложения). Поэтому можно использовать ServletResponse sendRedirect() метод и предоставить полный URL из другого сервлета. Для передачи данных можно использовать cookies как часть ответа сервлета, а потом использовать их в нашем сервлете.
262
263 1 Александр Александров
h3. Стоит ли волноваться о “многопоточной безопасности” работая с сервлетами?
264
265 2 Александр Александров
Методы класса HTTPServlet init() и destroy() вызываются один раз за жизненный цикл сервлета - поэтому по поводу них беспокоиться не стоит. Методы doGet(), doPost() вызываются на каждый запрос клиента и т.к. сервлеты используют многопоточность, то здесь нужно задумываться о потокобезопасной работе. В случае наличия локальных переменных в этих методах нет необходимости думать о многопоточной безопасности, т.к. они будут созданы отдельно для каждой нити. Но если используются глобальные ресурсы, то необходимо использовать синхронизацию как и в любом многопоточном приложении Java.
266
267 1 Александр Александров
h3. Какой метод HTTP не является неизменяемым?
268
269 2 Александр Александров
HTTP метод называется неизменяемым, если он всегда возвращает одинаковый результат. HTTP методы GET, PUT, DELETE, HEAD, OPTIONS являются неизменяемыми. Необходимо реализовывать приложение так, чтобы эти методы возвращали одинаковый результат. К изменяемым методам относится HTTP метод POST. Post метод используется для реализации чеголибо, что изменяется при каждом запросе. К примеру, для доступа к HTML странице или изображению необходимо использовать метод GET, т.к. он возвращает одинаковый результат. Но если нам необходимо сохранить информацию о заказе в базе данных, то нужно использовать POST метод. Неизменяемые методы так же известны как безопасные методы и нет необходимости заботится о повторяющихся запросах от клиента для этих методов.
270
271 1 Александр Александров
h3. Какие есть методы отправки данных с клиента на сервер? Чем они отличаются?
272
273 2 Александр Александров
Метод doGet() - используется для запроса содержимого указанного ресурса, изображения или гипертекстового документа. Вместе с за просом могут передаваться дополнительные параметры как часть URI, значения могут выбираться из полей формы или передаваться непосредственно через URL. При этом запросы кэшируются и имеют ограничения на размер. Этот метод является основным методом взаимодействия браузера клиента и вебсервера.
274
275
Метод doPost() - используется для передачи пользовательских данных в содержимом HTTP-запроса на сервер. Пользовательские данные упакованы в тело запроса согласно полю заголовка Content-Type и/или включены в URI запроса. При использовании метода POST под URI подразумевается ресурс, который будет обрабатывать запрос.
276
277 1 Александр Александров
h3. Методы сервлета (обычно имеется ввиду HttpServlet).
278
279 2 Александр Александров
В спецификации HTTP определены методы: GET, HEAD, POST, PUT, DELETE, OPTIONS и TRACE.
280
281
* Метод GET (method="GET") используется для запроса содержимого указанного ресурса, изображения или гипертекстового документа. Вместе с запросом могут передаваться дополнительные параметры как часть URI, значения могут выбираться из полей формы или передаваться непосредственно через URL. При этом запросы кэшируются и имеют ограничения на размер. Этот метод является основным методом взаимодействия браузера клиента и веб-сервера.
282
* Метод POST используется для передачи пользовательских данных в содержимом HTTP-запроса на сервер. Пользовательские данные упакованы в тело запроса согласно полю заголовка Content-Type и/или включены в URI запроса. При использовании метода POST под URI подразумевается ресурс, который будет обрабатывать запрос.
283
* Метод PUT схож с методом POST за тем исключением, что здесь URI подразумевает ресурс, который будет создан или сохранен на сервере в результате выполнения PUT-запроса.
284
* Метод DELETE предназначен для удаления целевого ресурса.
285
286
Оба эти действия на некоторых серверах могут запрещаться из-за угрозы внутренней безопасности.
287
288
* Метод HEAD предполагает возврат сервером такого же ответа, как и при использовании GET, но без тела ответа. Метод обычно используется для того, чтобы проверить существование ресурса либо узнать, изменился ли запрашиваемый ресурс с момента последнего обращения.
289
* Метод OPTIONS должен возвращать информацию о возможностях вебсервера или параметрах соединения для конкретного ресурса.
290
* Метод TRACE возвращает клиенту запрос в том виде, в каком он пришел на сервер - используется для отладки, определяя заголовки, добавляемые промежуточными серверами, а также для тестирования настроек соединения.
291
292 1 Александр Александров
h3. Почему HttpServlet класс объявлен как абстрактный?
293
294 2 Александр Александров
Класс HTTPServlet предоставляет реализацию HTTP протокола сервлета (а следовательно помогает избежать постоянного кодинга повторяющейся информации), но он не имеет реализованных методов doGet() и doPost() (у них по умолчанию возвращение HTTP 405 Method Not Implemented error), а следовательно объявлен абстрактным. Реализация этих методов перекладывается на разработчика.
295
296 1 Александр Александров
h3. В чем разница между методами GET и POST?
297
298 2 Александр Александров
Основные отличия:
299
300
* GET метод является неизменяемым, тогда как POST - изменяемый.
301
* С помощью метода GET можно посылать ограниченное кол-во данных, которые будут пересланы в заголовке URL. В случае POST метода мы можем пересылать большие объемы данных, т.к. они будут находится в теле метода.
302
* Данные GET метода передаются в открытом виде, что может использоваться в зловредных целях. POST данные передаются в теле запроса и скрыты от пользователя.
303
* GET метод является HTTP методом по умолчанию, а POST метод необходимо указывать явно, чтобы отправить запрос.
304
* GET метод используется гиперссылками на странице.
305
306 1 Александр Александров
h3. Назовите преимущества Servlet над CGI?
307
308 2 Александр Александров
Технология сервлетов была создана для преодоления недостатков Common Gateway Interface (общий интерфейс шлюза). Можно выделить следующие преимущества сервлетов над CGI:
309
310
* Сервлеты предоставляют лучшую производительность в условиях обработки запросов, лучшее использование памяти за счет использования преимущества многопоточности (на каждый запрос создается новая нить, что быстрее выделения памяти под новый объект для каждого запроса, как это происходит в CGI).
311
* Сервлеты, платформа и система являются независимыми. Таким образом веб приложение написанное с использованием сервлетов может быть запущена в любом контейнере сервлетов, реализующим стандарт и в любой операционной системе.
312
* Использование сервлетов повышает надежность программы, т.к. контейнер сервлетов самостоятельно заботится о жизненном цикле сервлетов (а значит и за утечками памяти), безопасности и сборщике мусора.
313
* Сервлеты относительно легки в изучении и поддержке, т.к. разработчику необходимо заботится только о бизнес логике приложения, а не внутренней реализации веб технологий.
314
315 1 Александр Александров
h3. Каковы наиболее распространенные задачи выполняются в Servlet контейнере?
316
317 2 Александр Александров
Некоторые из них:
318
319
* Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а также разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес логике приложения.
320
* Управления жизненным циклом сервлетов и ресурсов. Начиная от загрузки сервлета в память, инициализации, внедрения методов и заканчивая уничтожением сервлета. Контейнер так же предоставляет дополнительные утилиты, например JNDI, для управления пулом ресурсов.
321
* Поддержка многопоточности. Контейнер самостоятельно создает новую нить для каждого запроса и предоставляет ей запрос и ответ для обработки. Таким образом сервлет не инициализируется заново для каждого запроса и тем самым сохраняет память и уменьшает время до обработки запроса.
322
* Поддержка JSP. JSP классы не похожи на стандартные классы джавы, но контейнер сервлетов преобразует каждую JSP в сервлет и далее управляется контейнером как обычным сервлетом.
323
* Различные задачи. Контейнер сервлетов управляет пулом ресурсов, памятью приложения, сборщиком мусора. Предоставляются возможности настройки безопасности и многое другое.
324
325 1 Александр Александров
h3. В чем разница между PrintWriter и ServletOutputStream?
326
327 2 Александр Александров
PrintWriter - это класс для работы с символьным потоком, а ServletOutputStream - класс для работы байтовым потоком. PrintWriter используется для записи информации на основе символов, вроде массива символов или строки в ответ, в то время как ServletOutputStream используется для записи в ответ массива байтов. Для получения экземпляра ServletOutputStream используется метод ServletResponse getOutputStream(), а для PrintWriter - метод ServletResponse getWriter().
328
329 1 Александр Александров
h3. Можем ли мы получить PrintWriter и ServletOutputStream одновременно в сервлете?
330
331 2 Александр Александров
Мы не можем создать два объекта этих классов в одном сервлете. При попытке внедрить оба метода getWriter() и getOutputStream() в ответе, мы получим исключение java.lang.IllegalStateException с сообщением, что уже другой метод был вызван для этого ответа.
332
333 1 Александр Александров
h3. Расскажите об интерфейсе SingleThreadModel.
334
335 2 Александр Александров
Интерфейс был создан, чтобы гарантировать потокобезопасность и невозможность создания двух нитей в сервис методе сервлета. Однако интерфейс SingleThreadModel не решает всех проблем потокобезопасности. Например, атрибуты сессии или статические переменные могут быть доступны различным запросам в различных потоках в одно и тоже время (даже при использовании этого интерфейса). Интерфейс объявлен deprecated начиная с Servlet 2.4.
336
337 1 Александр Александров
h3. Какие существуют атрибуты у сервлетов и какая сфера их применения?
338
339 2 Александр Александров
Атрибуты сервлетов используются для внутренней коммуникации сервлетов. Мы можем использовать атрибуты set, get, remove в веб приложении. Интерфейсы ServletRequest, HttpSession и ServletContext предоставляют методы для get(), set(), remove() атрибутов из request scope, session scope, application scope.
340
341 1 Александр Александров
h3. Почему необходимо переопределить только init() метод без аргументов?
342
343 2 Александр Александров
Если нам необходимо инициализировать какие-то ресурсы до того как сервлет начнет обрабатывать запросы, то необходимо переопределить метод init(). Если переопределить метод init(ServletConfig config), то первым должен быть вызван метод super(config), который обеспечит вызов метода init(ServletConfig config) суперкласса. Именно поэтому GenericServlet предоставляет другой метод init() без параметров, который будет вызываться в конце метода init(ServletConfig config). Разработчик должен использовать переопределенный метод init() без параметров для инициализации переменных для избежания каких-либо проблем, например не указав вызов super() в переопределенном методе init(ServletConfig config).
344
345 1 Александр Александров
h3. Что означает URL encoding? Зачем нужны методы encode() и decode()?
346 2 Александр Александров
347
URL Encoding - процесс преобразования данных в форму CGI (Common Gateway Interface), который позволит путешествовать по сети без проблем. URL Encoding разделяет пробелы и заменяет специальные символы с помощью escape-символов. Например, для кодирования строки используется метод java.net.URLEncoder.encode(String str, String unicode). Обратная операция декодирования возможна благодаря методу java.net.URLDecoder.decode(String str, String unicode). Пример работы метода: строка " Java programing language" будет преобразована в "Java%20programing%20language".
348 1 Александр Александров
349
h3. Зачем нужны и чем отличаются методы encodeUrl() и encodeRedirectUrl()?
350
351
h3. Какие различные методы управления сессией в сервлетах вы знаете?
352
353
h3. Что означает URL Rewriting?
354
355
h3. Что такое Cookie?
356
357
h3. Как применяются Cookies в сервлетах?
358
359
h3. Как уведомить объект в сессии, что сессия недействительна или закончилась?
360
361
h3. Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с валидной сессией?
362
363
h3. Как мы можем обеспечить transport layer security для нашего веб приложения?
364
365
h3. Как организовать подключение к базе данных и обеспечить логирование log4j в сервлете?
366
367
h3. Какие особенности Servlet 3?
368
369
h3. Каковы различные способы аутентификации сервлета?
370
371
h3. Что такое Java Server Pages (JSP)?
372
373
h3. Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
374
375
h3. Расскажите об этапах (фазах) жизненного цикла jsp.
376
377
h3. Расскажите о методах жизненного цикла jsp.
378
379
h3. Какие методы жизненного цикла JSP могут быть переопределены?
380
381
h3. Как можно предотвратить прямой доступ к JSP странице из браузера?
382
383
h3. Какая разница между динамическим и статическим содержимым JSP?
384
385
h3. Как закомментировать код в jsp?
386
387
h3. Какие основные теги в JSP?
388
389
h3. Какие типы EL операторов вы знаете?
390
391
h3. Взаимодействие JSP - сервлет - JSP.
392
393
h3. Что такое сессия?
394
395
h3. Какие скоупы переменных существуют в JSP?
396
397
h3. Какие неявные, внутренние объекты и методы есть на jsp странице?
398
399
h3. Почему неявные объекты не доступны в обычной JSP странице?
400
401
h3. Что вы знаете о PageContext и какие преимущества его использования?
402
403
h3. Как сконфигурировать init параметры для JSP?
404
405
h3. Почему не рекомендуется использовать скриптовые элементы в jsp?
406
407
h3. Чем отличается <c:import> от <jsp:include> и директиви <%@include %>?
408
409
h3. Что вы знаете о jsp тегах? Объясните как вы понимаете Action tag и JSP Action Elements.
410
411
h3. Что такое JSTL (Jsp Standard tag library)?
412
413
h3. Из каких групп тегов состоит библиотека JSTL?
414
415
h3. Какая разница между тегом <c:set> и <jsp:useBean>?
416
417
h3. Назовите неявные, внутренние объекты JSP EL и их отличия от объектов jsp.
418
419
h3. Как узнать имя http метода используя JSP EL?
420
421
h3. Что вы знаете о написании пользовательских jsp тегов?
422
423
h3. Приведите пример использования собственных тегов.
424
425
h3. Почему не нужно конфигурировать стандартные JSP теги в web.xml?
426
427
h3. Как можно обработать ошибки jsp страниц?
428
429
h3. Как происходит обработка ошибок с помощью jstl?
430
431
h3. Приведите пример конфигурации JSP в дескрипторе развертывания.
432
433
h3. Как деактивировать использование EL на JSP?
434
435
h3. Можно ли использовать javascript на jsp странице?
436
437
h3. Всегда ли создается объект сессии на jsp странице, можно ли отключить его создание?
438
439
h3. Какая разница между JspWriter и Servlet PrintWriter?
440
441
h3. Как можно расширить функциональность jsp?
Go to top