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 o "Работа с графикой", o "Передача параметров в апплет". Кроме того, глава 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. Введение в настраиваемые типы данных
Новая версия JDK – Java 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 |


