javax. servlet. http. HttpServletResponse res)

throws javax. servlet. ServletException, java. io. IOException

{

res. setContentType("text/html");

PrintWriter out = res. getWriter();

String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//"+

"DTD HTML 4.0 Transitional//EN\">\n";

out. println(docType + "<HTML>\n" +

"<HEAD><TITLE>File upload</TITLE></HEAD>\n"+

"<BODY bgcolor='#ccdddff'>\n");

try

{

//проверка пришел ли запрос в multipart формате

if(isMultipartFormat(req))

{

//разбор формата multipart и помещение информации //из запроса в поля объекта класса PostData

PostData multidata=new PostData(req);

//извлечение посланной информации

String fileDescription=

multidata. getParameter("klient");

com. ibm. useful. http. FileData tempFile=

multidata. getFileData("myfile");

if (tempFile!=null)

{

saveFile(tempFile);

out. println("<H1>Done</H1>\n");

}

}

}

catch(Exception e)

{System. out. println(e. toString());}

out. println("</BODY></HTML>");

out. close();

}

//функция, проверяющая пришел ли запрос в формате multipart

private boolean isMultipartFormat(HttpServletRequest req)

throws javax. servlet. ServletException,

java. io. IOException

{

String temptype=req. getContentType();

if(temptype. indexOf("multipart/form-data")!=-1)

return true;

else return false;

}

// функция, сохраняющая пришедший файл

НЕ нашли? Не то? Что вы ищете?

// на диск в каталог "c:\temp"

private void saveFile(com. ibm. useful. http. FileData tempFile)

throws IOException

{

java. io. File f = new java. io. File

("c:\\temp\\" + tempFile. getFileName());

FileOutputStream fos = new FileOutputStream(f);

fos. write(tempFile. getByteData());

fos. close();

}

}

Апплет как интерфейс к сервлету

Альтернативой передачи данных сервлету с помощью HTML-форм является использование для этих целей апплетов. Этот подход позволяет разрабатывать более сложный пользовательский интерфейс для представления вводимых данных. Также неоспоримым преимуществом такого подхода является использование одной и той же технологии программирования для разработки и серверной части системы (сервлеты), и клиентской части (апплеты). Для такой передачи данных используется объект класса URL.

Известно, что данные HTTP-запроса могут передаваться по сети с помощью двух методов передачи данных – GET и POST. При передаче параметров методом GET данные передаются в адресной строке. В этом случае схема вызова сервлета и передачи данных в него выглядит так:

// пусть имена параметров и их значения хранятся в переменных

// name1, name2 – имена параметров,

// val1, val2 – значения параметров

String someData=name1+"="+val1+"&"+name2+"="+val2;

try

{

//создание URL на сервлет

URL servURL=new URL("servlet/serv1"+"?"+someData);

// загрузка сервлета

getAppletContext().showDocument(servURL);

}

catch(MalformedURLException e)

{

}

Получение данных сервлетом при такой передаче параметров осуществляется так же, как если бы они передавались из HTML-формы.

Интересным является случай, когда апплет не перестает работать после передачи данных сервлету, а принимает от сервлета некоторый ответ и продолжает работу далее. Получается, что сервлет срабатывает "на втором плане", принимая данные от апплета и обрабатывая их. Это можно сделать только с помощью метода POST.

Для передачи данных сервлету методом POST и для получения ответа апплет должен выполнять следующие действия:

1. Создать объект класса URL, содержащий ссылку на домашний хост апплета:

URL currentPage=getCodeBase();

String protocol=currentPage. getProtocol();

String host=currentPage. getHost();

int port=currentPage. getPort();

URL dataURL=new URL(protocol, host, port,"/servlet/myServlet");

2. Создать объект класса URLConnection для получения входных и выходных потоков апплета:

URLConnection conn=dataURL. openConnection();

3. Дать браузеру указание не кэшировать результаты.

conn. setUseCaches(false);

4. Сообщить системе, что апплет будет не только читать, но и посылать данные:

conn. setDoOutput(true);

