Оболочки для Java Server Pages

Однако при разработке реальных веб-приложений при помощи JSP, разработчики столкнулись с необходимостью создания огромного числа компонентов, которые обеспечивали ту функциональность, которая есть как в PHP, так и на многих других веб-платформах. Это и обусловило падение интереса к этой технологии, который возродился только после появления так называемых «оболочек» (frameworks) и библиотеки тэгов (tag library), которые предоставляли программисту нужный функционал и соответствующий им расширенный синтаксис.

Нужно сказать, что «оболочки» не всегда являются необходимостью и не всегда приводят к ускорению работы, наоборот, вводя дополнительный уровень абстракции, они могут усложнить работу и даже свести на нет тот колоссальный выигрыш в скорости, который демонстрирует JSP. В этом случае положение программистов на Java несколько лучше, чем программистов на PHP. В распоряжении последних исключительно такие оболочки, которые нельзя, или очень сложно скомбинировать. В JSP же существует огромное количество разных оболочек, предоставляющих разный функционал, имеющие свои преимущественные сферы применения и способные комбинироваться с другими. Так, еще в 2007 году была разработана методика объединения Struts с другой оболочкой – Spring – при помощи несложных решений [15] . Аналогичная методика существует и для Hibernate [16]. Все они уже реализованы как специальные плагины, которые можно установить едва ли не проще, чем скопировать файл. Подобной модульностью вряд ли могут похвастать существующие движки PHP, для которых давно составляются списки конфликтующих комбинаций плагинов.

Все существующие расширения для Java Server Pages делятся на два огромных класса, о которых мы упоминали выше. Это оболочки и библиотеки тэгов. Первые добавляют архитектурные свойства (например, сопоставляют разным типам задач разные JSP-страницы или компоненты). Вторые расширяют синтаксис специальным функционалом.

Так, например, «классические» JSP-страницы не имеют возможности создавать ветвления. Их необходимо было инкапсулировать в классы-сервлеты, или пользоваться возможностью динамического назначения «слоям» (div) в HTML внешних файлов. Подключив JSTL, условные блоки можно создавать непосредственно на самой странице [17]. Также, можно создавать циклы, сложные ветвления и другие конструкции, которые ранее были присущи только полноценным языкам программирования. Поскольку JSTL – это «библиотека тэгов», она просто назначает соответствующие этим элементам тэги, и их можно использовать прямо в теле документа.

Так, представим себе, что есть необходимость проверять страну происхождения пользователя и выдавать ему приветствие на родном языке.

<c:choose>

<c:when test=${user.country == “Ukraine”}>

<p>Вітаємо вас!</p>

</c:when>

<c:when test=${user.country == “Russia”}>

<p>Приветствуем вас!</p>

</c:when>

<c:when test=${user.country == “Japan”}>

<p>Ohayo gozaimasu!</p>

</c:when>

</c:choose>

Листинг 2. Использование тэгов JSTL

Как видим, применение расширенных библиотечных тэгов в JSP почти ничем не отличается от обыкновенного веб-программирования.

Сложнее с оболочками. Чаще всего они представляют собой какой-то один, отдельно взятый паттерн программирования или модель. Например, Struts реализует модель MVC (Model-View-Controller), разделяя представление, механизм выполнения задачи и модуль управления, отвечающий за взаимодействие между механизмом и представлением.

Рис. 2. Диаграмма, иллюстрирующая модель Struts

Чтобы понять назначение этой оболочки, достаточно взглянуть на диаграмму. Существует три класса компонентов – контроллер, отвечающий за обработку пользовательских запросов, модель, реализующая некий алгоритм или предоставляющий интерфейс для решения каких-то задач, и представление, генерирующее веб-страницу. Разумеется, в форме контроллера и модели выступают сервлеты, а в виде представления – JSP. Кроме того, каждому действию пользователя также могут быть назначены отдельные jsp-страницы при помощи особого XML-файла. Так, если необходимо создать систему авторизации, то приблизительная схема соответствующей структуры сайта будет иметь вид, как на листинге 3.

<action name="Login" class="site.Login">

<result>/MyAccount.jsp</result>

<result name="input">/Login.jsp</result>

</action>

<action name="Registration" >

<result>/Registration.jsp</result>

</action>

<action name="Register" class="site.Register">

<result>/RegistrationSuccess.jsp</result>

<result name="input">/Registration.jsp</result>

</action>

Листинг 3. Структура сайта с применением Struts

Аналогично, оболочка Hibernate предоставляет интерфейс для прямой работы с базами данных [17].

Spring вообще представляет собой даже не оболочку, а коллекцию оболочек на любой случай жизни [18]. В нем есть компоненты авторизации и аутентификации, обеспечения работы с транзакциями, удаленного управления, доступа к данным, модульное и интеграционное тестирование, и даже аспект-ориентированное программирование (которое, вообще-то, не может быть реализовано в веб-приложениях без преодоления трудностей).

Все это делает JSP необыкновенно мощным инструментом, которым можно пользоваться как швейцарским ножом. При необходимости с его помощью создать личную страничку, а можно – мощнейшее веб-приложение, для которого попросту нет невозможной задачи.