Так делается в примере использования оператора out в JSTL Example. Используется пользовательский объект c (сокращение от customer – “покупатель”), задаваемый как prefix="c" , и оператор out, заданный в библиотеке taglib по адресу uri="http://java.sun.com/jsp/jstl/core":
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>Отметим, что соответствующие библиотеки уже добавлены в проект. Для примера out это пакет org.apache.taglibs.standard.tag.el.core .
После запуска данного приложения в появившемся документе в списке Examples это первый пример - General Purpose Tags. При переходе по данной гиперссылке мы получаем пример
General-Purpose Tags Examples
<out>
При нажатии на “шестерёнки” получаем результат работы программы:
Пример использования оператора c:out
Соответствующий фрагмент исходного кода этого JSP-документа выглядит так:
<table border="1">
<c:forEach var="customer" items="${customers}">
<tr>
<td><c:out value="${customer.lastName}"/></td>
<td><c:out value="${customer.phoneHome}"
default="no home phone specified"/></td>
<td>
<c:out value="${customer.phoneCell}" escapeXml="false">
<font color="red">no cell phone specified</font>
</c:out>
</td>
</tr>
</c:forEach>
</table>
В этом примере используется объект customer – “покупатель”, заданный в файле Customer.java, расположенном в пакете org.apache.taglibs.standard.examples.beans . То есть самом первом в Source Packages пакете примера. А также объект customers – “покупатели”, заданный в файле Customers.java, расположенном в том же пакете.
В классе customer заданы поля lastName, phoneHome, phoneCell и другие. А также ряд методов, которые также можно вызывать в сценарии. С помощью оператора forEach (заданного аналогично оператору out) осуществляется перебор всех объектов customer, агрегированных в объект customers - список покупателей. А с помощью тега c:out осуществляется вывод необходимой информации в документ.
В JSP имеется огромное количество возможностей. Это тема для отдельной книги. В данном учебном пособии данная технология затронута совсем немного – просто в порядке информирования о её существовании и некоторых возможностях.
Точно так же, для программирования в локальных и глобальных компьютерных сетях в пакете java.net имеется огромное количество средств разного уровня, описание которых требует отдельной книги. Это и Web-адресация (классы URL, HttpURLConnection, URI, JarURLConnection, URLClassLoader), и IP-адресация (классы InetAddress, InetAddress4, InetAddress6, NetworkInterface ), и управление соединениями через сокеты (классы Socket, SocketAddress, InetSocketAddress, ServerSocket, SocketPermission). Классы NetPermission, Authentificator и PasswordAuthentification обеспечивают поддержку авторизации (запрос и обработку имени и пароля).
Кроме упомянутых возможностей пакета java.net имеется дистрибутив j2me, в котором поставляются средства разработки программного обеспечения для “тонких” аппаратных клиентов – то есть таких, которые обладают малыми по сравнению с персональными компьютерами ресурсами. В первую очередь - для сотовых телефонов и наладонных компьютеров. Это также тема для отдельной книги.
Не менее важной и объёмной темой является сетевое программирование баз данных.
Так что желающих освоить даже основы сетевых возможностей Java ждёт весьма длительная работа.
- HTML - язык разметки гипертекста. Гипертекст (“сверхтекст”) – это текст, содержащий дополнительные возможности, в частности – гиперссылки. Документ, написанный на языке HTML, представляет собой текстовый файл, содержащий собственно текст, несущий информацию пользователю, и теги разметки (murkup tags).
- Теги представляют собой определенные последовательности символов, заключенные между знаками '<' и '>'. Они предназначены для форматирования и разметки документа. Теги бывают парные ("контейнеры") и непарные. Действие парного тега начинается с открывающего тега и заканчивается при встрече соответствующего ему закрывающего, признаком которого является символ " / ".
- При ссылке на документ, находящийся на другом сервере, необходимо указать адрес (URL - 'Uniform Recourses Location') этого документа: сетевой адрес сервера и путь к этому документу на сервере. Если документ находится на том же сервере, но в другой папке, достаточно указать только путь к этой папке. Гипертекстовая ссылка имеет вид <a href="имя_файла">текст_ссылки</a>
- Для создания обычного апплета требуется задать класс, являющийся наследником класса java.applet.Applet, а для апплетов, использующих компоненты Swing и/или библиотеку Sun JFC (Java Foundation Classes) - наследником класса javax.swing.JApplet.
- В классе апплета требуется переопределить ряд методов - init, start, update, paint, getAppletInfo, stop, destroy.
- Сервлеты – это приложения Java , запускаемые со стороны сервера. Они имеют возможности доступа к файловой системе и другим ресурсам сервера через набор управляющих конструкций, предопределённых в рамках пакета javax.servlet и технологии JSP.
- Технология JSP заключается в наличии дополнительных конструкций в HTML- или XML-документах, которые позволяют осуществлять вызовы сценариев (“скриптов”), написанных на языке Java. В результате удаётся очень просто и удобно осуществлять обработку данных или элементов документа, и внедрять в нужные места документа результаты обработки.
Глава 11. Встроенные классы
Начиная с jdk 1.1 в язык Java были введены новые возможности для работы с классами, позволяющие реализовать дополнительные возможности инкапсуляции и композиции – так называемые “встроенные классы”.
Они делятся на несколько категорий:
Вложенные (nested) классы и интерфейсы
Вложенный класс задаётся во внешнем классе так:
class ИмяВнешнегоКласса{
тело внешнего класса
static class ИмяВложенногоКласса{
тело вложенного класса
}
продолжение тела внешнего класса
}
Экземпляры вложенного класса, а также методы класса и поля класса получают в имени квалификатор – имя класса верхнего уровня.
Например, доступ к полю идёт как
ИмяВнешнегоКласса.ИмяВложенногоКласса.имяПоля,
а обращение к методу класса – как
ИмяВнешнегоКласса.ИмяВложенногоКласса.имяМетода(список параметров).
Пусть у нас имя внешнего класса C1, а вложенного C_nested. Тогда создание экземпляра вложенного класса может идти, например так:
C1.C_nested obj=new C1.C_nested();
Особенностью использования вложенных классов является то, что во внешнем классе могут быть поля, имеющие тип вложенного класса. При этом для данного случая квалификацию именем внешнего класса использовать не надо. Отметим, что в этом случае применяется то же правило, что и при доступе к обычным полям или методам, заданным в классе.
Пример:
class C1{
private C_nested obj1;
static class C_nested {
тело вложенного класса
}
C_nested getNested(){
return obj1;
}
}
При компиляции для вложенных классов создаются самостоятельные классы .class, имеющие имя имяВнешнегоКласса$имяВложенногоКласса.class . Точно такое же имя выдаётся в методах объектВложенногоКласса.toString() или объектВложенногоКласса.getClass().getName(). А вот объектВложенногоКласса.getClass().getCanonicalName() возвращает имя вложенного класса через точку.
Задание вложенного интерфейса аналогично заданию вложенного класса:
class ИмяВнешнегоКласса{
тело внешнего класса
interface ИмяВложенногоИнтерфейса{
объявление констант и заголовков методов
}
продолжение тела внешнего класса
}
Вложенные интерфейсы считаются имеющими модификатор static.
Реализовывать вложенный интерфейс можно в постороннем классе – при этом имя интерфейса квалифицируется именем внешнего класса. Если же реализация идёт в самом внешнем классе, квалификация именем этого класса не требуется.