1.2 Заранее определенные переменные
Для упрощения кода в выражениях JSP и скриплетах, вам предоставлен набор их восьми автоматически определенных переменных, иногда называемых неявными объектами. Доступные переменные это request, response, out, session, application, config, pageContext и page. Далее мы рассмотрим каждую из них в отдельности
request
Это объект HttpServletRequest, связанный с запросом, который позволяет вам обращаться к параметрам запроса (через метод getParameter), типу запроса (GET, POST, HEAD, и т.д..), и входящим HTTP заголовкам (cookies, Referer, и т.д..). Проще говоря, request является подклассом ServletRequest и может отличаться от HttpServletRequest если используется протокол отличный от HTTP, что на практике практически никогда не встречается.
response
Это объект типа HttpServletResponse, связанный с ответом на запрос клиента. Обратите внимание что, поскольку поток вывода (см. out далее) буферизован, можно изменять коды состояния HTTP и заголовки ответов, даже если это недопустимо в обычном сервлете, но лишь в том случае если какие-то данные вывода уже были отправлены клиенту.
out
Это объект типа PrintWriter, используемый для отправки вывода клиенту. Однако, чтобы сделать объект response (см. предыдущий раздел) полезным, следует использовать буферизированный вариант PrintWriter - JspWriter. Помните что вы можете изменять размер буфера и даже отключить буферизацию, изменяя значение атрибута buffer директивы page. Этот вопрос подробно рассмотрен в Разделе 5. Также обратите внимание что out используется практически исключительно скриплетами, поскольку выражения JSP автоматически помещаются в поток вывода, что избавляет от необходимости явного обращения к out.
session
Это объект типа HttpSession, связанный с запросом. Сессии создаются автоматически, и эта переменная существует даже если нет ссылок на входящие сессии. Единственным исключением является ситуация, когда вы отключаете использование сессий используя атрибут session директивы page (см. Раздел 5). В этом случае ссылки на переменную session приводят к возникновению ошибок при трансляции JSP страницы в сервлет.
application
Это объект типа ServletContext полученный через использование метода getServletConfig().getContext().
config
Это объект типа ServletConfig для текущей страницы.
pageContext
В JSP представлен новый класс PageContext для изолированного использования специфических особенностей сервера, таких как более эффективные JspWriters. Идея заключается в том, что если вы обращаетесь к ним через этот класс а не непосредственно, ваш код может исполняться на "обычных" движках сервлет/JSP.
page
По сути является синонимом для this, и не нужен при работе с Java. Эта переменная создавалась с расчетом на перспективу, когда возможно появятся другие языки программированя скриптов, отличные от Java.
1.3 Действия
Действия JSP используют конструкции с синтаксисом XML для управления работой движка сервлета. Вы можете динамически подключать файл, многократно использовать компоненты JavaBeans, направить пользователя на другую страницу или сгенерировать HTML для Java plugin. Допустимо применение следующих действий:
jsp:include - Подключает файл в момент запроса страницы.
jsp:useBean - Поиск или создание нового экземпляра JavaBean.
jsp:setProperty - Установка приоритетов JavaBean.
jsp:getProperty - Вставить свойство JavaBean в поток вывода.
jsp:forward - Перенаправляет запрос на другую страницу.
jsp:plugin - Генерирует код (в зависимости от типа используемого броузера), который создает тэг OBJECT или EMBED для Java plugin.
Все эти действия детально рассмотрены далее. Помните что как и во всем XML, имена элементов и атрибутов регистрозависимы.
Действие jsp:include
Это действие позволяет вам вставлять файлы в генерируемую страницу. Синтаксис действия:
<jsp:include page="относительный URL" flush="true" />
В отличие от директивы include, которая вставляет файл на этапе трансляции JSP страницы, это действие вставляет файл при запросе страницы. Это приводит к некоторой отере эффективности и исключает возможность наличия во вставляемом файле кода JSP (например, вам не удастся задать заголовки HTTP), но зато дает существенное преимущество в гибкости. Возьмем, к примеру, JSP страницу, которая вставляет четыре различных отрывка в Web страницу с новостями сайта. Каждый раз когда меняются заголовки автору достаточно изменить содержимое четырех файлов, тогда как главная JSP страница остается неизменной.
WhatsNew.jsp
Вы можете скачать исходники файла или вызвать этот скриплет из Интернет.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Новости</TITLE>
<LINK REL=STYLESHEET
HREF="My-Style-Sheet.css"
TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
Новости на JspNews.com</TABLE>
</CENTER>
<P>
Вот фрагменты наших четырех самых популярных статей:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
Действие jsp:useBean
Это действие позволяет вам загружать JavaBean для последующего использования на JSP странице. Это очень важная возможность, поскольку она позволяет вам использовать многократного использования классов Java не отказываясь при этом от преимуществ, предоставляемых сервлетами JSP. Простейший синтаксис для указания используемого bean:
<jsp:useBean id="имя" class="пакет.class" />
Как правило это означает "создание нового экземпляра объект класса, заданного через class, и его связь с переменной с именем, заданным при помощи id." Однако, как вы скоро убедитесь, можно задать атрибут scope который ассоциирует bean не только с текущей страницей. В таком случае, полезно получить ссылки на существующие beans, и действие jsp:useBean создает экземпляр нового объекта лишь в том случае если не существует ни одного объекта с теми же значениями id и scope. Теперь, когда у вас есть bean, вы можете изменять его свойства при помощи jsp:setProperty, или используя для этого скриплет и явно вызывая метод объекта с именем переменной заданном ранее через атрибут id. Recall that with beans, когда вы говорите "у этого bean есть свойство типаX с названием foo", вы на самом деле имеете ввиду "у этого класса есть метод getFoo, который возвращает данные типа X, и другой метод setFoo, которому в качестве параметра передается X." Действие jsp:setProperty более подробно рассмотрено в следующем разделе, но сейчас вы должны запомнить что вы можете либо явно задавать value, задавая атрибут param, чтобы получить значение из соответствующего параметра запроса, или просто перечислить свойства, чтобы получить значения из параметров запроса с теми же именами что и свойства. Вы можете получить значения существующих свойств при помощи выражений JSP или скриплетов, вызвав соответствующий метод getXxx, или (чаще всего), воспользовавшись действием jsp:getProperty.
Помните что класс заданный для bean должен находиться в обычном каталоге классов сервера, а не в части, зарезервированной для классов, автоматически пеезагружаемых после редактирования. Например, для Java Web Server, все используемые классы должны размещаться в каталоге classes или в jar файле каталога lib, а не в каталоге servlets.
Ниже приведен очень простой пример, загружающий bean и устанавливающий/получающий простой строковый параметр.
BeanTest.jsp
Вы можете скачать исходники файла или вызвать этот скриплет из Интернет.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Многократное использование JavaBeans в JSP</TITLE>
<LINK REL=STYLESHEET
HREF="My-Style-Sheet.css"
TYPE="text/css">
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Многократное использование JavaBeans в JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Привет, WWW" />
<H1>Сообщение: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
</HTML>
SimpleBean.java
Здесь приведен исходный код для bean, исппользованного на JSP странице BeanTest. Вы можете также скачать исходники файла.
package hall;
public class SimpleBean {
private String message = "Текст сообщения не задан";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
Еще несколько деталей о использовании jsp:useBean.
Простейший способ использовать bean - это использование конструкции <jsp:useBean id="имя" class="пакет.class" /> для загрузки bean, а затем использовать jsp:setProperty и jsp:getProperty для модификации и получения его свойств. Однако существуют еще два других способа. Во-первых, вы можете использовать формат контейнера, а именно:
<jsp:useBean ...> Тело </jsp:useBean>
для того чтобы обеспечить выполнение Тела только в том случае, если экземпляр bean создается впервые, а не тогда, когда находится и используется уже существующий bean. Как обсуждается далее, beans могут совместно использоваться, поэтому не каждое выражение jsp:useBean приводит к созданию экземпляра нового bean. Во-вторых, кроме id и class, существуют еще три других атрибута, которые вы можете использовать: scope, type, и beanName. Эти атрибуты описаны в следующей таблице.
|
Атрибут |
Применение |
|
id |
Дает имя переменной, которая ссылается на bean. Если удается найти bean с теми же самыми значениями id и scope, то вместо создания нового экземпляра используется ранее созданный объект. |
|
class |
Задает полное имя пакета bean. |
|
scope |
Задает область, в которой bean должен быть доступен. Может принимать четыре допустимых значения: page, request, session и application. По умолчанию принимает значение page, означающее что bean доступен только на текущей странице (размещается в PageContext текущей страницы). Значение request означает что bean доступен только для текущего запроса клиента (размещается в объекте ServletRequest). Значение session означает что объект доступен всем страницам на протяжении жизни текущей HttpSession. И, наконец, значение application означает что он доступен всем страницам, использующим тот же самый ServletContext. Причина необходимости этого атрибута заключается в том что jsp:useBean приводит к созданию нового экземпляра объекта в том случае, если нет уже существующего объекта с тем же id и scope. Иначе используется уже существующий объект, и все элементы jsp:setParameter или любые другие между тэгами jsp:useBean игнорируются. |
|
type |
Указывает тип переменной, которая ссылается на объект. Долже совпадать с именем класса, суперкласса или реализуемого интерфейса. Запомните что имя переменной задается через атрибут id. |
|
beanName |
Дает имя bean, которое будет использовано методом instantiate. Можно задать type и beanName, и опустить атрибут class. |
Действие jsp:setProperty
Вы можете использовать jsp:setProperty для присвоения значений свойствам ранее описанных beans. Вы можете делать это двумя способами. Во-первых, вы можете использовать jsp:setProperty после, но вне элемента jsp:useBean, так как это показано в примере:
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName"
property="someProperty" ... />
В этом случае jsp:setProperty выполняется независимо от того, был ли найден существующий bean или был создан новый экземпляр. Другим вариантом заключается в размещении jsp:setProperty в теле элемента jsp:useBean, как это показано в другом примере:
<jsp:useBean id="myName" ... >
...
<jsp:setProperty name="myName"
property="someProperty" ... />
</jsp:useBean>
При этом jsp:setProperty выполняется лишь в том случае, если был создан новый экземпляр объекта, а не тогда, когда находится уже существующий.
Действие jsp:setProperty допускает применение следующих четырех атрибутов:
|
Атрибут |
Применение |
|
name |
Этот обязательный атрибут служит для задания bean, свойства которого будут устанавливаться. Элемент jsp:useBean должен предшествовать использованию элемента jsp:setProperty. |
|
property |
Этот обязательный атрибут устанавливает свойство, которое вы хотите установить. Однако существует частный случай: значение "*" означает что все параметры запроса, чьи имена совпадают с именами свойств bean будут переданы соответствующему методу установки свойств. |
|
value |
Этот необязательный атрибут устанавливает значение свойства. Строковые значения автоматически преобразуются в числовые, boolean, Boolean, byte, Byte, char и Character с использованием стандартного метода valueOf соответствующего класса. Например, значение "true" для свойства boolean или Boolean будет конвертированно при помощи метода Boolean.valueOf, а значение "42" для свойства int или Integer будет конвертированно при помощи метода Integer.valueOf. Вы не можете одновременно использовать атрибуты value и param, но можете вообще их не использовать. Ознакомьтесь с описанием атрибута param, которое представлено ниже. |
|
param |
Этот необязательный атрибут устанавливает параметр запроса, используемый для получения свойства. Если в текущем запросе этот параметр отсутствует, никаких действий не происходит: система не передает значение null методу устанавливающему свойства. Таким образом, допустимо использование в bean свойств по умолчанию, переопределяя их лишь в том случае если этого требуют параметры запроса. Например, следующий фрагмент означает следующее: "установить свойство numberOfItems в соответствии со значением параметра запроса numItems, а если такой параметр в запросе отсутствует - никакие действия не выполняются." <jsp:setProperty name="orderBean" property="numberOfItems" param="numItems" /> Если вы не используете ни value, ни param, это приравнивается к тому, как если бы вы задали имя param совпадающее с именем property. Вы можете применить этот принцип автоматического использования свойств запроса, чьи имена совпадают с именами свойств и пойти далее, задав в качестве имени свойства "*" и опустив параметры value и param. В этом случае сервер обработает допустимые свойства и параметры запроса, на предмет совпадения их с идентичными именами. |
Действие jsp:getProperty
Этот элемент определяет значение свойства bean, конвертирует его в строку и направляет в поток вывода. Для выполнения действия требуется задание двух атрибутов: имени bean, которое предварительно задается в действии jsp:useBean, и имя свойства, значение которого должно быть определено. Далее приведен пример использования этого действия.
<jsp:useBean id="itemBean" ... />
...
<UL>
<LI>Количество предметов:
<jsp:getProperty name="itemBean" property="numItems" />
<LI>Цена за штуку:
<jsp:getProperty name="itemBean" property="unitCost" />
</UL>
Действие jsp:forward
Это действие позволяет вам передать запрос другой странице. Оно использует один атрибут, page, который должен содержать относительный URL. Ей может быть как статическое значение, так и вычисляемое в процессе запроса, что и показано на следующих двух примерах:
<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= какое-нибудьВыражениеНаJava %>" />
Действие jsp:plugin
Это действие позволяет вам вставить элемент OBJECT или EMBED (в зависимости от типа используемого броузера), необходимый для запуска апплетов, использующих plugin Java.
