JSP SERVLETS JSTL » История » Версия 3
Александр Александров, 21.04.2019 23:13
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 | 3 | Александр Александров | HttpServletResponse предоставляет методы преобразования URL в HTML гиперссылки с преобразованием спец символов и пробелов, а так же добавления session id к URL. Такое поведение аналогично URLEncoder encode(), но с добавлением дополнительного параметра jsessionid в конец URL. Метод HttpServletResponse encodeRedirectUrl() применяется для преобразования redirect URL в ответе. Таким образом при предоставлении поддержки URL rewriting для HTML гиперссылок необходимо использовать encodeURL(), а для редирект URL’ов использовать encodeRedirectUrl() |
352 | |||
353 | 1 | Александр Александров | h3. Какие различные методы управления сессией в сервлетах вы знаете? |
354 | |||
355 | 3 | Александр Александров | Сессия является обычным состоянием взаимодействия сервера и клиента и может содержать в себе множество запросов и ответов клиент-сервер. Т.к. HTTP и веб сервер не запоминают состояния (stateless), то единственным способом поддерживать сессию является пересылка уникальной информации (session id) в каждом запросе и ответе между клиентом и сервером. Существуют несколько распространенных способов управления сессией в сервлетах: |
356 | |||
357 | * Аутентификация пользователя |
||
358 | * HTML hidden field (скрытое поле) |
||
359 | * Cookies |
||
360 | * URL Rewriting |
||
361 | * Session Management API |
||
362 | |||
363 | 1 | Александр Александров | h3. Что означает URL Rewriting? |
364 | |||
365 | 3 | Александр Александров | Для управления сессией в сервлетах мы можем использовать HTTPSession, но он работает с Cookies, а их иногда отключают. Для этого случая в сервлетах предусмотрена возможность URL Rewriting. С точки зрения программирования необходимо всего одно действие - кодирование URL. Другим достоинством является то, что этот метод является как бы запасным и включается только при выключенных куках. Применяя метод HttpServletResponse encodeURL() мы можем закодировать URL. Если необходим редирект к другому ресурсу, то для предоставления информации о сессии применяется метод encodeRedirectURL() |
366 | |||
367 | 1 | Александр Александров | h3. Что такое Cookie? |
368 | |||
369 | 3 | Александр Александров | Cookie - это небольшие блоки текстовой информации, которые сервер посылает клиенту для сохранения в файлах cookies. Клиент может запретить браузеру прием файлов cookies. Браузер возвращает информацию обратно на сервер как часть заголовка HTTP, когда клиент повторно заходит на тот же веб-ресурс. |
370 | |||
371 | 1 | Александр Александров | h3. Как применяются Cookies в сервлетах? |
372 | |||
373 | 3 | Александр Александров | Cookies (куки) используются в клиент-серверном взаимодействии и они не являются чем-то конкретным в Java. Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie implements Serializable, Cloneable. Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest getCookies(). Для добавления cookies в запрос методов не предусмотрено. |
374 | |||
375 | Аналогично HttpServletResponse addCookie(Cookie c) - может добавить cookie в response header, но не существует геттера для этого типа передачи данных. |
||
376 | |||
377 | 1 | Александр Александров | h3. Как уведомить объект в сессии, что сессия недействительна или закончилась? |
378 | |||
379 | 3 | Александр Александров | Чтобы быть уверенным об оповещение объекта о прекращении сессии, объект должен реализовывать интерфейс javax.servlet.http.HttpSessionBindingListener. Два метода этого интерфейса: valueBound() и valueUnbound() применяются для реализации логики при добавлении объекта в качестве атрибута к сессии и при уничтожения сессии. |
380 | |||
381 | 1 | Александр Александров | h3. Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с валидной сессией? |
382 | |||
383 | 3 | Александр Александров | Сервлет фильтры используются для перехвата всех запросов между контейнером сервлетов и сервлетом. Поэтому логично использовать фильтр для проверки необходимой информации (например валидности сессии) в запросе. |
384 | |||
385 | 1 | Александр Александров | h3. Как мы можем обеспечить transport layer security для нашего веб приложения? |
386 | |||
387 | 3 | Александр Александров | Для этого необходимо настроить SSL для вашего сервлет контейнера. Как это сделать описано в мануалах для конкретной реализации контейнера. |
388 | |||
389 | 1 | Александр Александров | h3. Как организовать подключение к базе данных и обеспечить логирование log4j в сервлете? |
390 | |||
391 | 3 | Александр Александров | При работе с большим количеством подключений к базе данных рекомендуется инициализировать их в servlet context listener и установить в качестве атрибута контекста для возможности использования другими сервлетами. Логирование Log4j подключается с помощью конфигурации XML (или файла property) и далее эта информация используется при конфигурировании context listener’а. |
392 | |||
393 | 1 | Александр Александров | h3. Какие особенности Servlet 3? |
394 | |||
395 | 3 | Александр Александров | Особенности Servlet 3.0: |
396 | |||
397 | * Servlet Annotations. До Servlet 3 весь маппинг был в web.xml, что приводило к ошибкам и банально неудобно при большом количестве сервлетов. Примеры аннотаций: @WebServlet, @WebInitParam, @WebFilter, @WebListener. |
||
398 | * Web Fragments. С появлением веб фрагментов мы можем содержать множество модулей в одностраничном веб приложении. Все модули прописываются в fragment.xml в META-INF директории. Это позволяет разделять веб приложение на отдельные модули, включенные как JAR файлы в отдельной lib директории. |
||
399 | * Динамическое добавление веб компонентов. Используя ServletContext объект, мы можем программно добавлять фильтры и слушатели. Это помогает построить динамическую систему, в которой необходимый объект будет вызван только по необходимости. Для этого применяются методы addServlet(), addFilter(), addListener(). |
||
400 | * Асинхронное выполнение. Поддержка асинхронной обработки позволяет передать выполнение запроса в другой поток без удержания всего сервера занятым. |
||
401 | |||
402 | 1 | Александр Александров | h3. Каковы различные способы аутентификации сервлета? |
403 | |||
404 | 3 | Александр Александров | Контейнер сервлетов предоставляет различные способы аутентификации: |
405 | |||
406 | * HTTP Basic Authentication |
||
407 | * HTTP Digest Authentication |
||
408 | * HTTPS Authentication |
||
409 | * Form Based Login |
||
410 | |||
411 | 1 | Александр Александров | h3. Что такое Java Server Pages (JSP)? |
412 | |||
413 | 3 | Александр Александров | JSP (Java Server Pages) - технология, позволяющая веб-разработчикам динамически генерировать HTML, XML и другие веб-страницы. JSP был включен в состав Java EE - программной платформы для программирования |
414 | веб-приложений. Технология позволяет вставлять Java-код, в статический содержимое страницы. Также могут использоваться библиотеки JSP тегов для вставки их в JSP-страницы. Страницы компилируются JSP-компилятором в сервлеты, которые являются Java-классами, и выполняются на сервере. Сервлеты также могут быть написаны разработчиком, не используя JSPстраницы. Эти технологии дополняют друг друга. |
||
415 | |||
416 | 1 | Александр Александров | h3. Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю. |
417 | |||
418 | 3 | Александр Александров | Когда пользователь переходит по ссылке, назовем ее index.jsp, он отправляет http запрос на сервер в виде "GET /index.jsp". Затем на основе этой страницы, сервер генерирует, компилирует и выполняет Java сервлет, который приходит ответом пользователю в виде отображения этой страницы. Такой жизненный цикл можно разделить на 6 шагов: |
419 | |||
420 | # Запрос от пользователя. |
||
421 | # Чтение .jsp страницы сервером. |
||
422 | # Генерация java класса на основе этой .jsp страницы. |
||
423 | # Компиляция в class файл. |
||
424 | # Выполнение class файла. |
||
425 | # Отправка ответа пользователю в виде html страницы. |
||
426 | |||
427 | 1 | Александр Александров | h3. Расскажите об этапах (фазах) жизненного цикла jsp. |
428 | |||
429 | 3 | Александр Александров | Если посмотреть код внутри созданной JSP страницы, то он будет выглядеть как HTML и не будет похож на java класс. Конвертацией JSP страниц в HTML код занимается контейнер, который так же создает сервлет для использования в веб приложении. Жизненный цикл JSP состоит из нескольких фаз: |
430 | |||
431 | * Translation - JSP контейнер проверяет код JSP страницы, парсит ее для создания кода сервлета. К примеру, в Tomcat вы можете найти классы сервлетов в директории TOMCAT/work/Catalina/localhost/WEBAPP/org/apache/jsp. Если страница JSP называется home.jsp, то созданный сервлет обычно будет иметь имя home_jsp и имя файла - home_jsp.java. |
||
432 | * Compilation - JSP контейнер компилирует исходный код jsp класса и создает класс на этой фазе. |
||
433 | * Class Loading - контейнер загружает классы в память на этой фазе. |
||
434 | * Instantiation - внедрение конструкторов без параметров созданных классов для инициализации в памяти классов. |
||
435 | * Initialization - в контейнере вызывается init метод объекта JSP класса и инициализируется конфигурация сервлета с init параметрами, которые указаны в дескрипторе развертывания (web.xml). После этой фазы JSP способен обрабатывать запросы клиентов.Обычно эти фазы происходят после первого запроса клиента (т.е. ленивая загрузка), но можно настроить загрузку и инициализацию JSP на старте приложения по аналогии с сервлетами. |
||
436 | * Request Processing - длительный жизненный цикл обработки запросов клиента JSP страницей. Обработка является многопоточной и аналогична сервлетам - для каждого запроса создается новая нить, создаются объекты ServletRequest и ServletResponse и происходит внедрение сервис методов JSP. |
||
437 | * Destroy - последняя фаза жизненного цикла JSP на которой JSP класс удаляется из памяти. Обычно это происходит при выключении сервера или андеплое приложения. |
||
438 | |||
439 | 1 | Александр Александров | h3. Расскажите о методах жизненного цикла jsp. |
440 | |||
441 | 3 | Александр Александров | Методы жизненного цикла JSP: |
442 | |||
443 | * jspInit() - метод объявлен в JSP странице и реализуется с помощью реализаций контейнера. Этот метод вызывается один раз в жизненном цикле JSP для того, чтобы инициализировать конфигурационные параметры, указанные в дескрипторе развертывания. Этот метод можно переопределить с помощью определения элемента JSP scripting и указания необходимых параметров для инициализации. |
||
444 | * jspService() - этот JSP метод внедряется JSP контейнером для каждого запроса клиента с помощью передачи объекта запроса и ответа. Отметьте, что имя метода начинается с нижнего подчеркивания и отличается от других методов жизненного цикла тем, что его невозможно переопределить. Весь JSP код проходит через этот метод и он переопределен по умолчанию. Этот метод определен в HttpJspPage интерфейсе. |
||
445 | * jspDestroy() - метод вызывается контейнером JSP для удаления объекта из памяти (на последней фазе жизненного цикла JSP - Destroy). Метод вызывается только один раз и мы можем его переопределить для очищения любых ресурсов, которые были созданы в JSP init методе. |
||
446 | |||
447 | 1 | Александр Александров | h3. Какие методы жизненного цикла JSP могут быть переопределены? |
448 | |||
449 | 3 | Александр Александров | Мы можем переопределить jspInit() и jspDestroy() методы с помощью использования скриптов JSP. Метод jspInit() переопределяется для создания общих ресурсов, которые мы хотели бы использовать в методе обслуживания JSP, а jspDestroy() метод переопределяется, чтобы освободить общие ресурсы на фазе уничтожения. |
450 | |||
451 | 1 | Александр Александров | h3. Как можно предотвратить прямой доступ к JSP странице из браузера? |
452 | |||
453 | 3 | Александр Александров | Директория WEB-INF не имеет прямого доступа из веб приложения. Поэтому мы можем положить JSP страницы внутри этой папки и тем самым запретить доступ к странице из браузера. Однако в этом случае необходимо настраивать дескриптор развертывания наподобие сервлетов. Простая конфигурация дескриптора web.xml показана ниже. |
454 | |||
455 | {{dmsf_image(242)}} |
||
456 | |||
457 | 1 | Александр Александров | h3. Какая разница между динамическим и статическим содержимым JSP? |
458 | |||
459 | 3 | Александр Александров | Динамические ресурсы. Результаты их деятельности изменяются во время выполнения приложения. Обычно представлены в виде выражений Expression Language, библиотек тегов и тегов разработчика. Статические ресурсы. Не изменяются сами в процессе работы (HTML, JavaScript, изображения и т. д.). |
460 | |||
461 | 1 | Александр Александров | h3. Как закомментировать код в jsp? |
462 | |||
463 | 3 | Александр Александров | JSP предоставляет две возможности закомментировать код: |
464 | |||
465 | * HTML комментарии - <-- HTML Comment --> . Такие комментарии будут видны клиенту при просмотре кода страницы. |
||
466 | * JSP комментарии - <%-- JSP Comment --%>. Такие комментарии создаются в созданном сервлете и не посылаются клиенту. Для любых комментариев по коду или отладочной информации необходимо использовать этот тип комментариев. |
||
467 | |||
468 | 1 | Александр Александров | h3. Какие основные теги в JSP? |
469 | |||
470 | 3 | Александр Александров | В спецификации JSP 1.2 были объявлены только пять основных тегов: |
471 | |||
472 | * <%@ директива %> - используется для установки параметров серверной страницы JSP; |
||
473 | * <%! объявление %> - (нежелателен в современном программировании) содержит поля и методы, которые вызываются в expression-блоке и становятся полями и методами генерируемого сервлета. |
||
474 | * <% скриптлет %> - (нежелателен) вживление java-кода в JSP-страницу. Скриптлеты обычно используют маленькие блоки кода и выполняются во время обработки запроса клиента. |
||
475 | * <%= вычисляемое выражение %> - (нежелателен) содержит операторы языка Java, которые вычисляются, после чего результат вычисления преобразуется в строку String и посылается в поток out; |
||
476 | * <%-- JSP-комментарий --%> - комментарий, который не отображается в исходных кодах JSP-страницы после этапа выполнения. |
||
477 | |||
478 | 1 | Александр Александров | h3. Какие типы EL операторов вы знаете? |
479 | |||
480 | 3 | Александр Александров | Стандартные операторы отношения: |
481 | |||
482 | * == (или eq), != (или ne), < (или lt), > (или gt), <= (или le), >= (или ge). |
||
483 | * Арифметические операторы: +, -, *, / (или div), % (или mod). |
||
484 | * Логические операторы: && (или and), || (или or), ! (или not). |
||
485 | |||
486 | 1 | Александр Александров | h3. Взаимодействие JSP - сервлет - JSP. |
487 | |||
488 | 3 | Александр Александров | Такая архитектура построения приложений носит название MVC (Model/View/Controller). Model - классы бизнес-логики и длительного хранения, View - страницы JSP, Controller - сервлет. |
489 | |||
490 | 1 | Александр Александров | h3. Что такое сессия? |
491 | |||
492 | 3 | Александр Александров | Сессия - это сеанс между клиентом и сервером, устанавливаемая на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и веб-сервером в момент получения первого запроса к веб-приложению. Каждый клиент устанавливает с сервером свой собственный сеанс, который сохраняется до окончания работы с приложением. |
493 | |||
494 | 1 | Александр Александров | h3. Какие скоупы переменных существуют в JSP? |
495 | |||
496 | 3 | Александр Александров | Exression Language - это переменные определенного скоупа, которые доступны через выражение ${…}, среди скоупов есть и скоуп page, но даже в этом скоупе переменная не является локальной для класса страницы. Поэтому мы просто так не можем в скриптлете обратиться к переменной из этих скоупов, в том числе и скоупа страницы. Скоупы бывают: page, request, session, application, response, out, config. |
497 | |||
498 | 1 | Александр Александров | h3. Какие неявные, внутренние объекты и методы есть на jsp странице? |
499 | |||
500 | 3 | Александр Александров | JSP implicit objects (неявные объекты) создаются контейнером при конвертации JSP страницы в код сервлета для помощи разработчикам. Эти объекты можно использовать напрямую в скриптлетах для передачи информации в сервис методы, однако мы не можем использовать неявные объекты в JSP Declaration, т.к. такой код пойдет на уровень класса. Существует 9 видов неявных объектов, которые можно использовать прямо на JSP странице. Семь из них объявлены как локальные переменные вначале _jspService() метода, а два оставшихся могут быть использованы как аргументы метода _jspService(). |
501 | |||
502 | * out Object |
||
503 | * request Object |
||
504 | * response Object |
||
505 | * config Object |
||
506 | * application Object |
||
507 | * session Object |
||
508 | * pageContext Object |
||
509 | * page Object |
||
510 | * exception Object |
||
511 | |||
512 | 1 | Александр Александров | h3. Почему неявные объекты не доступны в обычной JSP странице? |
513 | |||
514 | 3 | Александр Александров | Неявный объект исключений JSP недоступен в обычных JSP страницах и используется на страницах ошибок JSP только для того, чтобы перехватить исключение, брошенное JSP страницей и далее предоставить какую-либо полезную информацию клиенту. |
515 | |||
516 | 1 | Александр Александров | h3. Что вы знаете о PageContext и какие преимущества его использования? |
517 | |||
518 | 3 | Александр Александров | Неявный объект JSP pageContext является экземпляром реализации абстрактного класса javax.servlet.jsp.PageContext. Мы можем использовать объект pageContext для получения и установки атрибутов с различной областью видимости и для проброса запросов к другому ресурсу. Этот объект так же обладает ссылкой на другой неявный объект. Это единственный объект, который представлен в JSP implicit objects и JSP EL implicit objects. |
519 | |||
520 | 1 | Александр Александров | h3. Как сконфигурировать init параметры для JSP? |
521 | |||
522 | 3 | Александр Александров | Мы можем задать параметры инициализации для JSP аналогично сервлетам в web.xml файле. Мы должны сконфигурировать init параметры JSP с элементами servlet и servlet-mapping. Единственным отличием будет указание |
523 | местонахождения JSP страницы. |
||
524 | |||
525 | 1 | Александр Александров | h3. Почему не рекомендуется использовать скриптовые элементы в jsp? |
526 | |||
527 | 3 | Александр Александров | JSP страницы в основном используются для целей отображения представления, а вся бизнес логика и модели должны быть реализованы в сервлетах или классах моделях. Мы должны передавать параметры к JSP странице через атрибуты и затем использовать их для создания HTML ответа на JSP странице. Большая часть JSP содержит HTML код и для того, чтобы помочь дизайнерам понять код JSP страницы и разрабатывать их, предоставляют элементы action, JSP EL, JSP Standart Tag Library. Именно эти элементы необходимо использовать вместо скриптлетов для создания моста между JSP HTML и JSP java частями. |
528 | |||
529 | 1 | Александр Александров | h3. Чем отличается <c:import> от <jsp:include> и директиви <%@include %>? |
530 | |||
531 | 3 | Александр Александров | Тег <c:import> получает доступ к источнику, чтение информации из которого происходит непосредственно без буферизации. Контент включается построчно в исходную JSP. По сравнению с action-тегом <jsp:include> и директивой <%@include %> тег <c:import> обеспечивает более совершенное включение динамических ресурсов. |
532 | |||
533 | 1 | Александр Александров | h3. Что вы знаете о jsp тегах? Объясните как вы понимаете Action tag и JSP Action Elements. |
534 | |||
535 | 3 | Александр Александров | JSP элементы или теги action предоставляют полезную функциональность для работы с Java Bean, вложения ресурсов, проброса запроса и создания динамических XML элементов. Элементы jsp action всегда начинаются с записи jsp: и мы можем использовать их прямо внутри страницы JSP без необходимости подключения библиотек или других настроек. Наиболее часто используемыми элементами action являются: jsp:useBean, jsp:getProperty, jsp:setProperty, jsp:include, jsp:forward. |
536 | |||
537 | 1 | Александр Александров | h3. Что такое JSTL (Jsp Standard tag library)? |
538 | |||
539 | 3 | Александр Александров | Стандартная библиотека тегов JSP (англ. JavaServer Pages Standard Tag Library, JSTL) - расширение спецификации JSP, добавляющее библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации. JSTL является альтернативой такому виду встроенной в JSP логики, как скриптлеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения. Для использования JSTL тегов необходимо подключить библиотеку и указать на страницы пространство имен. |
540 | |||
541 | {{dmsf_image(243)}} |
||
542 | |||
543 | Для подключения пространства имен основных тегов JSTL необходимо указать на JSP странице код: |
||
544 | |||
545 | {{dmsf_image(244)}} |
||
546 | |||
547 | 1 | Александр Александров | h3. Из каких групп тегов состоит библиотека JSTL? |
548 | |||
549 | 3 | Александр Александров | Библиотека тегов JSTL состоит из пяти групп тегов: |
550 | |||
551 | * Core Tags - основные теги, предоставляют возможности итерации, обработки исключений, url, forward и redirect response и т.д. |
||
552 | * Formatting и Localization Tags - теги форматирования, предоставляют возможности по форматированию Numbers, Dates и поддержки i18n локализации и resource bundles. |
||
553 | * SQL Tags - теги для работы с SQL, поддержка работы с базами данных вроде MySQL, Oracle и т.д. |
||
554 | * XML Tags - теги для работы с XML документами. Например для парсинга XML, преобразования данных XML и выполнения выражений XPath. |
||
555 | * JSTL Functions Tags - функции-теги для обработки строк, предоставляет набор функций, которые позволяют выполнять различные операции со строками и т.п.. Например по конкатенации или разбиению строк |
||
556 | |||
557 | 1 | Александр Александров | h3. Какая разница между тегом <c:set> и <jsp:useBean>? |
558 | |||
559 | 3 | Александр Александров | Существует аналогия между тегом <c:set> и тегом <jsp:useBean>. Оба создают и помещают экземпляры в заданную область видимости. Но <jsp:useBean> только непосредственно создает экземпляр конкретного типа, а <c:set>, создав ссылку, позволяет извлекать значение, например, из параметров запроса, сессии и т. д. |
560 | |||
561 | 1 | Александр Александров | h3. Назовите неявные, внутренние объекты JSP EL и их отличия от объектов jsp. |
562 | |||
563 | 3 | Александр Александров | Язык выражений JSP предоставляет множество неявных объектов, которые можно использовать для получения атрибутов в различных областях видимости (scopes) и для значений параметров. Важно отметить, что они |
564 | отличаются от неявных объектов JSP и содержат атрибуты в заданной области видимости. Наиболее часто использующийся implicit object в JSP EL и JSP page - это объект pageContext. Ниже представлена таблица неявных объектов JSP EL. |
||
565 | |||
566 | {{dmsf_image(245)}} |
||
567 | |||
568 | 1 | Александр Александров | h3. Как узнать имя http метода используя JSP EL? |
569 | |||
570 | 3 | Александр Александров | Вот так: ${pageContext.request.method}. |
571 | |||
572 | 1 | Александр Александров | h3. Что вы знаете о написании пользовательских jsp тегов? |
573 | |||
574 | 3 | Александр Александров | SP позволяет создавать свои собственные теги с необходимой функциональностью. Мы можем добавить библиотеку тегов на страницу JSP используя указание пространства имен. Для создания своего тега мы можем использовать следующие компоненты: |
575 | |||
576 | * JSP Custom Tag Handler |
||
577 | * Создание файла Tag Library Descriptor (TLD) |
||
578 | * Deployment Descriptor конфигурацию для TLD |
||
579 | |||
580 | 1 | Александр Александров | h3. Приведите пример использования собственных тегов. |
581 | |||
582 | 3 | Александр Александров | Например нам необходимо отформатировать в каком-либо стиле очень длинное число. Для этого можно использовать собственный тег вроде: |
583 | |||
584 | <pre> |
||
585 | <mytags:formatnumber number="123456.789" format="#,###.00"/> |
||
586 | </pre> |
||
587 | |||
588 | Используя входные параметры, число должно быть преобразовано на JSP странице в таком виде 123,456.79 согласно шаблону. Т.к. JSTL не предоставляет такой функциональности, то нам придется создать собственный тег для получения необходимого результата. |
||
589 | |||
590 | 1 | Александр Александров | h3. Почему не нужно конфигурировать стандартные JSP теги в web.xml? |
591 | |||
592 | 3 | Александр Александров | Нам не нужно настраивать стандартные теги JSP в web.xml, потому что TLD файлы уже находятся внутри каталога META-INF в JSTL jar файлах. Когда контейнер загружает веб-приложение и находит TLD файлы в директории META-INF в JAR файле, то он автоматически настраивает их для непосредственного использования на JSP страницах. Остается только задать пространство имен на jsp странице. |
593 | |||
594 | 1 | Александр Александров | h3. Как можно обработать ошибки jsp страниц? |
595 | |||
596 | 3 | Александр Александров | Для обработки исключений выброшенных на jsp странице необходимо всего лишь задать страницу ошибки. Для создания страницы ошибки JSP мы должны установить значение page directive attribute isErrorPage в значение true. Тогда мы получим доступ к неявным объектам исключений в JSP и сможем передавать собственные сообщение об ошибках клиенту (обычно более информативных). |
597 | |||
598 | Настройка дескриптора развертывания выглядит так. |
||
599 | |||
600 | {{dmsf_image(246)}} |
||
601 | |||
602 | 1 | Александр Александров | h3. Как происходит обработка ошибок с помощью jstl? |
603 | |||
604 | 3 | Александр Александров | Перехватывать исключения и обрабатывать их в служебных методах класса можно с помощью JSTL Core Tags c:catch и c:if. Тег c:catch перехватывает исключение и обертывает его в переменную exception, которую мы можем обработать в теге c:if. |
605 | |||
606 | {{dmsf_image(247)}} |
||
607 | |||
608 | Обратите внимание что используется язык выражений JSP EL в теге c:if. |
||
609 | |||
610 | 1 | Александр Александров | h3. Приведите пример конфигурации JSP в дескрипторе развертывания. |
611 | |||
612 | 3 | Александр Александров | Элемент jsp-config используется для настройки различных параметров jsp страниц. |
613 | |||
614 | * Управление элементами скриптлетов на странице. |
||
615 | * Управления выполнением в языке выражений. |
||
616 | * Определение шаблона URL для encoding. |
||
617 | * Определение размера буфера, который используется для объектов на странице. |
||
618 | * Обозначение групп ресурсов, соответствующих шаблону URL, которые должны быть обработаны как XML документ. |
||
619 | |||
620 | {{dmsf_image(248)}} |
||
621 | |||
622 | 1 | Александр Александров | h3. Как деактивировать использование EL на JSP? |
623 | |||
624 | 3 | Александр Александров | Для игнорирования выполнения языка выражений на странице существует |
625 | два способа: |
||
626 | |||
627 | * использовать директиву <%@ page isELIgnored=»true» %>, |
||
628 | * настроить web.xml (лучше подходит для отключения на EL на многих страницах) |
||
629 | |||
630 | {{dmsf_image(249)}} |
||
631 | |||
632 | 1 | Александр Александров | h3. Можно ли использовать javascript на jsp странице? |
633 | |||
634 | 3 | Александр Александров | Да, это возможно. Несмотря на то, что JSP серверная технология, она всё равно создает HTML страницу, на которую можно так же добавлять javascript код и css стили. |
635 | |||
636 | 1 | Александр Александров | h3. Всегда ли создается объект сессии на jsp странице, можно ли отключить его создание? |
637 | |||
638 | 3 | Александр Александров | По умолчанию jsp страница создает сессию, но иногда это не нужно. Мы можем использовать директиву page с атрибутом session для указания не создавать новую сессию по умолчанию. Для отключения создания сессии используется код, показанный ниже. |
639 | |||
640 | <pre> |
||
641 | <% page session = "false" %> |
||
642 | </pre> |
||
643 | |||
644 | 1 | Александр Александров | h3. Какая разница между JspWriter и Servlet PrintWriter? |
645 | |||
646 | 3 | Александр Александров | PrintWriter является объектом ответа для записи контента в ответе. JspWriter использует объект PrintWriter незаметно для пользователя и обеспечивают поддержку буферизации. Когда буфер заполнен или очищен, JspWriter использует объект PrintWriter для записи содержания (контента) в ответ. |
647 | |||
648 | 1 | Александр Александров | h3. Как можно расширить функциональность jsp? |
649 | 3 | Александр Александров | |
650 | Мы можем расширить технологию JSP с помощью создания собственных тегов для избегания использования скриптлетов и java кода на JSP страницах. |