Active Server Pages
- 1 year ago
- 0
- 0
JSP ( JavaServer Pages ) — платформенно-независимая, переносимая и легко расширяемая технология для разработки веб-приложений , работающая на виртуальной машине Java (JVM) . JSP позволяет веб- разработчикам создавать содержимое, состоящее из статических исходных данных, которые могут быть оформлены в одном из текстовых форматов HTML , SVG , WML , или XML , и JSP-элементов, которые конструируют динамическое содержимое. Кроме этого могут использоваться библиотеки JSP-тегов, а также Expression Language (EL), для внедрения Java - кода в статичное содержимое JSP-страниц.
Код JSP-страницы транслируется в Java-код сервлета с помощью компилятора JSP-страниц Jasper , затем компилируется в байт-код Java, после чего сервлет может быть запущен в контейнерах сервлетов . JSP-страницы загружаются на сервере и управляются из структуры специального Java server packet, который называется Jakarta EE Web Application. Обычно страницы упакованы в файловые архивы .war и .ear .
Начиная с версии 1.2, разработка JavaServer Pages происходила в рамках Java Community Process . определяет стандарты JSP 1.2 и Servlet 2.3, а определяет спецификацию JSP 2.0. В мае 2006 года JSP спецификация 2.1 была выпущена под в рамках Java EE 5 . 10 декабря 2009 года была выпущена спецификация JSP 2.2 как содержание выпуска .
Эти версии кардинально отличаются от предыдущих, которые воспринимались как ответ
Java
на
ASP
. Некоторые основные возможности прошлых версий (например, возможность разрабатывать библиотеки тегов) были убраны или заменены в соответствии с принципом разделения кода и содержимого. Так как в больших объёмах
исходного кода
трудно сориентироваться и отделить контент от самого кода, то пришла идея их разделить (перенести) с помощью JSP тегов, таких как
<jsp:useBean/>
. Для реализации этой идеи JSP-теги разделили на три логические группы: директивы, скриптовые элементы и действия.
JSP 1.2 расширяет спецификацию JavaServer Pages 1.1 (JSP 1.1) следующим образом:
Новая версия спецификации JSP дополнена следующей функциональностью:
.tag
, теперь для создания новых тегов не обязательно знать Java;
Hello, ${param.visitor} <%-- аналогично коду: Hello, <%=request.getParameter("visitor")%> --%>
Платформа Java EE 5 фокусируется на простой разработке с использованием языковых аннотаций Java, которые были введены J2SE 5.0 . JSP 2.1 поддерживает эту цель определением аннотаций для зависимых инъекций в JSP операторах и в контекстных слушателях (Listeners).
JavaServer Pages (JSP) позволяют отделить динамическую часть страниц от статического
HTML
. Динамическая часть заключается в специальные теги
"<% %>"
:
Имя вашего хоста: <%= request.getRemoteHost() %>
JSP страницы имеют расширение
.jsp
и размещаются там же, где и обычные Web-страницы. Структура таких страниц может состоять из пяти конструкций:
HTML
, комментарии, скриптовые элементы, директивы и действия. JSP-страница при компиляции преобразуется в
сервлет
со статическим содержимым, которое направляется в поток вывода, связанный с методом
service
. Поэтому при первом запросе этот процесс может вызвать небольшую задержку.
Комментарии
в документе или программе не являются причиной замедления программы, так как
транслятор
и исполнитель их игнорируют.
Скриптовые элементы
позволяют указать код на языке
Java
, который впоследствии станет частью конечного сервлета,
директивы
дают возможность управлять всей структурой сервлета, а
действия
служат для задания существующих используемых компонентов, а также для контроля над поведением движка JSP. Для упрощения работы со скриптами имеются заранее определённые переменные, такие как
request, response, pageContext, session, out, application, config, page, exception
.
Пример JSP страницы с использованием всех составляющих JSP:
Комментарии используются для пояснения исходного текста программы. В JSP-страницах комментарии можно разделить на две группы:
Комментарии исходного кода JSP отмечаются специальной последовательностью символов:
<%--
в начале и
--%>
в конце комментария. Данный вид комментариев удаляется на этапе компиляции JSP-страницы. Пример JSP-комментария:
<%--
Отобразит каталог изделий
и актуальную корзину покупателя.
--%>
Комментарии HTML -разметки оформляются в соответствии с правилами языка HTML. Данный вид комментариев рассматривается JSP-компилятором как статический текст и помещается в выходной HTML-документ. JSP-выражения внутри HTML-комментариев исполняются. Пример HTML-комментария:
<!-- Дата создания страницы: <%= new java.util.Date() %> -->
Спецификация JSP различает три типа скриптовых элементов:
<%!
одна или несколько деклараций
%>;
<%=
одно выражение
%>;
<%
скриплет
%>.
Объявления обычно используются для определения переменных, методов, внутренних классов и остальных действующих Java конструкций на уровне класса. Выражения становятся аргументами для метода out.print(). С помощью скриплетов в JSP страницы вкладываются работающие части Java-кода.
Объявления JSP позволят вам задавать переменные, методы, внутренние классы и так далее. Объявления используются для определения используемых в программе конструкций Java. Так как объявления не осуществляют вывода, обычно они используются совместно с JSP-выражениями или скриплетами. В приведённом в качестве примера фрагменте JSP отображается количество запросов к данной странице с момента загрузки сервера (или с момента последнего изменения и перезагрузки сервлета). Обратите внимание, что в примере мы используем как объявление, так и выражение и что внутри конструкции после объявления стоит точка с запятой ( ; ):
<%! private int accessCount = 0; %>
Количество обращений к странице с момента загрузки сервера: <%= ++accessCount %>
Выражения JSP применяются для того, чтобы вставить значения Java непосредственно в вывод. Выражения Java вычисляются, конвертируются в строку и вставляются в страницу. Эти вычисления проходят во время выполнения (то есть при запросе страницы), а потому существует полный доступ к информации о самом запросе.
В выражениях можно использовать постоянные, переменные, вызовы различных методов. Все выражения, вне зависимости от сложности их содержимого, вычисляются в один результат или число. JSP страницы полагаются на
, который берёт любой результат выражения, переводит его в тип
String
(текстовый) и заносит в
буферную память
. Например, следующий код служит для отображения даты и времени запроса данной страницы:
Текущее время: <%= new java.util.Date() %>
Имя вашего хоста: <%= request.getRemoteHost() %>
Необходимо обратить внимание на три правила:
;
), в отличие от Java объявлений.
Скриплеты JSP дают возможность вставить любой код в метод сервлета, который будет создан при обработке страницы, позволяя использовать большинство конструкций Java. Скриплеты также имеют доступ к тем же заранее определённым переменным, что и выражения. Поэтому, например, для вывода значения на страницу необходимо использовать заранее определённую переменную
out
.
<%
String queryData = request.getQueryString();
out.println("Дополнительные данные запроса: " + queryData);
%>
Код внутри скриплета вставляется в том виде, как он был записан. Весь статический
HTML
(текст шаблона) до или после скриплета конвертируется при помощи оператора
print
. Например, следующий фрагмент JSP содержит смешанный текст шаблона и скриплета:
<% if (Math.random() < 0.5) { %>
<B>Удачного</B> вам дня!
<% } else { %>
<B>Неудачного</B> вам дня!
<% } %>
После преобразования скриплета код будет выглядеть следующим образом:
if (Math.random() < 0.5) {
out.println("<B>Удачного</B> вам дня!");
} else {
out.println("<B>Неудачного</B> вам дня!");
}
Это означает, что скриплеты не обязательно должны содержать завершённые фрагменты Java, и что оставленные открытыми блоки могут оказать влияние на статический HTML вне скриплета.
JSP страница может послать сообщение соответствующему контейнеру с указаниями действий, которые необходимо провести. Эти сообщения называются директивами. Все директивы начинаются с
<%@
, затем следует название директивы и один или несколько атрибутов со значениями, и заканчиваются
%>
. Директивы в JSP странице приводят к тому, что контейнер пошлёт заявку на исполнение определённой службы, которая в генерированном документе не объявляется. Форму записи директив можно изобразить следующим образом:
<%@ директива атрибут="значение" %>
Вы также можете объединить установку нескольких атрибутов для одной директивы:
<%@ директива атрибут1="значение1"
атрибут2="значение2"
...
атрибутN="значениеN" %>
Существует три основных типа директив: page , которая позволяет вам совершать такие операции, как импорт классов, изменение суперкласса сервлета, и т. п.; include , которая даёт вам возможность вставить файл в класс сервлета при трансляции JSP файла в сервлет; и taglib , позволяющий расширить множество тегов своими собственными, которые JSP контейнер способен истолковать.
Как можно догадаться из названия, данная директива предоставляет атрибуты для JSP страницы. Атрибуты, определённые в этой директиве, внедряются в данную JSP страницу и на все её вложенные статические элементы, независимо от того, были ли они вставлены с помощью директивы
include
или с помощью действия
jsp:include
. Форма записи директивы
page
следующая:
<%@ page атрибут=“значение“ %>
В качестве примера приведём следующую запись:
<%@ page import=”java.util.*, com.myclasses.*” buffer=”15kb” %>
Эта директива заявляет, что JSP страница импортирует классы из двух пакетов Java,
java.util
и
com.myclasses
, а потом уточняет размер буферной памяти, которая должна быть использована для обработки данной JSP страницы.
Далее рассмотрим атрибуты директивы
page
:
import="пакет.class1, пакет.class2, ..., пакет.classN".
Позволяет вам задать пакеты, которые должны быть импортированы. Это единственный атрибут, который может использоваться несколько раз в одной директиве. В список необходимо включить все классы Java, которые Вы хотите использовать и которые не являются частью исходного набора импортируемых классов. Исходный набор содержит:
java.lang.*, javax.servlet.*, javax.servlet.jsp.* и javax.servlet.http.*.
Пример использования атрибута
import
:
<%@ page import="java.util.Date, javax.text.SimpleDateFormat, com.myclasses.*" %>
language="java".
Данный атрибут предназначен для задания используемого
языка программирования
. По умолчанию принимается значение
"java"
. Этот атрибут необязательно использовать, но тем не менее проблема потом может наступить в случае, если поставщик JSP контейнера будет использовать другие языки (например,
JavaScript
). Пример записи данного атрибута следующий:
<%@ page language=”java” %>
extends="пакет.class".
Задаёт суперкласс (родительский класс) для генерируемого сервлета. Обычно сервлет возникает расширением исходного класса. Опытные программисты могут с помощью этого атрибута создавать собственные суперклассы. Пример использования этого атрибута может выглядеть следующим образом:
<%@ page extends=”myPackage.HttpExample” %>
session="true|false".
Данный атрибут может принимать значение
true
или
false
, которые определяют принимает ли участие JSP страница в трансляции
HTTP
. Значение
true
(«истина», принимается по умолчанию) сигнализирует о том, что заранее определённая переменная
session
(тип
HttpSession
) должна быть привязана к существующей сессии, если таковая имеется, в противном случае создаётся новая сессия, к которой и осуществляется привязка. Значение
false
(«ложь») определяет, что сессии не будут использоваться, и попытки обращения к переменной
session
приведут к возникновению ошибки при трансляции JSP страницы в сервлет. Пример использования данного атрибута может выглядеть следующим образом:
<%@ page session=”false” %>
buffer="размерkb|none".
Данный атрибут задаёт объём буферной памяти, необходимой для объекта
, на который ссылается заранее определённая переменная
out
. Значение, принимаемое по умолчанию, зависит от настроек сервера, но должно превышать
8kb
. Значение задаётся либо в форме «размерkb» либо «none». Если Вы укажете значение буферной памяти как
none
, то сервлет не будет ничего сохранять в буферную память и передаст результат, записанный до переменной
out
, прямо объекту
PrintWriter
, который предоставляется вместе с объектом
ServletResponse.
Если Вы зададите значение буферной памяти на конкретную величину, то
JspWriter
будет в эту память сохранять данные, в результате чего увеличится производительность. В отличие от объекта
PrintWriter
объект
JspWriter
может вызывать исключительные ситуации
IOExceptions
. Исходная величина буферной памяти равна
8kB
. Пример записи данного атрибута может выглядеть следующим образом:
<%@ page buffer=”12kb” %>
autoflush="true|false".
Данный атрибут может принимать значения
true
или
false
. Значение
true
(«истина», принимаемое по умолчанию) устанавливает, что при переполнении буферной памяти он автоматически очистится. Значение
false
(«ложь»), которое крайне редко используется, устанавливает что
переполнение буфера
должно приводить к возникновению исключительной ситуации (
IOExceptions
). Обычно атрибуты
buffer
и
autoflush
устанавливаются вместе в одной директиве. При установке значение атрибута
buffer="none"
установка значения
false
для атрибута
autoflush
недопустима. Пример может выглядеть следующим образом:
<%@ page buffer=”16kb” autoflush=”true” %>
isThreadSafe="true|false".
Данный атрибут может принимать значения
true
или
false
. Значение
true
(«истина», принимается по умолчанию) задаёт нормальный режим выполнения сервлета, когда множественные запросы обрабатываются одновременно с использованием одного экземпляра сервлета, исходя из соображения что автор синхронизировал доступ к переменным этого экземпляра. Значение
false
(«ложь») сигнализирует о том, что сервлет должен наследовать
SingleThreadModel
(однопоточную модель), при которой последовательные или одновременные запросы обрабатываются отдельными экземплярами сервлета. Другими словами значение
true
приведёт к тому, что контейнер может посылать сервлету сразу несколько запросов, в то время как при значении
false
контейнер посылает запросы по одному. Пример использования выглядит так:
<%@ page isThreadSafe=”false” %>
info="информация".
Задаёт строку, которая может быть получена при использовании метода
Servlet.getServletInfo().
Обычно этот метод возвращает информацию о сервлете (например, авторе, версии и авторских правах). Пример записи данного атрибута может выглядеть следующим образом:
<%@ page info=”Автор: Пётр Иванович; версия:1.0” %>
errorPage="url".
Задаёт JSP страницу, которая вызывается в случае возникновения каких-либо событий
Throwables
, которые не обрабатываются на данной странице. Если на JSP странице случится исключение, и JSP страница не имеет собственного кода для решения этого исключения, то контейнер автоматически передаст управление на
URL
, которую Вы задали в качестве значения атрибута
errorPage
. Пример записи выглядит так:
<%@ page errorPage=“/myweb/errors/myerror.jsp“ %>
isErrorPage="true|false".
Данный атрибут может принимать значения
true
или
false
. Сигнализирует о том, может ли эта страница использоваться для обработки ошибок для других JSP страниц или нет. По умолчанию принимается значение
false
(«ложь»). Пример использования данного атрибута может выглядеть следующим образом:
<%@ page isErrorPage=”true” %>
contentType="MIME-Тип".
Данный атрибут задаёт тип
MIME
для вывода и по желанию можно задать кодировку знаков в ответе (
HTML
ответе). По умолчанию в качестве значения
MIME
используется
text/html
. Для наглядности можем использовать следующий пример:
<%@ page contentType="text/plain" %>
Того же результата можно добиться и использованием скриплета:
<% response.setContentType("text/plain"); %>
Эта директива позволяет Вам включать файлы в сервлет в процессе трансляции JSP страницы. Использование директивы выглядит следующим образом:
<%@ include file="относительный url" %>
Заданный
URL
обычно интерпретируется относительно JSP страницы, на которой расположена ссылка, но, как и при использовании любых других относительных
URL
вы можете задать системе положение интересующего вас ресурса относительно домашнего каталога
, добавив в начало
URL
символ «
/
». Содержимое подключаемого файла обрабатывается как обычный текст JSP и поэтому может включать такие элементы как статический
HTML
, элементы скриптов, директивы и действия.
Например, многие сайты используют небольшую панель навигации на каждой странице. В связи с проблемами использования фреймов
HTML
часто эта задача решается размещением небольшой таблицы сверху или в левой половине страницы,
HTML
код которой многократно повторяется для каждой страницы сайта. Директива
include
наиболее естественный способ решения этой задачи, избавляющий разработчика от кошмара рутины копирования HTML в каждый отдельный файл. Это происходит следующим образом:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Тестовая страница</title>
</head>
<body>
<%@ include file="/navbar.html" %>
<!-- Специфический фрагмент этой страницы ... -->
</body>
</html>
Учтите что поскольку директива
include
подключает файлы в ходе трансляции страницы, то после внесения изменений в панель навигации вам потребуется повторная трансляция всех использующих её JSP страниц. Что в данном случае является хорошим компромиссом, поскольку как правило панель навигации меняется достаточно редко и процесс подключения не теряет своей эффективности. Если же подключённые файлы меняются довольно часто, вы можете использовать вместо этого действие
jsp:include
. Это действие подключает файл в процессе обращения к JSP.
Как уже известно, в JSP страницах элементы записываются с помощью тегов (условных знаков, меток, марок). Множество тегов, которые JSP контейнер способен истолковать, можно расширить с помощью так называемых библиотек тегов. Также к расширенному множеству тегов можно присоединять действия, вследствие чего происходит расширение самого языка JSP. Теги можно разделить на стандартные и собственные. Обобщённый способ записи может выглядеть так:
<%@ taglib uri=”URI к библиотеке тегов” prefix=“префикс знака“ %>
Библиотеку тегов необходимо идентифицировать с помощью URI адреса (уникального идентификатора ресурса). URI может быть как абсолютным так и относительным. Уникальный идентификатор ресурса определяет расположение библиотеки тегов ( ), который определяет собственные теги этой библиотеки. Пример записи директивы:
<%@ taglib uri=”http://www.moywebserver.ru/naydiznaki.tld” prefix=”iskat” %>
JSP страница может содержать бесконечное количество директив
taglib
, но для каждой директивы необходимо установить различные префиксы, которые определяют содержимое библиотеки на странице. В качестве префикса можете использовать какой угодно текст, слово. В то время, как директиву
taglib
можно использовать где угодно на JSP странице, все собственные теги, которые эти директивы используют, должны использоваться за ними.
Действия JSP используют конструкции с синтаксисом XML для управления работой движка сервлета. Вы можете динамически подключать файл, многократно использовать компоненты JavaBeans , направить пользователя на другую страницу или сгенерировать HTML для . Все эти действия детально рассмотрены далее. Помните, что как и во всём XML , имена элементов и атрибутов регистрозависимы. Действия можно разделить на две группы: стандартные и созданные (собственные, что создаёт сам программист). Допустимо применение следующих стандартных действий:
OBJECT
или
EMBED
для Java plugin;
Это действие позволяет загружать JavaBean для последующего использования на JSP странице. Эта возможность позволяет многократно использовать классы Java, не отказываясь при этом от преимуществ, предоставляемых сервлетами JSP. Помимо того, это один из способов исключения большей части обработки Java из JSP страницы. Если перенести обработку Java из JSP страницы до JavaBean, то потом эти функции можно использовать и в остальных JSP страницах. Простейший синтаксис для указания используемого bean:
<jsp:useBean id="имя" class="пакет.class" />
Как правило это означает «создание нового экземпляра объекта класса, заданного через
class
, и его связь с переменной с именем, заданным при помощи
id
». Однако можно задать атрибут
scope
(принимает значения
page|request|session|application
,
page
для страницы,
request
для запросов,
session
для сессий или диалогов,
application
для приложения), который ассоциирует
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>
</head>
<body>
<h1>Многократное использование JavaBeans в JSP</h1>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message" value="Привет, WWW" />
<p>
Сообщение:
<jsp:getProperty name="test" property="message" />
</p>
</body>
</html>
SimpleBean.java
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
. Эти атрибуты описаны далее:
bean
. Если удаётся найти
bean
с теми же самыми значениями
id
и
scope
, то вместо создания нового экземпляра используется ранее созданный объект;
bean
;
bean
должен быть доступен. Может принимать четыре допустимых значения:
page
,
request
,
session
и
application
. По умолчанию принимает значение
page
, означающее что
bean
доступен только на текущей странице (размещается в
PageContext
текущей страницы). Значение
request
означает что
bean
доступен только для текущего запроса клиента (размещается в объекте
ServletRequest
). Значение
session
означает что объект доступен всем страницам на протяжении жизни текущей
HttpSession
. И, наконец, значение
application
означает что он доступен всем страницам, использующим тот же самый
ServletContext
. Причина необходимости этого атрибута заключается в том что
jsp:useBean
приводит к созданию нового экземпляра объекта в том случае, если нет уже существующего объекта с тем же
id
и
scope
. Иначе используется уже существующий объект, и все элементы
jsp:setParameter
или любые другие между тегами
jsp:useBean
игнорируются.
id
.
bean
, которое будет использовано методом
instantiate
. Можно задать
type
и
beanName
, и опустить атрибут
class
.
Вы можете использовать
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
допускает применение следующих четырёх атрибутов:
bean
, свойства которого будут устанавливаться. Элемент
jsp:useBean
должен предшествовать использованию элемента
jsp:setProperty
.
bean
будут переданы соответствующему методу установки свойств.
valueOf
соответствующего класса. Например, значение
"true"
для свойства
boolean
или
Boolean
будет конвертировано при помощи метода
Boolean.valueOf
, а значение «42» для свойства
int
или
Integer
будет конвертировано при помощи метода
Integer.valueOf
. Вы не можете одновременно использовать атрибуты
value
и
param
, но можете вообще их не использовать. Ознакомьтесь с описанием атрибута
param
, которое представлено ниже.
null
методу устанавливающему свойства. Таким образом, допустимо использование в
bean
свойств по умолчанию, переопределяя их лишь в том случае если этого требуют параметры запроса. Например, следующий фрагмент означает следующее: «установить свойство
numberOfItems
в соответствии со значением параметра запроса
numItems
, а если такой параметр в запросе отсутствует — никакие действия не выполняются.»
<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />
Если вы не используете ни
value
, ни
param
, это приравнивается к тому, как если бы вы задали имя
param
совпадающее с именем
property
. Вы можете применить этот принцип автоматического использования свойств запроса, чьи имена совпадают с именами свойств и пойти далее, задав в качестве имени свойства «
*
» и опустив параметры
value
и
param
. В этом случае сервер обработает допустимые свойства и параметры запроса, на предмет совпадения их с идентичными именами. Далее приведён пример в котором используется
bean
для создания таблицы простых чисел. Если существует параметр
numDigits
в данных запроса, он передаётся в свойство
bean
numDigits
. Аналогично для
numPrimes
.
JspPrimes.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Многократное использование JavaBeans в JSP</title>
</head>
<body>
<h1>Многократное использование JavaBeans в JSP</h1>
<jsp:useBean id="primeTable" class="hall.NumberedPrimes" />
<jsp:setProperty name="primeTable" property="numDigits" />
<jsp:setProperty name="primeTable" property="numPrimes" />
<p>
Несколько <jsp:getProperty name="primeTable" property="numDigits" />
символьных простых чисел:
<jsp:getProperty name="primeTable" property="numberedList" />
</p>
</body>
</html>
Этот элемент определяет значение свойства
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:include page="относительный URL" flush="true" />
В отличие от директивы
include
, которая вставляет файл на этапе трансляции JSP страницы, это действие вставляет файл при запросе страницы. Это приводит к некоторой потере эффективности и исключает возможность наличия во вставляемом файле кода JSP, но зато даёт существенное преимущество в гибкости.
Пример вставки содержимого четырёх файлов в JSP-страницу:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Новости</title>
</head>
<body>
<h1>Новости</h1>
<p>Вот фрагменты наших четырёх самых популярных статей:</p>
<ol>
<li><jsp:include page="news/Item1.html" flush="true"/></li>
<li><jsp:include page="news/Item2.html" flush="true"/></li>
<li><jsp:include page="news/Item3.html" flush="true"/></li>
<li><jsp:include page="news/Item4.html" flush="true"/></li>
</ol>
</body>
</html>
Это действие позволяет вам передать запрос другой статической HTML странице, сервлету или JSP странице. В отличие от действия
jsp:include
обработка актуальной страницы заканчивается. Оно использует один атрибут
page
, который должен содержать относительный
URL
и на основании которого упорядочен объект
request
. К исходным параметрам запроса, передаваемым другой странице, с помощью действия
jsp:param
можно добавить и другие параметры. Значением атрибута
page
может быть как статическое значение, так и вычисляемое в процессе запроса, что и показано на следующих двух примерах:
<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= какое-нибудьВыражениеНаJava %>" />
Также с помощью действия
jsp:forward
можно передать управление на другую страницу, но с условием, что перед вызовом этого действия ничего не было записано в выходящую буферную память (иначе будет вызвано исключение
IllegalStateException
).
Это действие предоставляет информацию типа название/значение. Данное действие используется в основном вместе со знакомыми уже действиями
jsp:include
и
jsp:forward
. Кроме этого его можно использовать и вместе с действием
jsp:plugin
. В остальных случаях использование этого действия не имеет значения. Использование
jsp:param
с действиями
jsp:include
и
jsp:forward
передаёт новым страницам исходный объект
request
, который будет расширен на новые параметры. Если Вы зададите новые значения для уже существующих параметров, то именно новые значения будут иметь преимущество. С помощью действия
jsp:params
можно задать сразу несколько параметров
Это действие позволяет вам вставить элемент OBJECT или EMBED (в зависимости от типа используемого браузера), необходимый для запуска аплетов, использующих plugin Java. Другими словами данное действие служит к генерированию HTML для вложения Java API в JSP страницу. Таким же образом можете вставлять URL для скачивания модулей для Java API от JavaSoft, который предоставляет возможность запускать аплеты внутри браузера. Форма записи данного действия выглядит следующим образом:
<jsp:plugin
type="bean|applet"
code="файл класса"
codebase="объект CodeBase"
align="расположение"
archive="список архивов"
height="высота"
hspace="горизонтальный простор"
jreversion="версия"
name="название компонента"
vspace="вертикальный простор"
width="ширина"
nspluginurl="url"
iepluginurl="url">
<jsp:params>
<jsp:param name="название1" value="значение1" />
<jsp:param name="название2" value="значение2" />
...
<jsp:param name="названиеN" value="значениеN" />
</jsp:params>
<jsp:fallback> </jsp:fallback>
</jsp:plugin>
Посмотрим на пример использования данного действия в коде аплета:
<jsp:plugin type="applet" code="Blink.class" width=300 height=100>
<jsp:params>
<jsp:param name=lbl value="Да это вкуснее, чем просто нарезанный хлеб!" />
<jsp:param name=speed value="4" />
<jsp:params>
<jsp:fallback>Ваш браузер по непонятным причинам не может запустить этот аплет </fallback>
</jsp:plugin>
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="application/xhtml+xml; charset=UTF-8"/>
<jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" omit-xml-declaration="true"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Заголовок страницы</title>
</head>
<body>
<h1>Заголовок</h1>
<p>Текст</p>
<jsp:scriptlet>
out.print(Calendar.getInstance(request.getLocale()).getFirstDayOfWeek() == Calendar.SUNDAY ?
"В вашей стране неделя начинается с воскресенья" :
"В вашей стране неделя не начинается с воскресенья");
</jsp:scriptlet>
</body>
</html>
</jsp:root>