Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 2 Java Server Page 121
обрабатывать параметры, можно использовать указание параметров в
специальном субтеге <jsp:param>.
Для передачи параметром запроса только в динамический файл
можно воспользоваться включением параметров <jsp:param> с указанием имени и значения передающихся параметров.
Атрибуты <jsp:include>:
page — указывает местоположение включаемого файла, также можно использовать какое-либо выражение для получения относительного
адреса (<%= выражение %>);
flush — обязательно должен быть указан и иметь значение "true";
<jsp:param name="имя параметра" value="значение параметра |
<%= выражение %>" /> параметры передаются только в динамический
(исполняемый) файл. Возможно использование нескольких параметров,
при этом для каждого необходимо указать тег <jsp:param>.
11.6. Надстраиваемые элементы для Web-браузеров, использование
òåãà <jsp:plugin>
JSP представляет много способов генерации HTML-страниц. Для избежания проблем между различными реализациями JVM каждый браузер имеет собственную версию как JVM, так JRE, которые распространяются в виде надстройки plug-in компанией JavaSoft для различных версий Web-браузеров. Синтаксис подключения внешних модулей
используемый в Интернет Explorer и Netscape, различается между собой. Тег <OBJECT> используется в IE и предназначен для подключения ActiveX элементов и других элементов, в Netscape соответственно
используется <EMBED>. Servlet, сгенерированный на основе JSP, использует тег <jsp:plugin> для подключения внешних объектов и генерирует ответ, используя браузерозависимые теги <OBJECT> или
<EMBED>. Тег <jsp:plugin> предназначен для подключения апплета
или боба.
Многие атрибуты, используемые в данном теге, очень похожи на атрибуты тега <applet>, описанного в последних версиях популярных
Web-браузеров:
<jsp:plugin
type=applet
code="examples.applets.PhoneBook1"
codebase="/classes/" height="800" width="500"
name ="имя класса "
arhive=" имя архива"
align=" bottom|top|left|right|middle"
height =" размер в пикселях"
width =" размер в пикселях"
hspace=" размер в пикселях"
vspace=" размер в пикселях"
jreversion="1.1"
nspluginurl="http://java.sun.com/products/plugin/1.1.3/\

122 Часть 2 Java Server Page
plugin-install.html"
iepluginurl="http://java.sun.com/products/plugin/1.1.3/\
jinstall-113-win32.cab#Version=1,1,3,0" >
<jsp:params >
<jsp:param name="username" value="user"/>
<jsp:param name="login" value="****"/>
</jsp:params>
<fallback>
<font color=#FFEEFF>Sorry, cannot run java applet!!</font>
</fallback>
</jsp:plugin>
Первые три из указанных атрибутов являются обязательными при
работе с данным тегом, другие добавочные.
type — тип встраиваемого объекта, которым может быть апплет или
bean, данный атрибут не имеет значений по умолчанию
code — имя Java-класса, который будет встраиваться, обязательно
указание расширения .class в данном атрибуте. Данный класс будет искаться в директории, указанной в атрибуте codebase.
codebase — указывает имя директории или путь к ней.
Добавочные атрибуты можно не указывать.
name — имя аплета или боба.
Arhive — путь к архиву или архивам, содержащим данный класс.
Атрибуты выравнивания расположения:
Align — местоположение объекта, апплета или боба, Bottom| Top |
Left | Right | Middle.
Атрибуты размеров встраиваемого объекта:
height, widht — задают размер объекта в пикселях.
Hspace, Vspace — задают размер пространства в пикселях слева и
справа, сверху и снизу от объекта.
Jreversion — указывает номер версии Java runtime Enviroment
(JRE), необходимый для выполнения аплета или боба, по умолчанию
значение соответствует версии 1.1. Параметр можно заменить на 1.2 при
апплетном соединении с ревером таких новомодных вещей, как RMI,
JDBC, EJB или JNDI.
•
nspluginurl — относительный адрес, где находится plugin для Ne-
tscape Navigatorjreversion="1.2":
nspluginurl="http://java.sun.com/products/plugin/1.2/\
plugin-install.html"
•
iepluginurl — относительный адрес, где находится plugin для Ин-
тернет Explorer:
iepluginurl="http://java.sun.com/products/plugin/1.2/\
jinstall-12-win32.cab"
Для данных атрибутов относительный адрес должен включать имя
протокола передачи и номер порта.
<jsp:params> параметры, передаваемые в апплет или боб; для ука-
зания нескольких передаваемых параметров можно воспользоваться
следующей конструкцией:
<jsp:params >