5. Создать объект класса ByteOutputStream для буферизации данных, которые посылаются сервлету (для дальнейшего определения размера посылаемых данных):

ByteArrayOutputStream byteStream=new ByteArrayOutputStream(100);

6. Присоединить выходной поток к объекту класса ByteOutputStream:

PrintWriter out=new PrintWriter(byteStream, true);

7. Поместить данные в буфер:

String someData=name1+"="+val1+"&"+name2+"="+val2;

out. print(someData);

out. flush();

8. Задать заголовок Content-Length (обязателен при передаче параметров методом POST):

conn. setRequestProperty("Content-Length",

String. valueOf(byteStream. size()));

9. Задать заголовок Content-Type.

conn. setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");

10. Послать данные:

byteStream. writeTo(conn. getOutputStream());

11. Открыть входной поток для получения ответа:

BufferedReader in=new BufferedReader(new

InputStreamReader(conn. getInputStream()));

12. Прочитать результат:

String line;

while((line=in. readLine())!=null)

// какие-то действия с полученным ответом

Сервлет в этом случае должен принимать и обрабатывать данные таким же образом, что и в случае приема символьных данных от HTML-формы.

Приведем пример взаимодействия апплета и сервлета. Апплет отсылает серверу информацию, вводимую в текстовое поле, а сервлет записывает информацию в заданный файл, после чего возвращает строку о том, что операция прошла успешно.

// апплет, из которого передаются данные

import java. io.*;

import java. applet.*;

import java. awt.*;

import java. awt. event.*;

import .*;

public class App extends Applet implements ActionListener

{

// записывается посылаемая информация

TextField info;

// кнопка отсылки данных

Button submitButton;

// область отображения ответа сервлета

TextArea result;

public void init()

{

add(new Label("Введите информацию"));

info =new TextField(50);

add(info);

submitButton=new Button("Отослать");

submitButton. addActionListener(this);

add(submitButton);

result=new TextArea(20,50);

add(result);

}

public void actionPerformed(ActionEvent e)

{

if(submitButton==e. getSource())

{

try

{

URL currentPage=getCodeBase();

String protocol=currentPage. getProtocol();

String host=currentPage. getHost();

int port=currentPage. getPort();

String urlStr="/servlet/MyServ";

URL dataURL=new

URL(protocol, host, port, urlStr);

URLConnection conn=dataURL. openConnection();

conn. setUseCaches(false);

conn. setDoOutput(true);

ByteArrayOutputStream byteStream=new

ByteArrayOutputStream(100);

PrintWriter out=new

PrintWriter(byteStream, true);

out. print(info. getText());

out. flush();

conn. setRequestProperty("Content-Length",

String. valueOf(byteStream. size()));

conn. setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");

byteStream. writeTo(conn. getOutputStream());

BufferedReader in=new BufferedReader(new

InputStreamReader(conn. getInputStream()));

String line;

result. setText("");

while((line=in. readLine())!=null)

result. append(line+"\n");

}

catch(Exception ee){}

}

}

}

// сервлет, получающий данные и записывающий их в файл

import java. io.*;

import javax. servlet.*;

import javax. servlet. http.*;

public class MyServ extends HttpServlet

