` обеспечивает более совершенное включение динамических ресурсов, т.к. получает доступ к источнику, чтение информации из которого происходит непосредственно без буферизации и контент включается в исходную JSP построчно.
[к оглавлению](#servlets-jsp-jstl)
## Как можно расширить функциональность JSP?
## Что вы знаете о написании пользовательских JSP тегов?
## Приведите пример использования собственных тегов.
JSP можно расширить с помощью создания собственных тегов с необходимой функциональностью, которые можно добавить в библиотеку тегов на страницу JSP указав необходимое пространство имен.
> /WEB-INF/exampleTag.tld
```xml
1.0
example
/WEB-INF/exampleTag
exampleTag
xyz.company.ExampleTag
empty
The example tag displays Hello World!
```
> xyz.company.ExampleServlet.java
```java
package xyz.company;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class ExampleTag extends TagSupport{
private static final long serialVersionUID = 1L;
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello World!");
} catch(IOException ioException) {
throw new JspException("Error: " + ioException.getMessage());
}
return SKIP_BODY;
}
}
```
> exampleTag.jsp
```
<%@ taglib uri="/WEB-INF/exampleTag.tld" prefix="example"%>
<%@ page session="false" pageEncoding="UTF-8"%>
Example Tag
Example Tag
```
Также в пользовательских тегах существует возможность задать входные параметры. Например, существует необходимость отформатировать каким-либо стилем очень длинное число. Для этого можно использовать собственный тег по типу:
``
Используя входные параметры, число должно быть преобразовано на JSP странице в таком виде `123,456.79` согласно шаблону. Т.к. JSTL не предоставляет такой функциональности, необходимо создать пользовательский тег для получения необходимого результата.
[к оглавлению](#servlets-jsp-jstl)
## Как сделать перенос строки в HTML средствами JSP?
Для переноса строки можно использовать тег `c:out` и атрибут `escapeXml`, который отключает обработку HTML элементов. В этом случае браузер получит следующий код в виде строки и обработает элемент `
` как требуется:
``
[к оглавлению](#servlets-jsp-jstl)
## Почему не нужно конфигурировать стандартные JSP теги в `web.xml`?
Стандартные теги JSP не конфигурируются в `web.xml`, потому что tld файлы уже находятся внутри каталога `/META-INF/` в jar файлах JSTL.
Когда контейнер загружает веб-приложение и находит tld файлы в в jar файле в директории `/META-INF/`, то он автоматически настраивает их для непосредственного использования на JSP страницах. Остается только задать пространство имен на JSP странице.
[к оглавлению](#servlets-jsp-jstl)
## Как можно обработать ошибки JSP страниц?
Для обработки исключений выброшенных на JSP странице достаточно лишь задать страницу ошибки JSP и при её создании установить значение _page directive attribute_ `isErrorPage` в значение `true`. Таким образом будет предоставлен доступ к неявным объектам исключений в JSP и появится возможность передавать собственные, более информативные сообщения об ошибках клиенту. При этом настройка дескриптора развертывания выглядит так:
```xml
404
/error.jsp
java.lang.Throwable
/error.jsp
```
[к оглавлению](#servlets-jsp-jstl)
## Как происходит обработка ошибок с помощью JSTL?
Для перехвата и обработки исключений в служебных методах класса служат JSTL Core Tags `c:catch` и `c:if`.
> Тег `c:catch` перехватывает исключение и обертывает его в переменную `exception`, доступную для обработки в теге `c:if`:
```
<% int x = 42/0;%>
Exception is : ${exception}
Exception Message: ${exception.message}
```
Обратите внимание что используется язык выражений JSP EL в теге `c:if`.
[к оглавлению](#servlets-jsp-jstl)
## Как конфигурируется JSP в дескрипторе развертывания.
Для настройки различных параметров JSP страниц используется элемент `jsp-config`, который отвечает за:
+ управление элементами скриптлетов на странице;
+ управления выполнением в языке выражений;
+ определение шаблона URL для encoding;
+ определение размера буфера, который используется для объектов на странице;
+ обозначение групп ресурсов, соответствующих шаблону URL, которые должны быть обработаны как XML документ.
```xml
http://company.xyz/jsp/tlds/customtags
/WEB-INF/exampleTag.tld
```
[к оглавлению](#servlets-jsp-jstl)
## Можно ли использовать Javascript на JSP странице?
Да, это возможно. Несмотря на то, что JSP это серверная технология, на выходе она всё равно создает `HTML` страницу, на которую можно добавлять Javascript и CSS.
[к оглавлению](#servlets-jsp-jstl)
## Всегда ли создается объект сессии на JSP странице, можно ли отключить его создание?
Jsp-страница, по умолчанию, всегда создает сессию. Используя директиву `page` с атрибутом `session` можно изменить это поведение:
`<%@ page session ="false" %>`
[к оглавлению](#servlets-jsp-jstl)
## Какая разница между `JSPWriter` и сервлетным `PrintWriter`?
`PrintWriter` является объектом отвечающим за запись содержания ответа на запрос. `JspWriter` использует объект `PrintWriter` для буферизации. Когда буфер заполняется или сбрасывается, `JspWriter` использует объект `PrintWriter` для записи содержания в ответ.
[к оглавлению](#servlets-jsp-jstl)
## Опишите общие практические принципы работы с JSP.
Хорошей практикой работы с технологией JSP является соблюдение следующих правил:
+ Следует избегать использования элементов скриптлетов на странице. Если элементы _action_, _JSTL_, _JSP EL_ не удовлетворяют потребностям, то желательно написать собственный тег.
+ Рекомендуется использовать разные виды комментариев: так JSP комментарии необходимы для уровня кода и отладки, т.к. они не будут показаны клиенту.
+ Не стоит размещать какой-либо бизнес логики внутри JSP страницы. Страницы должны использоваться только для создания ответов клиенту.
+ Для повышения производительности лучше отключать создание сессии на странице, когда это не требуется.
+ Директивы `taglib`, `page` в начале JSP страницы улучшают читабельность кода.
+ Следует правильно использовать директиву `include` и элемент `jsp:include action`. Первая используется для статических ресурсов, а второй для динамических ресурсов времени выполнения.
+ Обработку исключений нужно производить с помощью страниц ошибок. Это помогает избегать запуска специальных служебных методов и может повысить производительность.
+ Использующиеся CSS и JavaScript должны быть разнесены в разные файлы и подключаться в начале страницы.
+ В большинстве случаев JSTL должно хватать для всех нужд. Если это не так, то в начале следует проанализировать логику своего приложения, и попробовать перенести выполнения кода в сервлет, а далее с помощью установки атрибутов использовать на JSP странице только результат.
# Источники
+ [javastudy.ru](http://javastudy.ru/interview/jee-servlet-api-questions/)
+ [java2ee.ru](http://www.java2ee.ru/servlets/)
+ [Java-online](http://java-online.ru/jsp-questions.xhtml)
+ [Codenet](http://www.codenet.ru/webmast/java/jsp.php)
+ [JavaTalks Articles](https://articles.javatalks.ru/articles/24)
[Вопросы для собеседования](README.md)