Ю.В. Леонова

Использование JSP шаблонов для инкапсуляции компоновки Web-страниц


Аннотация Так как компоновка подвергается многим изменениям в процессе разработки, важно инкапсулировать эту функциональность, чтобы её можно было изменять с минимальным влиянием на остальное приложение. В докладе рассматривается эффективная схема проектирования интерактивных сайтов с использованием JSP шаблонов. Механизм шаблонов для JSP позволяет инкапсулировать компоновку, благодаря перемещению процесса обработки в JavaBeans. Это способствует повторному использованию исходных текстов, определяет архитектуру приложений и позволяет легко расширять их. Одно из его наибольших плюсов -- позволяет разделять представление от логики и рассматривать их раздельно, без влияния одного на другое.

Введение

Несмотря на относительно недавнее появление, технология JavaServer Pages (JSP) идет к тому, чтобы стать лидирующей Java технологией создания приложений для обработки динамического Web-содержания. Самое большое преимущество использования JSP состоит в том, что эта технология помогает эффективно отделить представление от содержания.

JSP технология дает много возможностей для легкой и быстрой разработки Web приложений. Идея заключается в том, чтобы код JSP как можно больше был похож на HTML, благодаря перемещению процесса обработки в JavaBeans. Выгода такого подхода в том, что программист HTML и дизайнер графики могут вести разработку представления, используя любой HTML редактор, пока программист на Java будет программировать логику приложения. Кроме того, этот подход облегчает создание Web приложения, меняющего свой внешний вид и логику в зависимости от ситуации.

В двух словах, файл JSP - это HTML (или XML) с включением любых комбинаций следующих элементов:

  • Java-скриптлеты (scriptlets) - в HTML можно внедрять любые правильные инструкции Java
  • JSP-теги для управления и организации запросов к JavaBeans
  • JSP-теги для включения и перенаправления запросов другим страницам JSP
  • Определяемые пользователем теги

Разработчик страницы имеет возможность использовать весь арсенал средств 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-кода вообще, либо использующего его в минимальном количестве.

 

Библиотеки тегов


Рис. 1. Архитектура библиотеки тегов

Библиотека тегов – это набор заказных связанных тегов. Библиотека тегов состоит из 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 код генерирует страницу:

Рис. 2. Генерируемая страница

Структура 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> используется для получения текущей даты.

Таким образом, рассмотренные библиотеки тегов обеспечивают простое управление и универсальную подмену значений аттрибутов, что позволяет уменьшить сложность исходного кода и увеличивает функциональность. Мы получаем что-то наподобие стандартной и универсальной системы для представления данных и доступа к ним. С использованием заказных тегов можно реализовать любые шаблоны, что позволяет инкапсулировать компоновку и минимизировать усилия по ее изменению.

Литература

  1. JavaWorld. // www.javaworld.com.
  2. Tag Libraries Tutorial. // Sun Microsystems, 2000.
  3. Marty Hall. Creating Custom JSP Tag Libraries. // Core Servlets and Java Server Pages. Prentice Hall, 2000.
  4. Eduardo Pelegri-Llopart. Java Server Pages Specification. // Sun Microsystems, 1999.
  5. Building Web Components. // Forte for Java, Internet Edition, 2.0. Sun Microsystems, 2000.