Ю.В. Леонова
Использование JSP шаблонов для инкапсуляции компоновки Web-страниц
Введение
Несмотря на относительно недавнее появление, технология JavaServer Pages (JSP) идет к тому, чтобы стать лидирующей Java технологией создания приложений для обработки динамического Web-содержания. Самое большое преимущество использования JSP состоит в том, что эта технология помогает эффективно отделить представление от содержания.
JSP технология дает много возможностей для легкой и быстрой разработки Web приложений. Идея заключается в том, чтобы код JSP как можно больше был похож на HTML, благодаря перемещению процесса обработки в JavaBeans. Выгода такого подхода в том, что программист HTML и дизайнер графики могут вести разработку представления, используя любой HTML редактор, пока
программист на Java будет программировать логику приложения. Кроме того, этот подход облегчает создание Web приложения, меняющего свой внешний вид и логику в зависимости от ситуации.В двух словах, файл JSP - это HTML (или XML) с включением любых комбинаций следующих элементов:
Разработчик страницы имеет возможность использовать весь арсенал средств Java внутри файла страницы, сочетая скриптлеты, HTML и специальные теги JSP. Его потенциал ограничен только границами платформы Java. Однако, если вы используете эти возможности бессистемно, ваш JSP код может быстро стать мешаниной HTML тэгов, JSP тэгов, и кода Java, трудным для понимания, отладки, и поддержки. Так как компоновка жестко задана в коде, изменение компоновки требует модификации страницы. Если на Web-сервере много страниц с одинаковым форматом, то даже простые изменения компоновки требуют модификации всех таких страниц. Это ограничивает возможность формирования инкапсулированных объектов, используемых для генерации содержания.
Механизм шаблонов для JSP позволяет инкапсулировать и повторно использовать компоновку. Таким образом, и компоновку и содержание можно менять без модификации файлов, которые их используют.
JSP как шаблонный механизм
Появление спецификации JSP 1.1 (выпущенной в начале 2000 года) предоставило мощную возможность расширения системы тегов разметки (tag extension), которая позволяет определять пользовательские теги и связывать их с классами Java. Используя дополнительные теги, можно перемещать скриптлеты в классы-обработчики этих тегов. Можно также использовать JSP в качестве шаблонного механизма, разрабатывая наборы тегов, обработчики которых содержат весь код Java, который иначе пришлось бы включать в страницы JSP. Хотя это не устраняет возможность использования большого количества скриптлетов на странице, это почти избавляет от подобной потребности.
Многие производители серверов приложений поставляют обширные библиотеки дополнительных тегов вместе с их серверами (BEA WebLogic, Allaire JRUN). Производители также создают средства разработки, поддерживающие JSP. JSP имеет механизмы динамического и статического включения, которые позволяют создавать вложенные шаблоны и поддерживать многократное использование. JSP также предоставляет обработчикам тегов доступ к механизму динамического включения через объект PageContext, доступный всем обработчикам. Используя библиотеки тегов и механизм включения, можно формировать интерактивные сайты с большим объемом динамического содержания на базе JSP-страниц, не содержащих Java-кода вообще, либо использующего его в минимальном количестве.
Библиотеки тегов
|
Библиотека тегов – это набор заказных связанных тегов. Библиотека тегов состоит из Tag Library Descriptor (TLD), который является XML документом, описывающим теги библиотеки, и handler, который реализует функциональность библиотеки тегов. Tag handler – это bean, который реализует функциональность отдельного тега. TLD описывает для каждого тега реализующий его Tag handler.
Пример JSP выглядит так
:<%@taglib uri="jdbc.tld" prefix="jLib" %> <%@taglib uri="html.tld" prefix="hLib" %> <%@taglib uri="utility.tld" prefix="uLib" %> <html> <jsp static-encoding='false'/> <%@ page contentType='text/html; charset=Windows-1251' %> <%@ include file = "header.jsp" %> <P> <H2 align=center>Информационные серверы</H2> <UL> <LI><hLib:url uri="nsc-www.jsp#ins" title="WWW cерверы институтов"/> <LI><hLib:url uri="http://www-sbras.nsc.ru/~juli/institute.phtml" title="Список институтов СО РАН"/> <LI><hLib:url uri="nsc-www.jsp#sp" title="Специализированные WWW серверы"/></UL><IMG src="NSC Net.files/raduga.gif" width="100%"> <%-- open a database connection --%> <jLib:connection id="conn1" > <jLib:dburl>jdbc:mysql:/localhost/juli</jLib:dburl> <jLib:driver>org.gjt.mm.mysql.Driver</jLib:driver> <jLib:userid>Admin</jLib:userid> <jLib:password>rjdemo</jLib:password> </jLib:connection> <P><A name=ins><B>WWW серверы институтов</B></A> <br> <DL> <DT><hLib:url uri="http://www-sbras.nsc.ru/" title="Сибирское отделение РАН"/> <DT><hLib:url uri="http://www.nsc.ru/" title="Центр управления сети ННЦ"/><br> <%-- open a database query --%> <jLib:statement id="stmt1" connection="conn1"> <jLib:query> SELECT inst_logo, institute FROM NSC_Net where category = '0' </jLib:query> <%-- loop through the rows of your query --%> <jLib:resultSet id="res1"> <jLib:getValue id="newbean" position="1"/> <jLib:getColumn position="2"/> <table width="100%"> <COLGROUP> <COL width="10%"> <COL width="90%"> </COLGROUP> <TBODY> <jLib:statement id="stmt2" connection="conn1"> <jLib:query> SELECT institute, www, resource_r FROM NSC_Net where head = '<%= newbean %>' </jLib:query> <jLib:resultSet id="res2"> <TR ALIGN="LEFT"> <TD></TD> <TD ALIGN="LEFT"> <jLib:getValue id="newbean1" position="3"/> <uLib:if> <uLib:condition> <%= newbean1 != null %> </uLib:condition> <uLib:then> <%= newbean1 %> </uLib:then> <uLib:else> <jLib:getValue id="www" position="1"/> <jLib:getValue id="res" position="2"/> <hLib:url uri="<%= res%>" title="<%= www%>"/> </uLib:else> </uLib:if> </TD> </TR> </jLib:resultSet> </jLib:statement> </TBODY> </table> </jLib:resultSet> </jLib:statement> <%-- close a database connection --%> <jLib:closeConnection conn="conn1"/> </body> <%@ include file = "footer.jsp" %> </html>
Этот JSP код генерирует страницу:
|
Структура JSP страницы на рис. 2 следующая:
Страница содержит заголовок, подвал и главный раздел.
Рис. 3. Структура JSP-страницы
В примере JSP-директива <% include %> вставляет содержимое файла в JSP во время компиляции. Текст становится частью JSP страницы. Это позволяет изменять содержание страницы, изменяя только включаемые файлы без модификации самой страницы.
Компоновка страницы реализована библиотеками тегов JDBC, HTML и UTILITY.
Библиотека тегов JDBC содержит теги для работы с реляционной базой данных, обращения к которой осуществляются средствами языка SQL. Связь с базами данных производится посредством jdbc (Java DataBase Connectivity). Такой способ является оптимальным, так как все современные производители баз данных обеспечивают пользователей jdbc драйверами.
Эта библиотека тегов была реализована с помощью набора заказных тегов connection, driver, userid, password, dburl, statement, query, execute, resultSet, getColumn, getValue и closeConnection.
Тег-контейнер (супер-тег) <connection> устанавливает соединение с базой данных и используется в сочетании с тегами <driver>, <dburl>, <userid>, <password>, которые определяют соответственно драйвер JDBC, url базы данных, логин пользователя и пароль.
Тег-контейнер <statement> выполняет SQL-запрос к базе данных, содержащийся в теле тега <query>, и затем выполняет либо <execute> для вставки, обновления или удаления данных, либо вызывает тег <resultSet>, который реализует итерации по результатам выборки. Для получения содержимого полей используются теги <getColumn> и <getValue>. Тег <getColumn> выводит содержимое поля в JSP, а <getValue> присваивает содержимое поля переменной, определенной в атрибуте id.
<closeConnection> закрывает соединение с базой данных.
Библиотека тегов HTML содержит теги позволяющие использовать HTML элементы и элементы форм. Используя эту библиотеку, можно легко заполнять выбранными ранее пользователем значениями элементы формы или значениями по умолчанию, если пользователь заполняет форму впервые. Эта библиотека содержит следующие заказные теги: url, email, lastModified, text, password, textarea, radio, checkbox, select.
Тег <url> используется для расположения url-ссылки.
Тег <email> используется для расположения url-адреса электронной почты.
Тег <lastModified> используется для получения времени последней модификации документа.
Теги <text>, <password>, <textarea>, <radio>, <checkbox> , <select> используются для создания интерфейсных элементов ввода внутри команды FORM.
Тег <text> используется для расположения однострокового поля ввода.
Тег <password> используется для расположения поля ввода пароля.
Тег <textarea> используется для расположения многострокового поля ввода.
Тег <radio> используется для расположения radio-кнопки.
Тег <checkbox> используется для расположения кнопки checkbox.
Тег <select> используется для представления списка выбора.
Библиотека тегов UTILITY содержит теги: if, condition, then, else, size, Date.
Тег-контейнер <if> проверяет истинность выражения содержащегося в теле тега <condition>. В случае если true (верно) обрабатывается тело тега <then>, иначе - <else>.
Тег <size> используется для получения размера файла в байтах.
Тег <Date> используется для получения текущей даты.
Таким образом, рассмотренные библиотеки тегов обеспечивают простое управление и универсальную подмену значений аттрибутов, что позволяет уменьшить сложность исходного кода и увеличивает функциональность. Мы получаем что-то наподобие стандартной и универсальной системы для представления данных и доступа к ним. С использованием заказных тегов можно реализовать любые шаблоны, что позволяет инкапсулировать компоновку и минимизировать усилия по ее изменению.
Литература