Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 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 er­rorPage="error.jsp"%> — указывает на наличие JSP-файла — обработ­чика ошибок. В указанном файле, используя директиву <%@ Page %>, атрибуту isErrorPage присвоить значение true. В самом файле (er­ror.jsp) содержатся следующие строки <%@ page isErrorPage= "true"%> какой-то код (HTML, JSP, Java), <%=exception.toString() %> название возникшей исключительной ситуации. Если необходимо отра­зить состояние стека на момент возникновения исключительной ситуа­ции то имеет смысл воспользоваться следующим оператором: <% ex­cepton .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() и getParameterValu­es() объекта 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="userName­TextField"><BR><BR> </FORM> <% if (request.getParameter("userNamуTextField" != null) {%> <%@ include file="ответ.jsp"%> <% }%> <P><BR></P> </BODY></HTML>
Кроме текстовых полей HTML содержит и другие формы, заполняе-
мые пользователем в момент посещения страницы. Для передачи не­скольких параметров существуют группы HTML-элементов CHECKBOX, TEXTAREA и т. д. При получении параметров, переданных через эти эле­менты, можно воспользоваться методами getParmetrs() и getParameter­Values().
<!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="userName­TextField"><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. При создании тега часть операций обработки пе­рекладывается на внутренние механизмы создаваемого тега. Посколь­ку пользовательский тег должен обрабатываться стандартным JSP­engine, поэтому создаваемый тег должен унаследовать один из двух интерфейсов: 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, поскольку данный тег не имеет тела. Метод do­EndTag() возвращает значение 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;}