
Копия Java_24.ppt
- Количество слайдов: 29
Сетевое программирование и Веб-приложения Технология Java Server Pages (JSP)
Технология Java Server Pages (JSP) является составной частью единой технологии создания бизнес-приложений J 2 EE. JSP - это альтернативная методика разработки приложений, динамически генерирующих ответ на те или иные запросы клиента. Прежде чем JSP документ будет использован, специальная процедура преобразует его в соответствующий сервлет. В свою очередь, сервлет, как правило, пишется на языке Java и реализует определенный интерфейс. Далее, сервлет также не является самостоятельным приложением и функционирует, только будучи помещен в соответствующий web-контейнер. Web-контейнер обеспечивает обмен данными между сервлетом и клиентами, берет на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
Роль сервлетов в JSP ¡ ¡ ¡ ¡ ¡ Важно отметить тот факт, что программный код, используемый для написания сервлетов, не всегда удобен для динамической генерации текстовых документов в ответ на запрос клиента. Например, фрагмент сервлета, где осуществляется генерация динамической HTML страницы, может выглядеть следующим образом: Print. Writer out = res. get. Writer(); out. println("<html>"); out. println("<body>"); . . . out. println("</body>"); out. println("</html>"); out. close(); Как видим, каждой строке HTML документа в сервлете соответствует определенный фрагмент программного кода, что не способствует простоте разработки и сопровождения бизнес-прило
JSP страница как шаблон Удобнее разделить динамическую и статическую части генерируемой web-страницы. Для создания динамической части по-прежнему будет использоваться Java или другой язык программирования. Статическую же часть имеет смысл оформить как текстовый документ - Java Server Page (JSP страницу), оформленную в соответствии с требованиями HTML, XML или другого стандарта разметки. Фактически, JSP страница можно рассматривать как шаблон или прообраз динамической страницы, которую остается дополнить динамическими элементами. Для описания динамической составляющей, в технологии JSP предусмотрено два основных механизма: компоненты Java. Bean и библиотеки дополнительных тэгов. Как результат, технология JSP предполагает параллельную работу над приложением двух разных специалистов: программиста и ответственного за верстку документов (web мастера), которые отвечают, соответственно, за разработку динамической и статической частей документов, генерируемых в ответ на запросы клиентов.
JSP страница как шаблон Перед тем, как использовать JSP страницу, ее необходимо преобразовать в соответствующий сервлет. Такое преобразование может выполняться либо в момент, когда JSP страница помещается на сервер, либо когда клиент первый раз обращается к этой странице. Поскольку процедура преобразования довольно трудоемка и занимает много времени, то выполняется она обычно только один раз. Все же последующие обращения клиента к JSP странице сервер автоматически переадресует на сервлет, который был получен в результате ее преобразования. Сервлет, полученный после преобразования JSP страницы, функционируют в рамках стандартного контейнера сервлетов и используют строго регламентированный интерфейс. Поэтому эта технология не зависит от каких-либо особенностей той или иной аппаратной платформы. С другой стороны, поскольку JSP технологии может строиться на базе интерпретируемого языка Java, то это дает гарантию портируемости приложений, построенных на технологии JSP, на любую платформу, где можно установить виртуальную Java машину.
Динамическая составляющая JSP страницы представлена тремя типами специальных элементов: директивами, action и скриптами. . Директивы Поскольку web контейнер, прежде чем использовать JSP страницу, предоставленную разработчиками бизнес-приложения, транслирует ее в соответствующий сервлет, имеет смысл предоставить возможность оставлять на JSP странице директивы, которые будут управлять процессом трансляции. Директивы имеют синтаксис <%@ директива. . . %>. Директива page. Декларирует ряд свойств JSP страницы. Синтаксис директивы: <%@ page список_параметров %>
Параметры директивы Page import - Как уже говорилось, JSP страница перед использованием должна быть преобразована в программный код - класс, соответствующего сервлета. В свою очередь, класс сервлета может обращаться к другим классам из стандартных библиотек Java или классам из других пакетов. По умолчанию, класс сервлета, получаемый после трансляции JSP страницы, может иметь связь с пакетами java. lang, java. servlet. jsp и java. servlet. http. Если для класса сервлета требуется обеспечить связь с другими пакетами, например, с xbcat. util JSP страницу следует дополнить директивой page, имеющей атрибут import с названием соответствующего пакета.
Параметры директивы Page session - Если для связи с клиентом используется протокол HTTP, то для каждого сеанса по умолчанию создается объект session, позволяющий сохранять информацию об этом клиенте в интервале между его обращениями к серверу. С другой стороны, если атрибут session был указан со значением false, это позволяет отказаться от создания объекта сессии и использовать освободившиеся ресурсы сервера для решения других задач. buffer - Содержимое страницы, созданной в ответ на запрос клиента, сервлет передает в поток вывода out, откуда оно затем передается web контейнером непосредственно клиенту. Чтобы получить более оптимальный режим передачи, в этом потоке предусмотрен режим буферизации. При этом объем буфера по умолчанию составляет 8 килобайт. Параметр buffer директивы page позволяет либо задать другой объем буфера, либо вообще отказаться от режима буферизации, передав атрибуту значение "none".
Параметры директивы Page is. Thread. Safe - Согласно спецификации сервлетов, web контейнер по умолчанию позволяет одному и тому же экземпляру сервлета параллельно обрабатывать запросы сразу от нескольких клиентов. При этом каждому из запросов выделяется отдельный трэд. Между тем, в некоторых случаях бывает полезно запретить параллельную обработку запросов. (Соответствующий контроллер в web контейнере выстраивает приходящие запросы в очередь и передает их сервлету на обработку строго по одному. ) Для этого достаточно использовать атрибут is. Thread. Safe, со значением false.
Параметры директивы Page page. Encoding - Позволяет разработчику приложения декларировать кодировку, которая должна использоваться в документе, передаваемом клиенту. По умолчанию считается, что страница имеет кодировку ISO-8859 -1. content. Type - В ответ на запрос клиента, JSP страница по умолчанию генерирует документ типа HTML. Вместе с тем, область применения технологии Java Server Pages гораздо шире, поскольку она позволяет генерировать любые другие типы текстовых документов: XML, WML, VRML и т. д. MIME-тип генерируемого документа декларируется атрибутом content. Type. По умолчанию этот атрибут имеет значение "text/html". Вместе с типом документа, спецификация JSP позволяет в том же атрибуте указывать также кодировку генерируемого документа.
Параметры директивы Page Директива taglib. Позволяет использовать на JSP страницах дополнительные тэги, созданные разработчиком приложения (custom тэги). Синтаксис директивы: <%@ taglib uri="URI библиотеки тэгов" prefix="имя префикса" %> где, uri - абсолютный или относительный адрес URI, уникальным образом идентифицирующий дескриптор библиотеки тэгов, связанных с указанным префиксом. Указанный префикс используется для идентификации соответствующих custom тэгов. <%@ taglib uri="http: //www. mycorp/supertags" prefix="super" %>. . . <super: do. Magic>. . . </super: do. Magic> Директива include. Используется для помещения в JSP страницу текстов и программного кода из других источников. Подстановка выполняется в момент, трансляции JSP страницы в соответствующий сервлет. Пример использования директивы: <%@ include file="menu. jsp" %> Заметим, что подстановка материалов из внешнего источника может выполняться также с помощью специального тэга <jsp: include> Отличие данного тэга от описываемой директивы заключается в том, что подстановка осуществляется непосредственно в процессе обработки клиентского запроса, а потому может быть привязано к параметрам запроса.
Фрагмент программного кода на JSP странице (скрипт) Скрипт, как и остальные элементы, привносит в конечный документ динамическую составляющую. Однако, в отличие от них, скрипт программный код, помещенный непосредственно в текст JSP страницы. Скрипт может производить вычисления или манипулировать объектами, что позволяет наглядно связывать характеристики генерируемой страницы с параметрами запроса клиента и бизнес-правилами приложения. Элементы скриптов бывают трех типов: декларации, скриплеты и выражения. Декларации. После преобразования JSP страницы в сервлет большая часть ее содержимого попадает в метод _jsp. Service(), который вызывается всякий раз, когда появляется необходимость обработать заказ клиента. Декларация на JSP странице чаще всего используется для того, чтобы объявить дополнительные атрибуты и методы в классе сервлета, которые будут доступны при обработке любого запроса клиента. Декларации имеют синтаксис <%!. . . %>. Примеры деклараций на JSP странице: <%! int i; %> <%! int i = 0; %> <%! public String f(int i) {. . . } %>
Скриплеты Скриплет может содержать программный код и декларации локальных переменных, которые будут использованы для обработки запросов клиентов. Фактически, скриплет - это фрагмент программного кода из будущего сервлета, который в свое время будет помещен в метод _jsp. Service(). Являясь частью сервлета, скриплет получает доступ к объекту response и, соответственно, может самостоятельно формировать определенную часть конечной динамической страницы. Однако чаще всего скриплеты используются не для этого, а для того, чтобы управлять объектами бизнес-логики и логикой приложения. Скриплет имеет синтаксис <%. . . %>. Пример использования скриплетов в содержимом JSP страницы: <% if (i == 0) { %> Good morning <% } else { %> Good afternoon <% } %> Чтобы оценить наглядность и простоту этой конструкции, сравните ее с эквивалентным фрагментом программного кода в сервлете: if (i == 0) { out. println("Good morning"); } else { out. println("Good afternoon"); }
Выражения Часто страница, передаваемая клиенту, содержит результаты вычислений или обращений к тем или иным методам и атрибутам определенных классов. Любой из таких динамических элементов можно преобразовать в строку и представить на JSP странице с помощью вызова out. println в соответствующем скриплете: <% User. Profile user = (User. Profile) session. get. Value("Profile"); %> <% out. println(user. get. Fax. Number()); %> Вторую строку в приведенном примере удобнее и нагляднее представить в боле кратном виде, используя синтаксис выражения <%=. . . %>: <%= user. get. Fax. Number() %> Другой пример использования выражения в теле JSP страницы: <%! int i = 0; %> Hi, now the servlet processing <%= ++i %>th request.
JSP страницы и объекты В ходе обработки запросов, JSP страница может получать доступ к объектам, расположенным на сервере, создавать их и модифицировать. Доступ к объектам осуществляется через элементы скриптов и action. Каждый создаваемый в приложении объект имеет определенное время существования, которое декларируется в соответствующем атрибуте. Спецификацией предусматривается четыре интервала: page - Объект, чье время существования определяется как page, доступен в пределах только той JSP страницы, где он был создан. Все ссылки на этот объект должны быть освобождены сразу же после того, как запрос клиента был обработан. request - Объект, чье время существования определяется как request, доступен для всех страниц, связанных с обработкой данного запроса. В частности, если имеет место переадресация обработки на новую JSP страницу, данный объект будет доступен и на прежней, и на новой странице. Как и в предыдущем случае, ссылки на объект после обработки запроса должны быть освобождены.
JSP страницы и объекты session - Объект с областью видимости session доступен для всех страниц, обрабатывающих запросы, связанные с определенной сессией (сеансом связи с конкретным клиентом). Ссылки на объекты, связанные с сессией, помещаются в объект session. По окончании сеанса связи ссылки должны быть освобождены. application - Наиболее общая область видимости. Объекты, имеющие область существования application, не привязаны к какой-либо отдельной странице или сеансу связи и доступны со всех JSP страниц данного приложения. JSP страница всегда имеет доступ к определенному набору объектов, создаваемых web контейнером по умолчанию: request - Объект, содержащий запрос клиента. Относится к классу javax. servlet. Servlet. Request или другому наследующему его классу. Например, для протокола HTTP это будет объект класса javax. servlet. http. Http. Servlet. Request. Область видимости объекта request. response - Объект, в который сервлет будет помещать ответ на запрос пользователя. Относится к классу javax. servlet. Servlet. Response или другому наследующему его классу. Например, для протокола HTTP это будет объект класса javax. servlet. http. Http. Servlet. Response. Область видимости объекта - request. page. Context - Объект, определяющий контекст JSP страницы. Область видимости объекта - page
JSP страницы и объекты session - Объект, создаваемый контейнером для идентификации клиента, а также хранения персональных объектов. Создается контейнером для протокола HTTP и является экземпляром класса javax. servlet. http. Http. Session. application - Объект, связанный с конфигурацией сервлета, соответствующего данной JSP странице. Область видимости объекта - application. out - Объект, содержащий выходной поток сервлета. Информация, посылаемая в этот поток, будет передана клиенту. Объект является экземпляром класса javax. servlet. jsp. Jsp. Writer. Например, большая часть статического шаблона на JSP странице, в идеале, должна быть записана в виде соответствующего набора команд out. println(). Область видимости объекта - page. config - Объект, связанный с конфигурацией сервлета. Является экземпляром класса javax. servlet. Servlet. Config. Для JSP страницы область видимости объекта config - page - Объект, связанный с обработкой данной страницы. Область видимости - page
Элементы action Независимо от того, какой тип будет иметь документ, генерируемый в ответ на запрос пользователя, в общем случае, JSP страница содержит текст и тэги. Очевидно, что последние соответствуют типу генерируемого документа: HTML, XML и т. д. Кроме того, в теле JSP страницы могут содержаться фрагменты программного кода на языке Java, которые должны войти в состав сервлета, получаемого после трансляции: декларации, скриплеты и выражения. Идея заключается в том, чтобы дополнить набор тэгов стандартной разметки специальными тэгами - элементами action, за которыми разработчик бизнес-приложения может скрыть часть программного кода, относящегося к приложению, либо некоторые дополнительные инструкции. Заметим, что с точки зрения специалиста по верстке документов, элементы action являются такими же тэгами, как и все остальные, а потому допустимо их совместное использование с другими элементами: <jsp: set. Property name="results" property="row" value="<%= i+1 %>" />
Стандартные элементы action выглядят как обычные тэги, название которых начинается с сочетания символов jsp: , например <jsp: include. . . >. Согласно терминологии XML, это означает, что стандартные элементы action в технологии JSP принадлежат пространству имен jsp: use. Bean Элемент jsp: use. Bean позволяет использовать на JSP странице объекты, соответствующие компонентам Java. Bean. Элемент <jsp: use. Bean> содержит параметр, который связывает с компонентом некий уникальный идентификатор. Последний затем будет использоваться при обращениях к этому объекту: <jsp: use. Bean id="customer" class="com. myco. Customer" /> В данном примере создается объект класса com. myco. В дальнейшем, чтобы обратиться к нему, достаточно воспользоваться идентификатором "customer". Например: <%= customer. get. Name() %>
Стандартные элементы action Объекты, связанные с элементом Java. Bean, по умолчанию имеют область видимости page. Разработчик JSP страницы может указать более продолжительное время существования объекта Java. Bean, воспользовавшись при написании элемента jsp: use. Bean элементом scope. Приведем один пример его использования: <jsp: use. Bean id="wombat" type="my. Wombat. Type" scope="session" /> jsp: set. Property и jsp: get. Property Любой класс должен давать доступ к некоторым из своих атрибутов и методов. Отличие элемента Java. Bean заключается в том, что доступ к атрибутам у него унифицирован и реализуется на JSP странице с помощью элементов jsp: set. Property и jsp: get. Property.
jsp: set. Property и jsp: get. Property Элемент jsp: get. Property берет экземпляр Bean, извлекает значение указанного атрибута, преобразует его в случае необходимости в строку и помещает в поток данных, передаваемых клиенту. Например, согласно следующей записи <jsp: get. Property name="user" property="name" /> в генерируемый документ помещается значение свойства name из экземпляра Bean, имеющего идентификатор user. Элемент jsp: set. Property, в отличие от предыдущего, не извлекает, а задает новое значение атрибута. Например: <jsp: set. Property name="user" property="name" value="Victor" /> Помимо явного задания новых значений, элемент jsp: set. Property позволяет заносить в атрибут объекта значение, извлеченное из запроса клиента. Например: <jsp: set. Property name="user" property="name" param="login" /> Данная запись означает, что среди данных, полученных от клиента, находится параметр login и его значение передается для помещения в атрибут name объекта Bean, имеющего идентификатор "user".
Способ обработки JSP с помощью Java. Beans Рассматривается удобный способ перемещения динамичного содержания, обработки и системы валидации из самой страницы Java. Server Page в соответствующий компонент Java. Bean. Данная методика предполагает использование проектной модели Template Method Design Pattern, позволяющей реализовывать и многократно использовать стандартное поведение и дизайн JSP в пределах всего Webприложения. Такая модель обеспечивает простой механизм коммуникации между винами в рамках одной HTTP-сессии.
Java Beans шаблоны Технология Java. Server Pages (JSP) предлагает широкий выбор средств, облегчающих создание Web-приложений. Но, при использовании этих средств без предварительного планирования и структуры код может превратиться в смесь меток HTML, JSP и Javaкода, которую будет очень сложно анализировать, отлаживать и в последствии сопровождать. Задача заключается в том, чтобы изолировать код JSP, который очень похож на HTML, переместив рабочий код в компоненты Java. Beans. Преимущество такого подхода заключается в том, что HTML-программист или графический дизайнер могут заниматься разработкой визуальной части (с помощью многочисленных HTML-редакторов), в то время как вы - Java-программист - будете заниматься логикой приложения. Предлагаемая модель "Template Method Design Рattern" позволяет применять одинаковый дизайн для всего приложения и реализовывать одинаковое поведение в каждой из JSP. В понятие поведения включены управление состоянием страницы, одинаковая обработка страницы и возникающих ошибок и механизм предоставления данных для совместного использования несколькими страницами. Это всё определяется только один раз, оставляя только необходимость заниматься специфическими особенностями конкретной страницы.
Шаблон на примере Приводится описание основных действующих элементов модели, а также образец приложения для голосования. Центральный элемент данной оболочки состоит из двух стандартных файлов для включения JSP (JSP include file) и двух классов, описываемых далее. Их роль заключается в том, чтобы реализовать стандартное поведение: includeheader. jsp : Включать JSP-файл, который должен статично вноситься в начало каждой JSP. includefooter. jsp : Включать JSP-файл, который должен статично вноситься в конец каждой JSP. Abstract. JSPBean: Абстрактный класс, который нужно использовать в качестве прототипа (super type) всех классов Java. Bean для JSP. Это основной класс модели. Shared. Session. Bean : Используется для обеспечения связей между всеми Java. Bean-объектами JSP в рамках одной HTTP -сессии.
Проект приложения для голосования Назначение Web-страницы JSP заключается в представлении данных. Каждая JSP должна иметь соответствующий компонент Java. Bean, выполняющий специфическую для данной страницы логику. Каждая страница JSP должна статично включать в себя includeheader. jsp и includefooter. jsp. Каждый Java. Bean должен расширять Abstract. JSPBean, содержащий шаблонные методы, обеспечивающие стандартное поведение. Приложение для голосования состоит из следующих JS-страниц и соответствующих им Java. Bean-компонентов: login. jsp, Login. JSPBean : Аутентификация и log для голосования vote. jsp, Vote. JSPBean : Выполнение голосования confirmation. jsp, Confirmation. JSPBean: Показ подтверждения и результатов голосования Классы, которые эмулируют базу данных или бизнес-логику (Voter , Candidate и Vote. DB), нужны примеру для нормальной работы.
Пример JSP Каждая страница должна придерживаться определённой структуры, чтобы соответствовать модели. Пример 1. ¡ login. jsp <% Abstract. JSPBean _abstract. JSPBean = _login. JSPBean; %> ¡ <%@ include file="includeheader. jsp" %> ¡ <html> ¡ <head><title>Vote Login</title></head> ¡ <body bgcolor="white"> ¡ <font size=4> ¡ Please enter your Voter ID and Password ¡ </font> ¡ <font size="3" color="Red"> ¡ <jsp: get. Property name="_login. JSPBean" property="error. Msg"/> ¡ </font> ¡ <font size=3>
продолжение ¡ ¡ ¡ <form method=post> Voter ID <input type=text name=voter. Id value=<jsp: get. Property name="_login. JSPBean" property="voter. Id"/>> Password <input type=password name=password value=<jsp: get. Property name="_login. JSPBean" property="password"/>> <input type=submit value="Login"> </form> </font> </body> </html> <%@ include file="includefooter. jsp" %> Структура JSP выглядит так: страница начинается несколькими утверждениями (JSP statement). Следующий за ними HTML-код никак не зависит от директив, утверждений, скриплетов и других элементов JSP. Единственным исключением являются директивы. Их следует использовать для получения динамического содержания из бин -компонента. Страница заканчивается директивой включения (JSP include directive).
Утверждения JSP <jsp: use. Bean id="_login. JSPBean" class="lbm. examples. Login. JSPBean" scope="session"/> ¡ <jsp: set. Property name="_login. JSPBean" property="*"/> Показанный выше код устанавливает связь между JSP и соответствующим ей бин-компонентом. Второе утверждение передаёт значения всех полей формы (хранящихся в виде параметров HTTP-запроса) соответствующим свойствам бин-компонента. Код использует установочные методы бина. Более детальное описание того, как это всё работает можно найти в работе Говинда Сешарди "Advanced form processing using JSP". ¡ <% Abstract. JSPBean _abstract. JSPBean = _login. JSPBean; %> ¡ <%@ include file="includeheader. jsp" %> Первое утверждение позволит includeheader. jsp выполнить стандартную обработку. А includeheader. jsp статично включается во второе утверждение. Обратите внимание, что _login. JSPBean и _abstract. JSPBean теперь ссылаются на один и тот же объект, но только через разные интерфейсы. ¡
Пример 2. includeheader. js ¡ ¡ ¡ <%-- Set the Shared. Session. Bean --%> <jsp: use. Bean id="_shared. Session. Bean" class="lbm. jsputil. Shared. Session. Bean" scope="session"/> <% _abstract. JSPBean. set. Shared. Session. Bean(_shared. Session. Bean); %> <%-- Set implicit Servlet objects --%> <% _abstract. JSPBean. set. Request(request); %> <% _abstract. JSPBean. set. Response(response); %> <% _abstract. JSPBean. set. Servlet(this); %> <%-- Perform the processing associated with the JSP --%> <% _abstract. JSPBean. process(); %> <%-- If get. Skip. Page. Output equals false, do not output the JSP page -%> <% if (! _abstract. JSPBean. get. Skip. Page. Output()) { %> Класс includeheader. jsp является одним из ключевых элементов модели. Поэтому он будет использоваться всеми JSP-страницами.
Копия Java_24.ppt