Технология JavaServer PagesTM(Stephanie Bodoff) JavaServerPagesTM (JSPTM) технология позволяет вам легко создавать web содержимое, которое имеет как статические, так и динамические компоненты. JSP технология воплощает все динамические возможности технологии Java Servlet, но обеспечивает более естественный способ создания статического содержимого. Главные особенности JSP технологии:
Технология JSP также содержит API, который используется разработчиками web контейнеров, но этот API не рассматривается в данной главе.
Что такое JSP Page?Страница JSP является текстовым документом, которая содержит текст двух типов: статические исходные данные, которые могут быть оформлены в одном из текстовых форматов HTML, SVG, WML, или XML, и JSP элементы, которые конструируют динамическое содержимое. Следующая web страница является формой, которая позволяет вам выбрать локализацию и отобразить дату в соответствующем стиле.
Исходный текст для этого примера расположен в
<%@ page import="java.util.*" %>
<%@ page contentType="text/html; charset=ISO-8859-5" %>
<html>
<head><title>Localized Dates</title></head>
<body bgcolor="white">
<jsp:useBean id="locales" scope="application"
class="MyLocales"/>
<form name="localeForm" action="index.jsp" method="post">
<b>Locale:</b>
<select name=locale>
<%
String selectedLocale = request.getParameter("locale");
Iterator i = locales.getLocaleNames().iterator();
while (i.hasNext()) {
String locale = (String)i.next();
if (selectedLocale != null &&
selectedLocale.equals(locale)) {
%>
<option selected><%=locale%></option>
<%
} else {
%>
<option><%=locale%></option>
<%
}
}
%>
</select>
<input type="submit" name="Submit" value="Get Date">
</form>
<jsp:include page="date.jsp"/>
</body>
</html>
Чтобы построить, развернуть и выполнить эту страницу:
Вы увидите выпадающий список, который содержит локализации. Выберите локализацию и нажмите Get Date. Вы увидите дату, представленную в стиле, соответствующем вашей локализации. Пример страниц JSPДля иллюстрации JSP технологии в этой главе переписывается каждый сервлет приложения
Исходные тексты для этого приложения расположены в
Наконец, эта версия примера использует апплет для генерации динамических цифровых часов в баннере. Смотрите Including an Applet, где описывается JSP элемент, который генерирует HTML для загрузки апплета. Чтобы построить, развернуть и исполнить пример:
Смотрите Troubleshooting для помощи с диагностикой общих проблем. Цикл жизни JSP PageСтраница JSP обслуживает запросы подобно сервлету. Таким образом, цикл жизни и многие особенности JSP pages (в частности динамические аспекты) определены технологией Java Servlet technology, и многое из обсуждаемого в данной главе ссылается на функции, описанные в Java Servlet Technology. Когда запрос обращается к JSP странице, он обрабатывается специальным сервлетом, который сначала проверяет, старше ли сервлет этой JSP страницы, чем сама JSP page. Если старше, он транслирует эту JSP страницу в класс сервлета и компилирует этот класс. Одно из преимуществ JSP page над сервлетами состоит в том, что процесс «построения» выполняется автоматически. Трансляция и компиляцияНа этапе трансляции каждый тип данных в JSP page интерпретируется по разному. Исходные данные трансформируются в код, который будет выделять данные в поток, возвращающий данные клиенту. JSP элементы интерпретируются следующим образом:
Для JSP страницы, названной
Например, исходный текст для страницы с именем index (
Этапы трансляции и компиляции могут выдавать ошибки, которые наблюдаются, только когда
страница запрашивается в первый раз. Если ошибка встречается во время трансляции страницы
(например, если транслятор встречает плохо сформированный JSP элемент) сервер выбросит
Если ошибка встречается во время компиляции (например, ошибка синтаксиса в скриплете),
сервер вернет Если страница была оттранслирована и откомпилирована, полученный сервлет в основном следует циклу жизни обычного сервлета, описанному в
Если контейнеру необходимо удалить этот сервлет JSP страницы, он вызывает метод
ВыполнениеВы можете контролировать различные параметры выполнения JSP страницы. Директивы, которые относятся к буферизации выхода и ошибкам обработки, обсуждаются здесь. Другие директивы рассматриваются в контексте специфических задач на протяжении всей главы. БуферизацияКогда выполняется JSP страница, выход, записанный в объект
<%@ page buffer="none|
Буфер большего размера позволяет записать больше содержимого прежде, чем что-то будет реально отправлено обратно клиенту. Таким образом JSP странице выделяется больше времени для установки соответствующих кодов состояния и заголовков или переадресации к другим web ресурсам. Маленький буфер сокращает загрузку памяти сервера и позволяет клиенту начать получение данных быстрее. Ошибки обработкиЛюбое количество исключений может возникать в процессе выполнения JSP страницы. Для определения того, что web контейнер должен передать управление странице ошибок (error page), если встречается исключение, поместите следующую директиву в начало вашей JSP page:
<%@ page errorPage="
Страница приложения <%@ page errorPage="errorpage.jsp"%> В начале страницы <%@ page isErrorPage="true|false" %> Эта директива делает объекты исключений (типа
Замечание: вы также можете определить страницу ошибок для WAR, который содержит JSP страницу. Если страница ошибок определена и для WAR и для JSP page, ошибка JSP страницы принимает приоритет. Инициализация и завершение JSP PageВы можете переделать процесс инициализации, чтобы позволить JSP странице читать
постоянные данные конфигурации, инициализировать ресурсы и выполнить любые другие разовые
действия путем перегрузки метода Страница примера bookstore
private BookDB bookDB;
public void jspInit() {
bookDB =
(BookDB)getServletContext(). getAttribute("bookDB");
if (bookDB == null) {
try {
bookDB = new BookDB();
getServletContext().setAttribute(
"bookDB", bookDB);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
И метод
public void jspDestroy() {
try {
bookDB.remove();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
getServletContext().removeAttribute("bookDB");
bookDB = null;
}
Дальше следует ввод в действие бина database. Этот бин имеет две переменных: текущую книгу и ссылку на enterprise beandatabase. Ссылка создана с применением технологии, описанной в Getting Started.
public class BookDB {
String bookId = "0";
private BookDBEJB database = null;
public BookDB () throws Exception {
try {
InitialContext ic = new InitialContext();
Object objRef = ic.lookup(
"java:comp/env/ejb/BookDBEJB");
BookDBEJBHome home =
(BookDBEJBHome)PortableRemoteObject.
narrow(objRef, database.BookDBEJBHome.class);
database = home.create();
} catch (RemoteException ex) {
throw new Exception(
"Couldn't create database bean.");
} catch (CreateException ex) {
throw new Exception(
"Couldn't create database bean.");
} catch (NamingException ex) {
throw new Exception("Unable to lookup home: "+
"java:comp/env/ejb/BookDBEJB.");
}
public void remove () throws Exception {
try {
database.remove();
database = null;
} catch (RemoteException ex) {
throw new Exception(
"Error while removing database bean.");
} catch (EJBException ex) {
throw new Exception(
"Error while removing database bean.");
} catch (RemoveException ex) {
throw new Exception(
"Error while removing database bean.");
}
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
...
}
Так как database bean разделяется между всеми JSP страницами (совместно используется ими), он должен быть инициализирован, когда стартует приложение, вместо того чтобы инициализироваться в каждой JSP странице. Java Servlet технология обеспечивает события цикла жизни приложения и классы listener для этих целей. В качестве упражнения вы можете перенести код, который управляет бином, в context listener class. Смотрите Handling Servlet Life Cycle Events о context listener, который инициализирует версию Java Servlet приложения bookstore. Создание статического содержимогоВы создаете статическое содержимое JSP страницы, просто написав ее так, как будто она
состоит только из этого содержимого. Статическое содержимое может быть представлено в
любом текстовом формате, таком как HTML, WML или XML. Форматом по умолчанию является
HTML. Если вы хотите использовать другой формат, вы включаете в начало вашей JSP страницы
<%@ page contentType="text/vnd.wap.wml"%> Реестр имен типа содержимого хранится в IANA (Агентство по выделению имен и уникальных параметров протоколов интернет) на: ftp://ftp.isi.edu/in-notes/iana/assignments/media-types Создание динамического содержимогоВы создаете динамическое содержимое подключением Java объектов из скриптовых элементов. Использование объектов внутри JSP PagesВы можете из JSP page получить доступ к разнообразным объектам, включая enterprise beans и JavaBeans компоненты. JSP технология автоматически делает такие объекты доступными, и вы можете также создать и получить доступ к объектам, специфическим для приложения. Неявные объектыНеявные объекты создаются web контейнером и содержат информацию, связанную с отдельными запросами, страницами или приложениями. Многие из этих объектов определяются Java Servlet технологией, на которой основана JSP технология, и которая подробно обсуждается в Java Servlet Technology. Таблица 19 перечисляет эти неявные объекты.
Объекты, специфические для приложенияЕсли возможно, поведение приложения должно быть инкапсулировано в объекты, чтобы разработчики JSP страниц могли сосредоточиться на представлении результатов. Объекты могут быть созданы разработчиками, которые являются специалистами по Java, организации доступа к базам данных и другим сервисам. Имеется четыре пути создания и использования объектов внутри страницы JSP:
Декларации, скриплеты и выражения описаны ниже в JSP Scripting Elements. Разделяемые объектыУсловия эффективного конкурентного доступа к разделяемым объектам описаны в
Sharing
Information и относятся к объектам, доступным из JSP страниц, которые выполняются как
многопоточные сервлеты. Вы можете указать, как web контейнер должен координировать
множественные клиентские запросы с помощью следующей <%@ page isThreadSafe="true|false" %> Если Если JSP скриптовые элементыJSP скриптовые элементы используются, чтобы создать и получить доступ к объектам, определить методы и управлять потоком контроля. Так как одной из целей JSP технологии является отделение статических исходных данных от кода, необходимого для генерации динамического содержимого, рекомендуется очень умеренно использовать JSP скрипты. Много работы, которая требует использования скриптов, может быть устранена при использовании заказных тегов, описанных ниже в разделе Extending the JSP Language (расширения языка JSP). JSP технология позволяет контейнеру поддерживать любые языки скриптов, которые могут
вызывать Java объекты. Если вы хотите использовать другой язык скриптов вместо
<%@ page language="scripting language" %> Так как скриптовые элементы конвертируются в выражения языка программирования в классе сервлета JSP страницы, вы должны декларировать все классы и пакеты, используемые в JSP странице. Если языком страницы является <%@ page import=" Страничка примера bookstore
<%@ page import="java.util.*, cart.*" %> ДекларацииДекларация используется, чтобы объявить переменные и методы языка скриптов страницы. Синтаксис декларации имеет вид: <%! декларация языка скриптов %> Если в качестве языка скриптов используется Java, переменные и методы в JSP декларациях становятся декларациями класса сервлета JSP страницы. Страничка примера bookstore
<%!
private BookDB bookDB;
public void jspInit() {
...
}
public void jspDestroy() {
...
}
%>
СкриплетыСкриплет может содержать любой фрагмент кода, который адекватен языку скриптов, используемому на странице. Синтаксис скриплета имеет вид: <% выражения на языке скриптов %> Если в качестве языка скриптов выбран JSP страница
<%
Iterator i = cart.getItems().iterator();
while (i.hasNext()) {
ShoppingCartItem item =
(ShoppingCartItem)i.next();
BookDetails bd = (BookDetails)item.getItem();
%>
<tr>
<td align="right" bgcolor="#ffffff">
<%=item.getQuantity()%>
</td>
<td bgcolor="#ffffaa">
<strong><a href="
<%=request.getContextPath()%>/bookdetails?bookId=
<%=bd.getBookId()%>"><%=bd.getTitle()%></a></strong>
</td>
...
<%
// Конец цикла while
}
%>
Результат показан ниже:
ВыраженияJSP выражения используются, чтобы вставлять значение выражения языка скриптов,
преобразованное в строку, в поток данных, возвращаемых клиенту. Если языком скриптов
является Java, выражение трансформируется в оператор, который преобразует значение
выражения в объект Синтаксис выражения имеет вид: <%=выражение языка скриптов %> Отметим, что точка с запятой не допускается внутри JSP выражений, даже если такое выражение содержит точку с запятой, когда вы используете его в скриплете. Следующий скриплет извлекает количество элементов в карте покупок:
<%
// Печатаем сводку для карты покупок (корзинки)
int num = cart.getNumberOfItems();
if (num > 0) {
%>
Выражения затем используются, чтобы вставить значение из <font size="+2">You have <%= num %> <%= (num==1 ? " item" : " items") %> in your shopping cart. </font> Включение содержимого в JSP страницуИмеется два механизма для включения содержимого из другого источника в страницу JSP:
директива Директива <%@ include file="filename" %> Например, все страницы приложения bookstore включают файл
<%@ include file="banner.jsp" %> Вдобавок, страницы <%@ include file="initdestroy.jsp" %> Поскольку вы должны статически вставлять директиву Элемент <jsp:include page="includedPage" /> Приложение <jsp:include page="date.jsp"/> Контроль пересылки данных другому Web компонентуМеханизм контроля пересылки данных другому web компоненту из JSP страницы использует
функциональность, обеспечиваемую Java Servlet API как описано в
Transferring a
Control to Another Web Component. Вы получаете доступ к этой функциональности из JSP
страницы с помощью элемента <jsp:forward page="/main.jsp" /> Отметим, что если какие-либо данные уже возвращены клиенту, элемент
Элемент ParamКогда вызывается элемент <jsp:include page="..." > <jsp:param name="param1" value="value1"/> </jsp:include> Включение апплетаВы можете включить апплет или компонент JavaBeans в JSP страницу с помощью элемента
<jsp:plugin
type="bean|applet"
code="objectCode"
codebase="objectCodebase"
{ align="alignment" }
{ archive="archiveList" }
{ height="height" }
{ hspace="hspace" }
{ jreversion="jreversion" }
{ name="componentName" }
{ vspace="vspace" }
{ width="width" }
{ nspluginurl="url" }
{ iepluginurl="url" } >
{ <jsp:params>
{ <jsp:param name="paramName" value= paramValue" /> }+
</jsp:params> }
{ <jsp:fallback> arbitrary_text </jsp:fallback> }
</jsp:plugin>
Тег Элемент Если этот plugin может стартовать, но апплет или компонент JavaBeans не может быть
найден или запущен, пользователь получит специфическое для plugin сообщение (окно с
сообщением о Страничка
Элемент
<jsp:plugin
type="applet"
code="DigitalClock.class"
codebase="/bookstore2"
jreversion="1.3"
align="center" height="25" width="300"
nspluginurl="http://java.sun.com/products/
plugin/1.3.0_01/plugin-install.html"
iepluginurl="http://java.sun.com/products/
plugin/1.3.0_01/jinstall-130_01-win32.cab#Version=1,3,0,1" >
<jsp:params>
<jsp:param name="language"
value="<%=request.getLocale().getLanguage()%>" />
<jsp:param name="country"
value="<%=request.getLocale().getCountry()%>" />
<jsp:param name="bgcolor"
value="FFFFFF" />
<jsp:param name="fgcolor"
value="CC0066" />
</jsp:params>
<jsp:fallback>
<p>Unable to start plugin.</p>
</jsp:fallback>
</jsp:plugin>
Расширения языка JSPВы можете выполнять широкое множество задач динамической обработки с помощью компонентов JavaBeans в соединении со скриплетами, в том числе: организацию доступа к базам данных, использование enterprise services (служб), таких как электронная почта (email) или каталоги (directories), и управление потоком. Один из недостатков скриплетов однако состоит в том, что они могут сделать JSP страницу более трудной для поддержки. В качестве альтернативы JSP технология предусматривает механизм, называемый заказными тегами, которые позволяют вам инкапсулировать динамическую функциональность в объекты, которые доступны благодаря расширениям языка JSP. Заказные теги приносят выгоды от другого типа компоновки JSP страницы. Например, повторный вызов скриплета, используемого в цикле, и отображающего содержимое
карты покупок примера
<%
Iterator i = cart.getItems().iterator();
while (i.hasNext()) {
ShoppingCartItem item =
(ShoppingCartItem)i.next();
...
%>
<tr>
<td align="right" bgcolor="#ffffff">
<%=item.getQuantity()%>
</td>
...
<%
}
%>
Заказной тег <logic:iterate id="item" collection="<%=cart.getItems()%>" <tr> <td align="right" bgcolor="#ffffff"> <%=item.getQuantity()%> </td> ... </logic:iterate> Заказные теги упаковывают и распространяют как модуль, называемый библиотекой тегов.
Синтаксис заказных тегов тот же самый, что и для JSP элементов, а именно
TOC | Компоненты
JavaBeansTM в страницах JSPTM Перевод на русский © Сергей Киреев, 2001 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| :: Copyright © 1999 - 2003, Javable.com. |