Смекни!
smekni.com

Общие представления о языке Java 5 (стр. 63 из 68)

Так делается в примере использования оператора 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 ждёт весьма длительная работа.

Краткие итоги по главе 10

- 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. В результате удаётся очень просто и удобно осуществлять обработку данных или элементов документа, и внедрять в нужные места документа результаты обработки.

Задания

  • Написать апплет, рисующий эллипс, и использующий этот апплет HTML-документ. Проверить показ этого HTML-документа в AppletViewer и браузере.
  • Изучить работу и исходный код TomcatServletExample. Видоизменить в нём пример HelloWorld Example, обеспечив вывод документа с вашими данными: фамилией, именем, отчеством. В конце документа обеспечить вывод даты генерации этого документа. Для этого использовать объект типа Date (как преобразовать его в строку?).

Глава 11. Встроенные классы

Виды встроенных классов

Начиная с jdk 1.1 в язык Java были введены новые возможности для работы с классами, позволяющие реализовать дополнительные возможности инкапсуляции и композиции – так называемые “встроенные классы”.

Они делятся на несколько категорий:

  • Вложенные (nested) классы и интерфейсы – используются для задания совершенно самостоятельных классов и интерфейсов внутри классов. Должны при задании иметь модификатор static. Имя класса верхнего уровня используется в качестве квалификатора в пространстве имён, во всём остальном они ведут себя как обычные классы.
  • Внутренние (inner) классы – служат для создания экземпляров, принадлежащих экземплярам класса верхнего уровня. То есть их экземпляры не могут существовать вне объектов верхнего уровня. Не допускается создания методов класса или переменных внутреннего класса. Использование внутренних классов позволяет реализовать в Java большинство возможностей модулей из процедурных языков программирования – в этом случае в качестве модуля выступает внешний класс.
  • Локальные (local) классы – задаются внутри блоков программного кода в методах или блоках инициализации. Они носят вспомогательный характер, и область видимости и жизни экземпляров этих классов ограничивается соответствующим блоком программного кода. Как и в случае внутренних классов, это позволяет реализовать в Java возможности модулей из процедурных языков программирования. И в этом случае в качестве модуля также выступает внешний класс.
  • Анонимные (anonimous) классы – совмещают декларацию, реализацию и вызов. Не имеют ни имени, ни конструктора. Их обычно используют в обработчиках событий.

Вложенные (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.

Реализовывать вложенный интерфейс можно в постороннем классе – при этом имя интерфейса квалифицируется именем внешнего класса. Если же реализация идёт в самом внешнем классе, квалификация именем этого класса не требуется.