В.В. Кулямин - Технологии программирования. Компонентный подход (1134162), страница 72
Текст из файла (страница 72)
Страницы JSP являются упрощеннымпредставлением сервлетов, основанным на описании генерируемого в качестве ответа HTMLдокумента при помощи смеси из его постоянных элементов и кода на Java, генерирующего егоизменяемые части. При развертывании Web-приложения содержащиеся в нем страницы JSPтранслируются в сервлеты и далее работают в таком виде. Описание генерируемых документов насмеси из HTML и Java делает страницы JSP более удобными для разработки и значительно менееобъемными, чем получаемый из них и эквивалентный по функциональности класс-сервлет.СервлетыИнтерфейс Java-сервлетов определяется набором классов и интерфейсов, входящих в составпакетов javax.servlet и javax.servlet.http, являющихся частью J2EE SDK. Первый пакетсодержит классы, описывающие независимые от протокола сервлеты, второй — сервлеты,работающие с помощью протокола HTTP.Основные классы и интерфейсы пакета javax.servlet.http следующие.•HttpServletПредназначен для реализации сервлетов, работающих с HTTP-сообщениями.
Содержитзащищенные методы, обрабатывающие отдельные методы HTTP-запросов, из которыхнаиболее важны void doGet(HttpServletRequest, HttpServletResponse),определяющий обработку GET-запросов, и void doPost(HttpServletRequest,HttpServletResponse), обрабатывающий POST-запросы. В обоих методах первый параметрсодержит всю информацию о запросе, а второй — о генерируемом ответе.•HttpServletRequest и HttpServletResponse — интерфейсы, содержащие методы дляполучения и установки (второй) заголовков и других атрибутов HTTP-запросов и ответов.Второй интерфейс также содержит метод, возвращающий поток вывода для построениясодержимого ответа.•CookieКласс, представляющий закладки сервера, которые хранятся на клиентской машине длязапоминания информации о данном пользователе.•HTTPSessionИнтерфейс, предоставляющий методы для управления сеансом обмена HTTPсообщениями.
Информация о сеансе используется в том случае, если она должна бытьдоступна нескольким сервлетам.При развертывании J2EE приложения, помимо самих классов сервлетов, надо создать ихдескриптор развертывания, который оформляется в виде XML-файла web.xml.Web-приложение поставляется в виде архива .war, содержащего все его файлы. На самом делеэто zip-архив, расширение .war нужно для того, чтобы Web-контейнер узнавал архивыразвертываемых на нем Web-приложений. Содержащаяся в этом архиве структура директорийWeb-приложения должна включать директорию WEB-INF, вложенную непосредственно вкорневую директорию приложения. Директория WEB-INF содержит две поддиректории — classesдля .class-файлов сервлетов, классов и интерфейсов EJB-компонентов и других Java-классов, и lib261для .jar и .zip файлов, содержащих используемые библиотеки.
Файл web.xml также долженнаходится непосредственно в директории WEB_INF.Заголовок дескриптора развертывания сервлета выглядит так.<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc...ВЕВ Web Application 2.2.. EN"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd>Содержимое дескриптора развертывания помещается внутри тега <web-app>. В немуказывается список сервлетов, входящих в приложение и отображение сервлетов в URL, запросык которым они обрабатывают. Один сервлет описывается в следующем виде.<servlet><servlet-name>ServletName</servlet-name><servlet-class>com.company.deprtment.app.ServletClassName</servlet-class><description>…</description><init-param><param-name>ParameterName</param-name><param-value>ParameterValue</param-value><description>…</description></init-param></servlet>Значения параметров инициализации сервлета можно получить с помощью методов StringgetInitParameter(String) и Enumeration getInitParametersNames() связанного с сервлетомобъекта класса ServletContext.Отображение сервлета на URL описывается так.<servlet-mapping><servlet-name>ServletName</servlet-name><url-pattern>URL</url-pattern></servlet-mapping>Серверные страницы JavaСерверные страницы Java [7,8] представляют собой компоненты, разрабатываемые на смеси изHTML и Java и предназначенные для динамического создания HTML-документов, содержащихрезультаты обработки запросов пользователя.
Таким образом, JSP обычно играют рольпредставления в образце «данные-представление-обработчик», принятом за основу архитектурыприложений J2EE. Результатом работы JSP является HTML-страничка, а вставки Java кода служатдля построения некоторых ее элементов на основе результатов работы приложения.При работе Web-приложения JSP компилируются в сервлеты специального вида. При этомосновное содержание страницы JSP превращается в метод doGet(), в котором HTML-элементызаписываются в поток содержимого ответа в неизменном виде, а элементы Java-кодапреобразуются в код, записывающий некоторые данные в тот же поток на основании параметровзапроса или данных приложения.Для развертывания JSP-страниц необходимо их описание в дескрипторе развертыванияприложения web.xml, которое устроено так же, как описание сервлетов. Сами JSP-страницыпомещаются, вместе с HTML-файлами и другими файлами, используемыми приложением вкорневую директорию этого приложения или ее поддиректории.Основные интерфейсы и базовые классы JSP-страниц и их отдельных элементов находятся вовходящих в J2EE SDK пакетах javax.servlet.jsp, javax.servlet.jsp.el,javax.servlet.jsp.tagext.Элементами JSP-страниц могут быть обычные теги HTML, а также специальные элементы JSP— директивы, теги или действия (tags, actions) и скриптовые элементы.JSP-директивы описывают свойства страницы в целом и служат для передачи информациимеханизму управления JSP-страницами.Директивы имеют следующий общий синтаксис.262<%@ directive attribute1="value1" ...
attributeN="valueN" %>.Основные директивы JSP следующие.• Директива page предоставляют общую информацию о данной странице и статическивключаемых в нее файлах. Такая директива на странице может быть только одна. Онаможет иметь следующие атрибуты.o import = "имена включаемых классов и пакетов через запятую"Порождает соответствующую Java-директиву import в сгенерированном коде сервлета.o contentType = "MIME-тип[;charset=таблица символов]"Задает тип MIME для генерируемого документа.
По умолчанию используетсяtext/html. Эквивалентен скриплету<% response.setContentType(MIME-тип); %> (см. далее).o isThreadSafe = "true|false"Значение true позволяет использовать один экземпляр сервлета, полученного изстранички, для обработки множественных запросов. При этом необходимосинхронизовать доступ к данным этого сервлета.o session = "true|false"Значение true предписывает привязать сервлет к имеющейся HTTP-сессии, значениеfalse говорит, что сессии использоваться не будут и обращение к переменной sessionприведет к ошибке.o autoFlush = "true|false"Определяет необходимость сбрасывать буфер вывода при заполнении.o buffer = "размер в KB|none"Задает размер буфера для выходного потока сервлета.o extends = "наследуемый класс"Определяет класс, наследуемый сгенерированным из данной JSP сервлетом.o errorPage = "url странички с информацией об ошибках"Определяет страницу, которая используется для обработки исключений, необрабатываемых в рамках данной.o isErrorPage = "true|false"Допускает или запрещает использование данной страницы в качестве страницыобработки ошибок.o language = "java"Определяет язык программирования, применяемый в скриптовых элементах даннойстраницы.
Пока есть возможность использовать только Java. Впоследствиипредполагается (аналогично .NET) разрешить использование других языков, кодкоторых будет также транслироваться в байт-код, интерпретируемый JVM.• Директива include обеспечивает статическое (в ходе трансляции JSP в сервлет) включениев страничку внешнего документа. Она имеет атрибут file, значением которого должнабыть строка, задающая URL включаемого файла.• Директива taglib указывает используемую в данной странице библиотекупользовательских тегов.
Она имеет два атрибута — uri, значением которого является URIбиблиотеки, и prefix, определяющий префикс тегов из данной библиотеки. Префиксупотребляется в дальнейшем с тегами только данной библиотеки. Он не может бытьпустым и не должен совпадать с одним из зарезервированных префиксов jsp, jspx, java,javax, servlet, sun, sunw.Теги или действия определяют основные действия, выполняемые при обработке данных ипостроении результирующего документа.Теги могут быть стандартными, использование которых возможно в любой странице бездополнительных объявлений, или пользовательскими, которые могут употребляться, только если263предварительно с помощью директивы taglib была подключена содержащая их библиотека.Любой тег имеет следующий синтаксис.<tagprefix:tag attribute1="value1" … attributeN="valueN" />Теги могут содержать вложенные теги, такие как jsp:param, jsp:attribute.
В этом случаеони выглядят следующим образом.<tagprefix:tag attribute1="value1" … attributeN="valueN">… (вложенные теги)</tagprefix:tag>Стандартные теги имеют префикс jsp, а префикс пользовательских тегов определяется вдирективе taglib, подключающей содержащую их библиотеку.Имеется довольно много стандартных тегов. Основные из них следующие.•jsp:includeОпределяет динамическое включение некоторой страницы или файла в данную страницупри обработке запроса. С помощью вложенных тегов jsp:param может указывать один илинесколько пар параметр-значение в качестве параметров включаемой страницы.Имеет атрибуты page, определяющий URL включаемой страницы, и flush, имеющийзначения true или false в зависимости от того, нужно ли сразу после включения сброситьбуфер выходного потока в генерируемом ответе или нет.•jsp:useBeanОпределяет используемый объект или компонент.
Фактически такой тег эквивалентендекларации переменной определенного типа, инициализируемой определенным объектом идоступной в рамках некоторого контекста.Имеет следующие атрибуты.o id = "имя объекта"Задает имя объекта, которое будет использоваться в коде JSP. Должно быть уникально впределах страницы.o class = "класс объекта"Задает класс этого объекта.o scope = "page|request|session|application"Задает область видимости декларируемого объекта.o type = "тип используемой ссылки на объект"Указанный тип должен быть предком класса объекта. Это тип декларируемойпеременной, а класс объекта определяет истинный тип объекта, хранящегося в ней.••jsp:setProperty, jsp:getPropertyУстанавливает или получает значение свойства объекта.Атрибут name определяет имя объекта, чье свойство используется, а атрибут property —имя свойства.Тег jsp:getProperty записывает полученное значение свойства в результирующийдокумент в виде строки (результата вызова toString() для этого значения).Тег jsp:setProperty имеет также дополнительный атрибут — либо value, значениекоторого присваивается свойству, либо param, который указывает имя параметра запроса,значение которого записывается в свойство.