Часть 2 Java Server Page 123
<jsp:param name="username" value="user"/>
</jsp:params>
Name — соответсвенно имя передаваемого параметра.
Value — значение передаваемого параметра.
Прочитать данный параметр можно, воспользовавшись методом ja-
va.applet.Applet getParametr().
<jsp:fallback> — сообщение для пользователя, если plugin не может
стартовать по каким-то причинам, если же не работает сам апплет или
боб, plugin обычно выводит соответствующие сообщение во всплывающем окне.
Глава 12. Использование комментариев в JSP
Всякий уважающий себя программист считает ниже своего достоин-
ства использовать комментарии в создаваемом им приложении. Аргумент один — все, что создавалось с трудом, должно и пониматься с трудом. И всетаки комментарии бывают очень полезными, особенно при переписывании программы через десятки лет, — приятно прочесть
комментарии отроческих лет.
В JSP используются два вида комментариев: первый тип — обычные
HTML-комментарии, начинающиеся с <!—, другой является частью
JSP-кода и начинается с <%—. Ниже представлены примеры комментариев, используемых в JSP:
<!— какой-либо HTML-комментарий—>
<%— как-то JSP-комментарий—%>
Синтаксическая разница между данными конструкциями коммента-
риев заключается в использовании разных знаков при открывающихся
и закрывающихся угловых скобках тега. Существует несколько возможностей использования комментариев в JSP-страницах.
Можно также создать комментарии, содержащие динамически фор-
мируемые данные:
<!—комментарий <%= expression %> еще коментарий ->
JSP-комментарий игнорируется JSP-транслятором, комментарий мо-
жет встраиваться в любом месте программы.
HTML-комментарий. Является обычным комментарием HTML и не
отражается в браузере.
Для замены используемых элементов комментариев можно восполь-
зоваться следующими конструкциями:
<\% — данным элементом можно заменить открывающийся тег JSP
"<%";
%\> — данный является альтернативой закрывающемуся тегу "%>".
Кроме комментариев HTML- и JSP-комментариев, в скриплетах по-
зволительно использовать двойной прямой слэш (//).

124 Часть 2 Java Server Page
Глава 13. Обработка исключительных ситуаций
Существует несколько типов ошибочных ситуаций, связанных с раз-
ными причинами в момент выполнения JSP. К первому типу можно отнести синтаксические ошибки в скриптовых конструкциях, используемых в
JSP. Обычно проверка осуществляется на стадии трансляции, но значительно легче воспользоваться специальными текстовыми редакторами,
такими как Scrapbook из пакета VisualAge for Java фирмы IBM, способными выполнять синтаксический контроль в момент написания приложения. Следующим типом являются алгоритмические и ошибки исполнения.
Для данного типа ошибочных ситуаций существует предопределенный
класс Execption. Как и все приложения Java, ошибки наследуются от двух
основных классов java.lang.Exception, который описывает исключительные ситуации и java.lang.Error описывающий ошибки. Ошибки обычно
возникают в исполняемой среде JVM, в то время как исключения являются запрограммированными действиями, возникающим во время выполнения программы. Исключения обычно могут перехватываться для обработки оператором catch. Все вышеуказанные типы ошибочных ситуаций в
большей степени являются ошибками использования языка Java. Но поскольку Java является основным языком при создании JSP, то необходимо учитывать и возможность возникновения ошибок на данном этапе.
Другая причина возникновения ошибки может возникнуть в момент
компилирования JSP. Обычно ошибки данного типа возникают при
трансляции Java-кода и являются ошибками компиляции, в частности,
при работе с предопределенными переменными и встроенными объектами, именно по этой причине логичнее использовать уже готовые классы
в виде bean. Еще одной неприятной ошибкой может стать вполне безобидное решение расширить создаваемую страницу, используя атрибут
extends директивы <%@ Page %>. Существуют также ситуации неправильного обращения к JSP-странице, сообщения об ошибках данного типа отражаются в браузере клиента. Самой тривиальной является просто
отсутствие нужного файла по указанному пути. Error 404 — Not Found.
С кода 500 начинаются ошибки сервера, тоже являющиеся причиной неисполнения JSP. Очень часто возникает сообщение Error 503 — Service
Unavailable, говорящее об отсутствии аргументов в JSP-компиляторе.
Следующий тип ошибок связан непосредственно с выполнением JSP.
Иногда может возникнуть нестандартная ситуация, например, пользователь не ввел необходимые параметры или ввел их неправильно. В хорошо написанном приложении обязательно должна быть предусмотрена
возможность обработки исключительных ситуаций. Исключения достаточно легко обрабатываются в JSP-приложениях, для этого можно создать специальную страницу error page, где будут отражены все исключительные ситуации и имена классов, в которых они возникли. Также существует встроенный объект exception, ñ которым можно
работать, как с любым встроенным объектом. При создания JSP-приложения можно включить собственный обработчик исключительных ситуации, блок try...catch, или же указать в директиве <%@ Page %> значение атрибута errorPage с указанием имени JSP-файла, отражающим

Часть 2 Java Server Page 125
возникающие в момент исполнения программы ошибки. ".<%@ page errorPage="error.jsp"%> — указывает на наличие JSP-файла — обработчика ошибок. В указанном файле, используя директиву <%@ Page %>,
атрибуту isErrorPage присвоить значение true. В самом файле (error.jsp) содержатся следующие строки <%@ page isErrorPage=
"true"%> какой-то код (HTML, JSP, Java), <%=exception.toString() %>
название возникшей исключительной ситуации. Если необходимо отразить состояние стека на момент возникновения исключительной ситуации то имеет смысл воспользоваться следующим оператором: <% excepton .printStackTrace() ; %>. Это очень полезный оператор для разработчика, но не имеющий ничего нужного для конечного пользователя.
Приблизительно страница по обработке исключительных ситуаций
может выглядеть следующим образом:
<%@ page isErrorPage="true" %>
<HTML><BODY><H1>Error Page</H1>
<BR><H2>Received the exception:<BR>
<FONT color=red>
< exception.toString() %>
</FONT></H2></BODY></HTML>
Основным элементом здесь является указание директивы <%@pa-
ge%> в самой первой строке. Остальные строки формируют внешний
вид HTML-страницы. Атрибут isErrorPage указывает на то, что данная
страница может обрабатывать возникающие в момент исполнения JSP
ошибки. Пятая строка выводит в HTML-страницу описание возникшей
исключительной ситуации. Шестая строка представляет набор закрывающихся HTML тегов.
Достаточно интересная ситуация возникает при указании на одной
странице невозможности обработки исключительных ситуации, т. е. отсутствие значения true у атрибута isErrorPage и одновременное использование встроенного объекта execption.
Более подробную информацию о каждой исключительной ситуации
можно узнать в документации, поставляемой вместе с JDK.
Наиболее часто встречающиеся сообщения об ошибках в страницах
JSP являются указания на отсутствие значения параметра.
При выполнении JSP самой распространенной ошибкой является
присутствие у метода или параметра значения null, т. е. отсутствие как
такового значения у параметра. Другой распространенной ошибкой, особенно это касается работы с базами данных, является выход за границы
массива, при получении слишком большого количеств передаваемых
параметров в обоих случаях возникает исключительная ситуация. При
использовании методов getParameter() или getParameterValues() при
получении параметров объекта request может возникнуть исключительная ситуация, для предотвращения возможной ошибки необходимо
сначала проверить передаваемые параметры на наличие значений.
Еще одной часто встречающейся исключительной ситуацией являет-
ся OutOfMemory, возникающая при нехватке памяти, обычная ситуация при которой возникает нехватка памяти в JSP, при использовании
специфических тегов работающих с коллекциями данных.

126 Часть 2 Java Server Page
Глава 14. Обработка HTML-форм
Обычная HTML-форма состоит из трех частей: закрывающий и от-
крывающий форму теги <BR> </FORM>, внутренний элемент и
команда отправки значений данной формы.
Клиент, работающий с сетевыми данными, для получения информа-
ции обычно использует браузер. Браузер просматривает только статистические страницы, не считая специальных дополнений, которые позволяют расширить возможности браузера. Чаще всего информация
отображается в виде HTML-страницы. JSP имеет возможность обрабатывать формы HTML (текстовые поля, кнопки-переключатели и т. д.), с
которыми работает пользователь. Обычно для обработки HTML-форм в
теле JSP-страницы используются специальные методы, которые или
самостоятельно обрабатывают данные поля, или же отправляют в другие программы (servlet, bean).
Информация, которую вводит пользователь, сохраняется в request
объекте, посылаемый на сервер для дальнейшей обработки. Реализация
процесса обработки у разных поставщиков JSP-движка осуществляется
по-разному, но принцип остается одинаковым. Клиент посылает запрос,
сервер обрабатывает запрос и возвращает клиенту ответ. Созданием
формы ответа занимается JSP-страница, на которую был послан запрос.
В JSP обработчиком клиентской информации могут выступать два
элемента: либо указанный в теге <jsp:useBean> объект, либо один из
встроенных объектов. Допускаются и другие варианты обработки клиентского запроса, например, создать собственный обработчик или просто переслать информацию в другой источник.
При использовании bean необходимо произвести следующие действия:
На первом этапе создается JSP-файл, имеющий в своем теле HTML-
формы, такие, как текстовые поля. Каждая форма должна иметь собственное имя.
На следующей стадии пишется .java файл, описывающий bean, со
своими свойствами и методами getXXX(), и setXXX ().
После успешной компиляции или при условии уже существующего
bean, используя JSP-тег <jsp:useBean>, достигается возможность использования свойств боба в JSP-странице.
Затем используют JSP теги <jsp:setProperty> и <jsp:getProperty>
для установки и получения свойств bean.
Запрос. JSP-файл
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!— Sample JSP page using a JavaBean —>
<HTML><HEAD>
<META name="GENERATOR" content="IBM WebSphere Page Designer
V3.0.2 for Windows">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>This is the page title</TITLE>
<%@ page import="someBeanUserName" session="true" isThreadSafe="true"
isErrorPage="false" %>
</HEAD><BODY>

Часть 2 Java Server Page 127
<jsp:useBean id="username" class="someBeanUserName" scope="page" />
<jsp:setProperty name="username" property="*"/>
<P><BR></P>
<FORM method="POST">
<INPUT size="20" type="text" name="userNameTextField"><BR><BR>
</FORM><P><BR></P></BODY></HTML>
Для присвоения свойствам bean необходимых значений имя методов
setXXX()/getXXX() должно совпадать с именами HTML-форм, из которых передаются данные.
Если имена методов setXXX()/getXXX() и HTML-форм не совпада-
ют, то необходимо указывать каждому передаваемому параметру определенное значение.
public SomeBeanUserName {
private String userName;
String getuserNameTextField(){ return UserName;}
void setuserNameTextField(String userNametextFiled ){
if(userNameTextField != "")
UserName=name;}
}
Более детальную информацию о создании и проектировании JavaBe-
an можно получить из спецификации фирмы SUN.
Теперь для получения данных из bean JSP должен содержать тег
<jsp:getProperty>
Ответ. jsp файл.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!— Sample JSP page using a JavaBean —>
<HTML><HEAD>
<META name="GENERATOR" content="IBM WebSphere Page Designer
V3.0.2 for Windows">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>This is the page title</TITLE>
<%@ page import="someBeanUserName" session="true" isThreadSafe="true"
isErrorPage="false" %>
</HEAD><BODY>
<jsp:useBean id="username" class="someBeanUserName" scope="page" />
<i> ìîé äðóã <jsp:getProperty name="username" property="username"/>
</i>
</BODY></HTML>
Для получения ответа необходимо создать ссылку на файл ответов.
Иногда можно исключить использование боба. Необходимо просто
включить соответствующие методы getParameter() и getParameterValues() объекта request непосредственно в тело JSP-страницы.
Запрос.jsp файл, без использования bean, применяя методы встроен-
ного объекта request, будет выглядеть следующим образом:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">

128 Часть 2 Java Server Page
<!— Sample JSP page w/o using a JavaBean —>
<HTML><HEAD>
<META name="GENERATOR" content="IBM WebSphere Page Designer
V3.0.2 for Windows">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>This is the page title</TITLE>
</HEAD><BODY>
<P><BR></P>
<FORM method="POST"><INPUT size="20" type="text" name="userNameTextField"><BR><BR>
</FORM>
<% if (request.getParameter("userNamуTextField" != null)
{%>
<%@ include file="ответ.jsp"%>
<% }%>
<P><BR></P>
</BODY></HTML>
Кроме текстовых полей HTML содержит и другие формы, заполняе-
мые пользователем в момент посещения страницы. Для передачи нескольких параметров существуют группы HTML-элементов CHECKBOX,
TEXTAREA и т. д. При получении параметров, переданных через эти элементы, можно воспользоваться методами getParmetrs() и getParameterValues().
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!— Sample JSP page using a JavaBean —>
<HTML><HEAD>
<META name="GENERATOR" content="IBM WebSphere Page Designer
V3.0.2 for Windows">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>This is the page title</TITLE>
</HEAD><BODY>
<P><BR></P>
<FORM method="POST"><INPUT size="20" type="text" name="userNameTextField"><BR><BR>
</FORM>
<INPUT type="checkbox" name="test">test of checbox<BR>
<INPUT type="checkbox" name="test">test of checkbox </FORM>
<% String vals[] = (String []) req.getParameterValues("test");
if (vals != null) {
for(inti=0;i<vals.length; i++)
out.println("<B>" + vals[i] + "</B><BR>");} %>
<P><BR>
<FORM>
<INPUT type="text" name="testtext"> <BR>
<INPUT type="text" name="othertext">
<INPUT type="submit" values="submit"></FORM>
<%java.util.Properties inputHTMLform=new Properties();

Часть 2 Java Server Page 129
java.util.Enumeration namesHTMLform=request.getParameterNames();
while (namesHTMLform.hasMoreElements()){
String HTMLnames=(String) namesHTMLform .nextElemenr();
String valuesHTML=request.getParameterValues(HTMLnames)[0];
InputHTMLform.put(HTMLnames, valuesHTML);}%>
<%= InputHTMLform .list()%>
</P>
</BODY></HTML>
Глава 15. Миграция с ранней версии 0.91 к 1.0
В версии JSP 1.0 содержатся следующие дополнения и изменения, не
указанные в более ранней версии JSP .91 спецификации:
Теги новой версии используют XML-формат. Например, если в ран-
ней версии использовался <BEAN> тег, то в новой версии используется
следующая конструкция <jsp:useBean>. То же касается и расширенных
тегов WebSphere, например, тег <REPEAT> теперь определяется как
<tsx:repeat>.
Теги стали регистрозависимыми.
Стандартные теги именуются с использованием различных буквен-
ных регистров, как это принято в Java-коде, например, <jsp:useBean>.
SSI-серверные объекты заменены директивой <%@ include %>.
Для работы с установленным JavaBean используются новые теги
<jsp:useBean >, а для получения и установления свойств JavaBean реализованы теги <jsp:getProperty> и <jsp:setProperty>.
Тег Jsp:include расширен для включения ресурсов из других файлов.
Добавлен тег jsp:plugin.
Добавлена возможность использования LOOP, ITERATE, INCLUDEIF
и EXCLUDEIF тегов.
<SCRIPT> </SCRIPT> теги заменены на <%! ... %>.
Версия не вносит никаких значительных изменений относительно
версии 1.0, за исключением новой директивы по работе с пользовательским тегами <%@taglib%> и соответственно поддержке в JSP тегов, созданных пользователем.
Глава 16. Создание пользовательских тегов
Расширение стандартных тегов JSP дает разработчику больше воз-
можностей создавать более гибкие приложения за счет многократного
использования часто встречающихся рутинных операций и превращения таковых в специальные теги. Теги, созданные пользователем, ничем
не отличаются от стандартных и при этом имеют свои собственные характеристики.
Обычный пользовательский тег написан на Java и является гото-
вым .class файлом для обработки обработчиком (JSP-engine). Пользовательский тег можно сравнить с макрокомандой. JSP не видит разницы между тегами как пользовательскими, так и стандартными.

130 Часть 2 Java Server Page
В момент синтаксической проверки JSP-engine проверяет наличие необходимых классов для своих собственных тегов и указанных в строке uri, тега TegLib. При создании тега часть операций обработки перекладывается на внутренние механизмы создаваемого тега. Поскольку пользовательский тег должен обрабатываться стандартным JSPengine, поэтому создаваемый тег должен унаследовать один из двух
интерфейсов: BodyTeg или Teg. Выбор интерфейса определяет выбор
создаваемого тега. Существует два типа пользовательских тегов, доступных в JSP.
16.1. Empty-tag
Первый (empty-tag) не содержит никакой информации между отры-
вающими и закрывающими элементами тега, т. е. не имеет тела:
<mytaglib:newtag attr1="aaa" attr2="bbb" ... />
Класс, реализующий основной интерфейс javax.servlet.jsp.ta-
•
gext.Tag, содержит несколько методов для создания и управления
(Life-cycle) пользовательским тегом. Основными являются методы
doStartTg() и doEndTag().
Работу основных методов можно проиллюстрировать следующим кодом:
1. ATag t = new ATag();
2. t.setPageContext(...);
3. t.setParent(...);
4. t.setAttribute1(value1);
5. t.setAttribute2(value2);
6. t.doStartTag();
7. t.doEndTag().
Как обычно, первая строка создает объект и выделяет под него па-
мять, setPageContext устанавливает свойства системного окружения,
проще говоря, свойства страницы. В третьей строке указывается родительский тег, если таковой имеется. Дальше идет установка атрибутов
тега. Используя пару setXXX()/getXXX(), атрибутам присваиваются
значения. Значения, присваиваемые атрибутам, могут быть или строковыми константами, или объектами, полученными при помощи методов
объекта request. И наконец, определяются методы начала обработки тега и завершения, последние две строки. Метод doStartTag() возвращает
значение SKIP_BODY, поскольку данный тег не имеет тела. Метод doEndTag() возвращает значение EVAL_PAGE, если значения атрибутов
тега используются на JSP-странице, в противном случае используется
значение SKIP_PAGE.
Простой тег, отражающий строку:
public SimpleTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello.");
} catch (Exception e) {
throw new JspTagException("SimpleTag: " + e.getMessage());}
return SKIP_BODY;}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