{

public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException

{

response. setContentType("text/html;

charset=windows-1251");

PrintWriter out=response. getWriter();

BufferedReader in=request. getReader();

FileWriter file=new FileWriter("c://data. txt");

String s;

while((s=in. readLine())!=null)

file. write(s);

file. close();

out. println("Ваша информация записана");

}

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException

{

doPost(request, response);

}

}

Использование сервлетов для генерации GIF-изображений

Задача генерации изображений возникает достаточно часто в случае построения динамических рисунков, зависящих от тех или иных условий. Информация для построения картинок может выбираться из базы данных или задаваться пользователем с помощью HTML-форм. Типичным примером такой задачи является построение диаграмм.

Средствами языка Java можно создать изображение в рабочей области апплета (см. главу 3). Однако этот способ имеет один недостаток (общий для всех клиентских технологий) – зависимость от версии и настроек браузера. Есть только один способ преодолеть этот недостаток – возложить функции, выполняемые на стороне клиента, на сервер. Этот способ имеет и очевидное преимущество – генерация осуществляется в одном из стандартных форматов изображений, которые "понимают" все широко используемые браузеры (например, в формате gif).

Для создания изображения и отправки его в том или ином графическом формате в выходной поток разработаны различные пакеты классов. Мы будем использовать один из наиболее известных классов – GifEncoder (его автор Джеф Посканзер), который находится в пакете Acme (его можно найти на сайте http://www. ).

Рассмотрим сервлет, генерирующий и отсылающий клиенту изображение.

// Пример сервлета, генерирующего gif-изображение "Колобок"

import java. io.*;

import javax. servlet.*;

import javax. servlet. http.*;

import java. awt.*;

import Acme. JPM. Encoders. GifEncoder;

public class kartinki extends HttpServlet

{

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException

{

// Создадим системный объект, играющий роль окна

// (поскольку сервер никаких окон не открывает)

Frame f=new Frame();

f. addNotify();

// Зададим параметры "окна"

int width=700;

int height=330;

// Создадим объект класса Image

Image img=f. createImage(width, height);

// Создадим объект канвы для работы с графикой

Graphics g=img. getGraphics();

// Рисуем в этом объекте, все, что захотим

// Например, рисуем колобка

g. setColor(Color. yellow);

g. fillOval(300,70,150,150); //лицо

g. setColor(Color. black);

g. fillOval(340,110,15,15); //левый глаз

g. fillOval(400,110,15,15); //правый глаз

g. drawArc(325,100,100,100,0,-180); // улыбка

// Укажем MIME-тип содержимого динамически

// создаваемого документа

response. setContentType("image/gif");

// Получим доступ к выходному потоку

// Так как мы выводим бинарные данные, используем

// метод getOutputStream класса HttpServletResponse

OutputStream out1=response. getOutputStream();

// Отправим наш объект класса Image

// в gif-формате в выходной поток.

// Изображение и поток вывода передаются в качесте

// параметров в конструктор класса GifEncoder

GifEncoder encoder;

encoder = new GifEncoder(img, out1);

encoder. encode();

}

}

В результате получится следующее изображение:

Практические задания

В рамках практических занятий нужно выполнить 7 заданий на определенные темы. Для каждой темы приведено "типовое задание". Вы можете выполнять именно его, или же придумать собственный пример на данную тему (собственные примеры необходимо предварительно обсудить с преподавателем).

Задание 1

Создание апплета с графической информацией, передача параметров из HTML-страницы.

Первое задание состоит в разработке апплета, в котором с помощью функций рисования создано некоторое изображение. Кроме того, апплет должен получать и использовать параметры, переданные из HTML-страницы.

Типовое задание. Предположим, что для вашего электронного магазина требуется вывод различной информации в виде диаграмм - например, объем продаж за текущий год по месяцам, спрос на разные виды товаров и т. п. Разработайте апплет, который получает числовые данные из HTML-страницы (например, 12 чисел, представляющих собой объем продаж за 12 месяцев текущего года) и рисует диаграмму (диаграммы бывают разных видов: гистограммы, круговые, линейные, точечные, с областями, объемные и т. п.) Ясно, что саму HTML-страницу с данными для апплета можно создавать динамически – можно, например, с помощью ASP- или PHP-сценария выбрать информацию из базы данных (в данном задании это делать необязательно).

Какие темы нужно изучить, чтобы выполнить это задание?

Для выполнения данного задания необходимо изучить:

·  все темы главы 1 "Основы языка JAVA",

·  а также параграфы главы 3

"Работа с графикой",

"Передача параметров в апплет".

Кроме того, глава 2 необходима для понимания объектно-ориентированных принципов JAVA.

Задание 2

Создание апплета с элементами управления, обработка событий

Второе задание состоит в разработке апплета, содержащего, кроме изображения, элементы управления (текстовые поля, радиокнопки, флажки, списки и т. п.). Апплет должен обрабатывать события, поступающие от этих элементов управления и соответствующим образом изменять изображение.

Типовое задание. Рассмотрим тот же самый пример, что и в предыдущем задании – построение диаграммы. Предположим, что вам нужно предусмотреть настройку изображения – цвет диаграммы, наличие осей координат, тип диаграммы (гистограмма, круговая, линейная, точечная, с областями, объемная и т. п.). В этом случае элементы управления можно разместить непосредственно в апплете. При изменении значений элементов управления апплет должен перерисовывать изображение.

Какие темы нужно изучить, чтобы выполнить это задание?

Кроме главы 1 "Основы языка JAVA", для выполнения данного задания необходимо изучить тему главы 3 "AWT и обработка событий". Кроме того, глава 2 необходима для понимания объектно-ориентированных принципов JAVA.

Задание 3

Создание апплета с использованием потоков

Третье задание состоит в разработке апплета, в котором используются потоки (thread). Потоки удобно применять, например, для создания анимированного изображения.

Типовое задание. Один из примеров анимированного изображения – фейерверки. Вид фейерверка может быть любым, главное – он должен представлять собой периодически изменяющееся изображение.

Какие темы нужно изучить, чтобы выполнить это задание?

Кроме главы 1 "Основы языка JAVA", для выполнения данного задания необходимо изучить тему главы 3 "Работа с потоками". Кроме того, глава 2 необходима для понимания объектно-ориентированных принципов JAVA.

Задание 4

Создание приложения для работы с файлами

Четвертое задание состоит в разработке приложения (можно консольного), в котором предусмотрены запись/чтение данных в файл/из файла. Можно использовать классы для последовательного или произвольного доступа к файлам, класс для получения информации о файлах и каталогах, канальные потоки ввода/вывода и т. п.

Типовое задание. В качестве темы задания можно выбрать практически любой пример работы с файлами – подсчет слов в текстовом файле, сравнение двух файлов и печать несовпадающих строк и т. п.

Какие темы нужно изучить, чтобы выполнить это задание?

Поскольку это первое задание, связанное с программой-приложением, для его выполнения необходимо рассмотреть параграф главы 4 "Создаем первое приложение". О том, как работать с файлами и прочими потоками ввода/вывода, можно прочитать в параграфе "Работа с файлами". При работе с файлами не обойтись без исключений – параграф "Работа с исключениями".

Задание 5.

Создание приложения для работы с базой данных

Пятое задание заключается в создании простого приложения (консольного или оконного) для работы с базой данных. В качестве СУБД предлагается использовать mySQL.

Типовое задание. Оконное приложение для работы с базой данных может содержать выполнение какой-либо SQL-команды и просмотр ее результатов. Консольное приложение должно содержать несколько SQL-команд.

Какие темы нужно изучить, чтобы выполнить это задание?

О том, как подключаться к базам данных, можно прочитать в параграфе "Работа с базами данных". Если в качестве интерфейса для работы с базой данных вы не хотите использовать консольное приложение, то изучите параграф "Создание оконных приложений".

Задание 6

Создание сетевого приложения

Шестое задание состоит в разработке приложения с архитектурой клиент-сервер, использующего серверные и/или клиентские сокеты. Вы можете разрабатывать только серверную часть какого-либо приложения (в качестве клиентской части можно использовать telnet), или только клиентскую часть как дополнение к серверной части примеров, рассмотренных в учебнике (ATM-сервер и чат-сервер). В качестве клиентской программы можно использовать апплет. Разумеется, вы можете разрабатывать и серверную, и клиентскую часть своего приложения.

Типовое задание. В качестве примера клиентской части сетевого приложения вы можете разработать клиентский оконный интерфейс для банкомата или чата.

Сетевое приложение может представлять собой какую-либо автоматизированную систему, содержащую сервер и несколько клиентов, например:

·  оранжерея имеет центральный компьютер (сервер) и периферийные устройства: термометр, обогреватель, увлажнитель и т. п. При изменении условий периферийные устройства посылают сообщения серверу, который, при необходимости, посылает сообщения другим периферийным устройствам;

·  квартира оборудована бытовой техникой, которая управляется центральным компьютером (сервером). Устройства (система отопления, микроволновая печь, холодильник и т. п.) могут получать и выполнять сообщения от сервера. Можно предусмотреть также клиентский интерфейс для хозяина квартиры, чтобы он мог отправлять свои указания серверу для удаленного управления квартирой;

·  атомная электростанция... ну это уж, пожалуй, слишком;

·  любая клиент-серверная система, которую вы придумаете.

Какие темы нужно изучить, чтобы выполнить это задание?

О том, как создавать и использовать приложения с архитектурой клиент-сервер, говорится в параграфе "Сетевые приложения". Если в качестве интерфейса для работы сетевого приложения вы хотите использовать окна и меню, то изучите параграф "Создание оконных приложений".

Задание 7

Создание сервлетов.

Седьмое задание состоит в разработке одного или нескольких сервлетов, которые осуществляют обмен информацией между браузером и web-сервером и обращаются к внешним источникам данных (файлам или базам данных).

Типовое задание может состоять в разработке web-интерфейса для базы данных. Можно использовать ту же базу данных, что и в пятом задании.

Какие темы нужно изучить, чтобы выполнить это задание?

Для разработки сервлетов необходимо установить и настроить web-сервер, поддерживающий Java. Работа с web-сервером TomCat, так же, как и принципы разработки сервлетов, приведены в главе 5 "Немного о сервлетах и Java Server Page".

Приложение 1. ЧАсто задаваемые ВОпросы

Вопрос Есть ли в Java глобальные переменные?

Ответ В Java глобальных переменных нет. Ближе всего по свойствам к глобальным переменным статические переменные класса. К ним обращаются через имя класса, например, Math. PI.

Вопрос Можно ли использовать внутренние классы в Java?

Ответ Можно. При этом после компиляции имя файла внутреннего класса будет иметь вид: ВнешнийКласс$ВнутреннийКласс. class.

Вопрос Как в Java передаются параметры в функцию - по значению, по указателю или по ссылке?

Ответ Параметры стандартных типов передаются по значению. Объекты - по ссылке. Передачи по указателю в Java нет.

Вопрос Есть ли в Java указатели?

Ответ Нет.

Вопрос Если в Java нет указателей, то почему иногда генерируется исключение NullPointerException?

Ответ Указатели в Java есть "на нижнем уровне" - на уровне виртуальной машины. Для программистов доступа к ним нет. Исключение NullPointerException генерируется в том случае, если происходит обращение к несуществующему объекту (т. е., переменную объявили, а объект не создали). Например:

String s;

int n=s. length(); // ошибка

Вопрос Почему в языке Java, имеющем операцию выделения памяти new, не существует операции освобождения памяти delete, как, например, в языке С++?

Ответ В языке Java программист освобожден от необходимости самостоятельно управлять памятью. Для хранения объектов здесь отводится определенное место памяти, называемое кучей. Размер кучи ограничен. Язык Java осуществляет автоматическую "сборку мусора" – процесс возвращения системе памяти, занятой объектами, которые больше не потребуются, и подготовки ее для использования новыми объектами. Не существует способа вызова сборщика мусора. Программист может только отправить запрос на запуск сборки мусора с помощью метода gc объекта System. Собственно сборка мусора произойдет в момент, удобный системе.

Вопрос Можно ли в Java переопределять операции +,-,*,% и т. п.?

Ответ Нельзя. Исключение сделано только для операции +, которая определена для класса String и представляет собой операцию сцепления строк.

Вопрос Как можно вывести в апплет картинку из графического файла?

Ответ Для работы с графическими файлами используется класс Image.

·  Во-первых, нужно объявить переменную:

Image pict;

·  во-вторых, загрузить картинку из файла:

pict=getImage(getCodeBase(),"example. gif");

·  в-третьих, вывести картинку на экран с помощью графического контекста:

gr. drawImage(pict,80,90,this);

Вопрос Как можно вывести в оконное приложение картинку из графического файла?

Ответ Это производится с помощью класса Image, как и в случае апплета. Особенность состоит в том, что в отличие от класса Applet, в котором реализован метод getImage, позволяющий загрузить изображение из заданного файла, классы Frame или Window таких методов не имеют. Эту задачу можно решить с помощью объекта класса Toolkit (инструментальное окружение).

Toolkit toolkit=Toolkit. getDefaultTookit();

После этого можно загружать изображение из заданного файла, например, так:

Image im=toolkit. getImage("example. gif");

Полученный объект im теперь можно загружать в канву для дальнейшего помещения в окно. Кстати, при размещении канвы с использование менеджера раскладок BorderLayout канва должна быть размещена в центре. В противном случае канва не будет видна в окне.

Вопрос Как избежать "мелькания" при частой перерисовке изображения в апплете?

Ответ В этом случае часто применяется технология "виртуального окна". Для этих целей используется класс BufferedImage, который позволяет в оперативной памяти создать "виртуальное окно", куда происходит весь вывод информации. В заданные моменты изображение должно копироваться в реальное окно. Таким образом, последовательность работы будет такова:

·  Подключаем нужный пакет

import java. awt. image. BufferedImage;

·  В класс-апплет вводим новые переменные:

BufferedImage image; // виртуальное окно

Graphics imageGr; // совместимый графический контекст

·  В методе init апплета требуется создать виртуальное окно и совместимый графический контекст:

image=new BufferedImage(width, height,

BufferedImage. TYPE_BYTE_INDEXED);

imageGr=image. getGraphics();

·  Далее весь вывод производится в контекст imageGr, например,

imageGr. setColor(Color. red);

imageGr. fillRect(100,100,200,200);

·  В момент, когда потребуется перенести содержимое виртуального окна в реальное окно, вызывается следующая функция для контекста реального окна в методе paint апплета

public void paint(Graphics g)

{

// ...

g. drawImage(image,0,0, width, height, null);

}

Вопрос: Как сделать так, чтобы сервлеты и JSP-сценарии корректно генерировали HTML-код, содержащий русские буквы?

Ответ В сервлете требуется установить кодировку отсылаемых клиенту данных:

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException

{

response. setContentType("text/html;charset=windows-1251");

// генерирование ответа

}

В случае работы с JSP-сценарием требуется включить в сценарий следующую строку:

<%@ page contentType="text/html; charset=windows-1251" %>

Вопрос: Как сделать так, чтобы в сервлеты и JSP-сценарии корректно передавались русские буквы из HTML-формы?

Ответ Параметры из HTML-формы обычно передаются в кодировке "ISO-8859-1". Поэтому после получения параметра его нужно перекодировать, например, в кодировку "Cp1251". Такую перекодировку выполняет один из конструкторов класса String, например:

String s=request. getParameter("klient");

String klient=new String(s. getBytes("ISO-8859-1"),"Cp1251");

Некоторые наиболее распространенные ошибки

Не забывайте, что при создании апплета класс, производный от Applet, должен иметь тип доступа public и имя, совпадающее с именем файла.

Не забывайте явно создавать объекты командой new. В некоторых случаях объекты создаются неявно – например, при объявлении строковой переменной с инициализацией:

String s = "Изучаем Java";

или при вызове некоторой функции, которая возвращает созданный ею объект:

Graphics g = getGraphics();

Во всех остальных случаях необходимо использовать команду new. Обращение к несуществующему объекту вызовет исключение NullPointerException.

Приложение 2. Как работать с Kawa

Kawa является достаточно простой и удобной (если привыкнуть) графической оболочкой для JDK. Для работы с Kawa будут полезны следующие советы.

·  При первом запуске Kawa попросит настроить путь к каталогу BIN, где хранятся основные исполняемые модули JDK. Те же самые действия можно произвести в любое время вручную, если выбрать пункт меню "Customize" "Options..." и на закладке "Directories" "JDK paths" в пункте "Java Bin Directory" выбрать нужный каталог. Он может выглядеть примерно как "C:\j2sdk1.4.0\BIN".

·  Работу в Kawa лучше всего начинать с создания проекта: "Project" "New...". Файлы проектов имеют расширение .KPX. В левой части экрана в окне рабочего пространства выдается список проектов. В этом списке только один проект может быть открытым – он выделен жирным шрифтом. Именно открытый проект запускается на выполнение. Для того чтобы открыть проект, щелкните по нему правой кнопкой мыши и выберите пункт "Open".

·  После того, как вы наберете текст программы и сохраните его в файле с расширением .JAVA, Kawa спросит, нужно ли включить файл в текущий проект. Отвечайте утвердительно. После этого файл нужно откомпилировать с помощью меню "Build" "Compile" (или кнопки со стрелкой, или клавиши F7). Если есть ошибки, они будут выведены в нижнем окне.

·  Для запуска апплета на выполнение используйте меню "Build" "Run" (или кнопку с окном, или клавишу F4). Kawa задаст еще один вопрос, на который нужно ответить утвердительно, тогда в проект будет добавлен автоматически сформированный HTML-файл для запуска апплета.

·  Обратите внимание, что в списке файлов проекта один из них обведен рамочкой. Этот файл является в проекте главным, именно с него начинается запуск проекта на выполнение. Для апплетов главным должен быть HTML-файл. При необходимости можно назначить главный файл вручную – щелкнуть правой кнопкой мыши по файлу и в контекстном меню выбрать пункт "Main HTML".

·  В Kawa назначить аргументы командной строки можно так: в меню проекта следует выбрать "Project" – "Compiler options..." и на закладке "Interpreter" включить переключатель "Command Line Arguments". Затем нажать кнопку ">>", в появившемся окне нажать кнопку "New" и в поле "Add/edit" набрать значения аргументов. Не забудьте нажать кнопку "Add" для того, чтобы строка параметров появилась в верхнем списке.

·  Для подключения в проект нестандартных пакетов (например, мы можем столкнуться с этим, когда нужно подключить JDBC-пакет для MySQL) выберите меню "Project" "Classpath...". Нажмите кнопку "New", затем кнопку "Add file...", выберите нужный jar-файл и не забудьте нажать кнопку "Add" для того, чтобы выбранный файл появился в верхнем списке.

·  Не используйте пункт меню "Save as...". Если сохранить файл с помощью этого пункта меню и сразу же закрыть файл, то он будет пустым.

Приложение 3. Введение в настраиваемые типы данных

Новая версия JDKJava 2 Platform Standard Edition Version 5.0 – предоставляет программисту некоторый набор новых возможностей. Одной из таких возможностей является появление настраиваемых типов данных. Программисты, которые работают на языке С++, привыкли использовать шаблоны классов и функций. Эта же возможность в Java 2 версии 5.0 называется созданием настраиваемого типа. С помощью таких типов данных можно сформулировать единственный класс, автоматически обрабатывающий данные различных типов. Таким образом, разрабатывается один алгоритм обработки данных, который затем применяется без дополнительной доработки к различным типам данных.

Разберем принципы создания и использования настраиваемого класса на примере. Создаем настраиваемый класс.

class Gen<T>

{

T ob;

public Gen (T o) {ob=o;}

public T getOb() {return ob;}

public void showType(Graphics g, int x, int y)

{

g. setColor(Color. green);

g. drawString("Тип T "+ob. getClass().getName(),x, y);

}

}

Здесь Т – параметр типа. Это имя используется как заменитель действительного типа, передаваемого в класс Gen в качестве параметра. Далее имя Т будет использоваться в классе везде, где требуется переменная или параметр этого типа. Например, он используется для объявления переменной класса, в качестве параметра в конструкторе класса, а также как тип возвращаемого значения в методе getOb. Если при создании объекта будет передан тип String, то у переменной ob будет тип String. Таким образом, реальный тип данных определится только при создании объекта.

Создадим класс, который будет являться внешним для созданного настраиваемого класса Gen и будет демонстрировать работу с этим внутренним классом.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7