Мова програмування Java
Java - об'єктно-орієнтована мова програмування. Її якості: безпека, надійність, інтерактивність, незалежність від архітектури, інтерпретація та висока продуктивність. Програмування мовою Java. Синтаксис та конструкції. Автоматичне керування пам'яттю.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | украинский |
Дата добавления | 19.06.2010 |
Размер файла | 103,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Створення jar-архіву можна добитися за допомогою наступної команди:
Jar cf0 Myjar.jar *.class *.java images audio
В результаті даної команди буде створено архів Myjar.jar, в який будуть включені всі класи, java-файли, малюнки (повинні знаходитись в піддиректорії images), звуки (повинні знаходитись в піддиректорії audio), а також деяка додаткова інформація в заархівованому вигляді. Детальніше про параметри утіліти jar можна дізнатися з документації на JAVA або запустивши утіліту без будь-яких параметрів.
Для використання класів, які знаходиться всередині jar-архіву, з HTML-файлу, в ньому необхідно використати параметр archive тега applet. Приклад
<applet codebase="..\.." code=second.class archive = "myjar.jar"
width=400 height=200 >
В мові Java існує велика кількість пакетів, в яких розміщуються створені класи для роботи з апаратним забезпеченням ЕОМ, операційними системами тощо. Призначення кожного пакету наведемо в їх короткому описі.
java.io
Даний пакет в мові Java являється стандартною бібліотекою вводу/виводу. Даний пакет дозволяє створювати потоки даних і управляти ними. Однак в них присутні також класи String та StringBuffer.
java.util
Даний пакет основним чином служить для різних користних функцій, які неможливо віднести до будь-якого іншого пакету. Тут присутні класи для роботи з датами, часом, створення хеш-таблиці тощо.
java.net
Оскільки Java являється мережевою мовою програмування, то в ній надзвичайно багато класів, які призначені для роботи з віддаленими ресурсами, сокетами, підключеннями до різних серверів та ін. З допомогою даного пакету досить просто розробляти програми-чати, програми для скачування та ін.
java.awt(Abstract Windowing Toolking)
Даний пакет призначений для створення красивого користувацького інтерфейсу. В ньому присутні класи для створення кнопок, меню, випадаючих списків та ін. Даний пакет також містить класи для роботи з графікою.
java.awt.image
Даний пакет тісно пов'язаний з попереднім, і в ньому містяться класи для маніпуляцій з зображеннями, що отримуються через мережу.
java.awt.peer
Даний пакет містить апаратнозалежні класи для створення програм які залежать від певної архітектури.
java.applet
Даний пакет являється одним з найменших пакетів в Java-API. Однак завдяки присутності класа Applet являється одним з найбільш використовуваних. Даний клас має багато корисних методів, і являється основою для розробки віконних додатків.
Існує ще багато інших пакетів в Java, однак розгляд їх міг би зайняти дуже багато часу, тому ми обмежимося розглядом тільки даних класів.
7. Система вводу/виводу в Java
Операції вводу/виводу в Java побудовані на основі використання потоків вводу/виводу. Більшість потоків вводу/виводу реалізовані як нащадки від двох абстрактних суперкласів InputSream та OutputStream. Проте ці класи лише реалізують заагльні властивості для всіх потоків.
Розглянемо деякі з нащадків даних абстрактних класів. До найбільш важливих потоків вводу/виводу належать:
· FileInputStream/FileOutputStream
· ByteArrayInputStream/ByteArrayOutputStream
· BufferedInputStream/BufferedOutputStream
· PrintStream
· DataInputStream/DataOutputStream
Клас FileInputStream використовується для зчитування даних з файлів. Даний клас має два вида конструкторів:
· FileInputStream (String шлях)
· FileInputStream (File об'єкт)
У наведеному нижче прикладі створюється два об'єкти цього класу, що використовують дисковий файл.
InputStream f0 = new FileInputStream("/autoexec.bat"); //Приклад перший
File f = new File("/autoexec.bat"); // Приклад другий
InputStream f1 = new FileInputStream(f);
Коли створюється об'єкт класу FileInputStream, він одночасно відкривається для читання. Для читання з даного потоку призначені різноманітні версії методу read. Ознакою закінчення читання даних з файлу являється отримання значення -1(ніби символ кінця файлу). Для детальної інформації про методи потоку див. Java Specification API.
В класы FileOutputStream існують два такі ж конструктори, що й у FileInputStream. Однак, створювати об'єкти цього класу можна незалежно від того, існує чи файл ні. При створенні нового об'єкта клас FileOutputStream перед тим, як відкрити файл для виводу, спочатку створює його. При відкритті існуючого вже файлу, вміст даного файлу знищується.
ByteArrayInputStream - це реалізація вхідного потоку, у якому як джерело зчитування даних використовується масив типу byte. У цього класу існує два конструктори, кожний з яких як перший параметр вимагає байтовий масив.
ByteArrayInputStream (byte масив[])
ByteArrayInputStream (byte масив[], int початок, int закінчення)
У класу ByteArrayOutputStream -- два конструктори. Перша форма конструктора створює буфер за замовчуванням розміром 32 байта. При використанні другої форми створюється буфер з розміром, заданим параметром конструктора:
ByteArrayOutputStream();
ByteArrayOutputStream(int розмір);
На відміну від файлових потоків, в даних потоках існує додатковий метод reset, який здійснює переміщення курсора з поточної позиції на початок буфера.
Буферизовані потоки вводу/виводу шляхом підключення буфера дозволяють значно підвищити продуктивність операцій вводу/виводу. Крім того дані потоки мають деякі додаткові функції: mark(), skip(), reset(). До буферизованих потоків належать StringBufferlnputStream/BufferedInputStream/BufferedOutputStream. Конструктори даних класів:
StringBufferlnputStream (String рядок)
BufferedInputStream (InputStream потік)
BufferedInputStream (InputStream потік, int розмір)
BufferedOutputStream (OutputStream потік)
BufferedOutputStream (OutputStream потік, int розмір)
В першому конструкторі параметр рядок являється джерелом вводу. В другому потоком вводу являється будь-який вхідний потік, однак створюється буфер, в який накопичуються дані по мірі їх приходу. За замовчуванням буфер = 32 байта. Якщо кількість байт що прийшла в даний потік більша, то буфер автоматично збільшується. При читанні байта з даного потоку, він виймається з буфера (існують потоки, які не виймають байти з потоку, а просто копіюють їх вміст).Третій конструктор відрізняється від попереднього тільки розміром буфера при створенні потоку. Наступні конструктори призначені для буферизованих потоків виводу.
Клас PrintStream призначений для виводу з форматуванням. Він має два конструктори:
PrintStream (OutputStream потік)
PrintStream (OutputStream потік, boolean ражим)
Значення режим визначає, чи буде очищуватись потік виводу при виводі символу нового рядка. Якщо даний параметр має значення true, очищення буде проходити автоматично, інакше - не буде проводитись. По замовчуванню стоїть true. Об'єкт даних класів підтримує методи print та println для всіх типів, включаючи Object. Це означає, що якщо ми передамо будь-який об'кт для виводу, то він за допомогою методу toString() перетвориться в рядок, який і буде виведений в потік.
Класи DataInputStream та DataOutputStream призначені для читання базових типів даних (int, double та ін.). Їхні конструктори мають вигляд:
DataInputStream (InputStream потік)
DataOutputStream (OutputStream потік)
До даного часу ми розглядали лише програми з одним потоком команд. Багатопоточна програма - це програма, в якій присутні декілька потоків команд. Багатопоточність дозволяє максимально використовувати ресурси комп'ютера. В Java дана модель реалізована найбільш повно.
Для реалізації багатопоточності в Java передбачено два способи:
1. Використання успадкування від класу Thread.
2. Використання інтерфейсу Runnable.
Розглянемо ці способи.
Коли програма запускається, в ній вже існує один потік, який називається основним. Як тільки він завершується, то завершуються всі підпотоки. Тому необхідно слідкувати за тим, щоб даний потік завершевався останнім. Отримати вказівник на даний потік можна з допомогою наступного коду:
Thread t = Thread.currentThread();
Клас Thread та інтерфейс Runnable містять метод run(), який програміст повинен перевизначити. Всередині даного методу необхідно розміщувати оператори, які будуть виконуватись в новому потоці.
class NewThread implements Runnable
{
Thread t;
NewThread ()
{
t = new Thread(this, "Child Thread");//створення нового потоку
System.out.println("Run child thread: " + t);
t.start();//запуск нового потоку на виконання. При цьому викликається метод run()
}
public void run()
{
try {
for (int i = 5; i > 0; i--)
{
System.out.println("Child thread: " + i);
Thread.sleep(500);
}
} catch (InterruptedException e)
{ System.out.println("child interrupted");}
System.out.println("Exiting child thread");
}
}
class Demothread
{
public static void main(String args[])
{
System.out.println("Run parent thread: " + Thread.currentThread());//отримання //інформації про потік
NewThread ch = new NewThread(); //створення дочірнього потоку
try {
for (int i = 5; i > 0; i--)
{
System.out.println("Paren thread: " + i);
Thread.sleep(1000);//звільнення процесора для інших потоків
}
ch.t.join();//очікування завершення дочірнього потоку
} catch (InterruptedException e)
{ System.out.println("child interrupted");}
System.out.println("exiting main thread");
}
}
Як бачимо, створений клас NewTread для запуску нового потоку. Він розширює інтерфейс Runnable. Як тільки викликається конструктор даного класу, то створюється новий потік комад (t = new Thread(this, "Child Thread");), а потім даний потік запускається на виконання (t.start();). При цьому ми покидаємо конструктор і повертаємося до виконання головного потоку де в циклі виводимо числа 5..1. Проте необхідно пам'ятати про те, що потік підчас свого виконання повинен час від часу звільняти процесор для того, щоб могли виконуватись інші потоки. Для цієї зупинки використовують Thread.sleep(1000).
Оскільки головний потік повинен завершуватись останнім, то використовують метод join(), який очікує поки завершиться потік для якого даний метод викликаний (в нашому випадку це дочірній потік).
Другий спосіб - використання наслідування від класу Thread. Переробимо програму для цього способу. При цьому необхідно змінити тільки заголовок класу NewThread.
class NewThread extends Thread
. . .
Опишемо основні методи, які використовуються при роботі з потоками.
currentThread - статичний метод currentThread повертає об'єкт Thread, що виконується в даний момент.
yield - Виклик методу yield приводить до того, що виконуюча система переключає контекст із поточного на наступний доступний підпроцес. Це один зі способів гарантувати, що низькопріоритетні підпроцеси коли-небудь одержать процесор в свое роспорядження.
sleep(int n) - при виклику методу sleep виконуюча система блокує поточний підпроцес на n мілісекунд. Після того, як цей інтервал часу закінчиться, підпроцесс знову буде здатний виконуватися. У більшості виконуючих систем Java системний годинник не дозволяють точно витримувати паузи коротше, ніж 10 міллісекунд.
Методи об'єкта потоку.
start() - говорить виконуючій системі Java, що необхідно створити системний контекст підпроцеса і запустити цей підпроцесс. Після виклику цього методу буде викликаний метод run новоствореного підпроцесса. Метод start з даним об'єктом можна викликати тільки один раз.
run() -- це тіло підпроцеса що виконується. Це -- єдиний метод інтерфейсу Runnable. Він викликається з методу start після того, як виконуюче середовище виконає необхідні операції по ініціалізації нового підпроцеса. Якщо відбувається повернення з методу run, то підпроцес зупиняється.
stop() - приводить до негайної зупинки підпроцеса. Більш акуратний спосіб зупинити виконання підпроцесу -- встановити яку-небудь логічну змінну-прапор, передбачивши в методі run код, що, перевіривши стан прапора, завершив би виконання підпроцесу.
suspend() - відрізняється від методу stop тим, що метод припиняє виконання підпроцесу, не руйнуючи при цьому його системний контекст. Якщо виконання підпроцесу припинене викликом suspend, ви можете знову активізувати цей підпроцес, викликавши метод resume.
resume() - використовується для активізації підпроцесу, припиненого викликом suspend. При цьому не гарантується, що після виклику resume підпроцес негайно почне виконуватися, оскільки в цей момент може виконуватися інший більш високопріоритетный процес.
setPriority(int p) - встановлює пріоритет підпроцесу, що задається цілим значенням переданого методові параметра. У класі Thread є кілька визначених пріоритетів-констант: MIN_PRIORITY, NORM_PRIORITY і MAX_PRIORITY, що відповідають відповідно значенням 1, 5 і 10. Більшість користувальницьких додатків повинне виконуватися на рівні NORM_PRIORITY плюс-мінус 1. Пріоритет фонових завдань, наприклад, мережного введення-висновку або перемальовування екрана, варто встановлювати в MIN_PRIORITY. Запуск підпроцесів на рівні MAX_PRIORITY вимагає обережності.
getPriority() - цей метод повертає поточний пріоритет підпроцесу -- ціле значення в діапазоні від 1 до 10.
Якщо багатопоточна програма використовує один і той самий метод, то іноді для правильної роботи програми необхідно визначати даний метод як synchronized. Наведемо приклад.
class Callme
{
void call(String msg)
{
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch(Exception e)
{ System.out.println("Interrupted!!!");}
System.out.print(" ]");
}
}
class Caller implements Runnable
{
String msg;
Callme target;
Thread t;
public Caller(Callme targ, String s)
{
target = targ;
msg = s;
t = new Thread(this);
t.start();
}
public void run()
{
target.call(msg);
}
}
class Synch
{
public static void main(String args[])
{
Callme target = new Callme();
Caller ob1 = new Caller(target, " Hello ");
Caller ob2 = new Caller(target, " Synchronized ");
Caller ob3 = new Caller(target, " World ");
try {
ob1.t.join();
ob2.t.join();
ob3.t.join();
} catch(Exception e)
{ System.out.println("Interrupted!!!");}
}
}
Як бачимо по виводу на екран ([ Hello [ Syncronized [ World ] ] ]), виклик методу call() різними потоками здійснюється майже одночасно. При цьому вивід здійснюється накладений. Попробуйте написати перед даним методом слово synchronized. Результат буде наступний ([ Hello] [ Syncronized ] [ World ]).
Виключна ситуація в Java -- це об'єкт, що описує винятковий стан, що виник у якій-небудь ділянці програмного коду. Коли виникає виключна ситуація, створюється об'єкт класу Exception. Цей об'єкт пересилається в метод, що обробляє даний тип виключної ситуації. Виключення можуть збуджуватися і „вручну” для того, щоб повідомити про деякі позаштатні ситуації.
До механізму обробки виключень у Java мають відношення 5 ключових слів: -- try, catch, throw, throws і finally. Схема роботи цього механізму наступна. Ви намагаєтеся (try) виконати блок коду, і якщо при цьому може виникнути помилка, система збуджує (throw) виключення, що у залежності від його типу ви можете перехопити (catch) або передати обробщику по замовчуванню(finally).
Загальний синтаксис блоку обробки виключень.
try {
// блок коду, в якому може виникнути помилка
} catch (Тип виключення1 е) {
// оброблювач виключень типу Типу виключення1
}
catch (Типисключения2 е) {
// оброблювач виключень типу Типисключения2
}
finally {
//Блок коду який необхідно виконати за будь яких умов
}
try і catch
Для створення блоку програмного коду, який потрібно захистити від виключних ситуацій, використовується ключове слово try. Відразу ж після try-блоку міститься блок catch, що задає тип виключної ситуації яке ви хочете обробляти.
Приклад
class Exc2 {
public static void main(String args[]) {
try {
int d = 0;
int a = 42 / d;
} catch (ArithmeticException e) {
System.out.println("division by zero");
}
}
}
Основне призначення блоку catch - продовження виконання програми при виникненні помилки. В інших мовах програмування програма одразу завершується при виникненні вийняткової ситуації. В Java реалізована система для обробки помилок і прийняття рішення виходити з програми чи виконувати деякі спеціальні дії при виникненні помилки.
У деяких випадках той самий блок програмного коду може збуджувати виключні ситуації різних типів. Для того, щоб обробляти подібні ситуації, Java дозволяє використовувати будь-яку кількість catch-розділів для try-блоку. Найбільш спеціалізовані класи виключень повинні йти першими.
throw
Оператор throw використовується для створення виключення „вручну”. Для того, щоб зробити це, потрібно мати об'єкт підкласу класу Throwable, який можна або одержати як параметр оператора catch, або створити за допомогою оператора new. Нижче приведена загальні форми оператора throw.
throw Об'єктТипуThrowable();
throw Об'єктТипуThrowable(String message);
Приклад створення вийняткової ситуації вручну.
class myexc
{
public static void main(String args[])
{ int i =0;
try{
throw new NullPointerException("world!!!");
i = i + 1; //Цей код ніколи не виконається
} catch (NullPointerException e){
System.out.println("Hello "+e);
}
}
}
При досягненні оператора throw нормальне виконання коду негайно припиняється, так що наступні за ним оператори не виконується. Найближчий блок try перевіряється на наявність відповідному виключенню оброблювача catch. Якщо такий знайдений, то керування передається йому. Якщо ні, перевіряється наступний із вкладених операторів try, і так доти поки або не буде знайдений підходящий розділ catch. Якщо оброблювач виключень не знайдений, то управління передається виконуючій системі Java з вказанням виникшої ситуації, і та зупинить програму, вивівши при цьому стан стека викликів.
throws
Якщо метод здатний збуджувати виключення, які він сам не обробляє, він повинен оголосити про таке поводження, щоб методи могли захистити себе від цих виключень. Для завдання списку виключень, що можуть збуджуватися методом, використовується ключове слово throws. Якщо метод у явному виді (тобто за допомогою оператора throw) збуджує виключення відповідного класу, тип класу виключень повинний бути зазначений в операторі throws в оголошенні цього методу.
тип ім'я_методу(список аргументів) throws список_виключень
{ //Тіло методу }
Приклад.
class ThrowsDemo {
static void procedure() throws IllegalAccessException {
System.out.println(" inside procedure");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
try {
procedure();
} catch (IllegalAccessException e) {
System.out.println("caught " + e);
}
}
}
finally
Іноді потрібно гарантувати, що визначена ділянка коду буде виконуватися незалежно від того, які виключення були порушені і перехоплені. Для створення такої ділянки коду використовується ключове слово finally. Навіть у тих випадках, коли в методі немає відповідному збудженому виключенню розділа catch, блок finally буде виконаний до того, як керування перейде до операторів, що слідують за розділом try. У кожного розділу try повинний бути принаймні або один розділ catch або блок finally. Блок finally дуже зручний для закриття файлів і звільнення будь-яких інших ресурсів
class FinallyDemo {
static void procA() {
try {
System.out.println("inside procA");
throw new RuntimeException("demo");
} finally {
System.out.println("procA's finally");
}
}
static void procB() {
try {
System.out.println("inside procB");
return;
} finally {
System.out.println("procB's finally");
}
}
public static void main(String args[]) {
try {
procA();
} catch (Exception e) {}
procB();
}
}
8. Аплети
Однією з найбільших переваг мови Java - можливість створення аплетів, маленьких програм, які працюють всередині WEB-броузера. Проте, на аплети накладені певні обмеження в зв'язку з тим, що вони виконуються на комп'ютері користувача.
Обмеження :
· Аплет не має доступу до жорсткого диску. Проте для них існує система цифрових підписів, за допомогою якої користувач може визначати чи дані аплети отримані з надійних джерел, а отже може зняти більшість обмежень
· Аплетам необхідно певний час, щоб загрузитися з Інтернету. Для зменшення цього часу всі дані, які необхідно аплету для роботи, як правило включають в jar-архів, що дозволяє швидше загрузити аплет.
Переваги:
· Для аплетів немає необхідності встановлювати їх як інші програми. Цим можна скористатися, коли необхідно постійно загружати обновлені версії програм.
· Немає необхідності хвилюватись, що загружений аплет виконає потенційно небезпечні дії. Основні дії, які можуть привести до втрати важливої інформації, пошкодження чи зміна вмісту файлів для аплетів є заборонені.
В мові Java існує два способи створити аплет.
· Створити підклас суперкласу Applet (визначений в пакеті java.applet.Applet)
· Створити підклас суперкласу Japplet (визначений в пакеті javax.swing)
Відмінність між цими двома класи полягає лише в тому, що перший - був визначений в ранніх версіях Java, і не підтримував повну незалежність від архітектури, вигляд GUI не дуже вдалий. Другий був створений в більш пізніших версіях Java і підтримує архітектурну незалежність, має краший вигляд GUI. На сьогоднішній день в основному для створення аплетів використовують другий спосіб для створення аплетів.
На відміну від консольних додатків, які виконуються без опитування подій від користувача, аплети очікують якісь події від користувача, і змінюють всій стан у відповідності до цих дій. Він просто „висить” в пам'яті комп'ютера і перевіряє події які відбуваються(рух мишки, натискування кнопок миші та клавіш та ін), і при поступленні перевантаженої дії змінює свій стан.
У вказаних вище класах визначено наступні методи, які зпризначені для функціонуваня аплетів:
· init
· start
· stop
· destroy
Метод init викликається тоді, коли браузер завантажує у своє вікно документ HTML з оператором <APPLET>, що посилається на даний аплет. У цей момент аплет може виконувати ініціалізацію початкових параметрів, абостворювати потоки, якщо він працює в багатопоточному режимі.
Метод start викликається після методу init у момент, коли користувач починає переглядати документ HTML з убудованим у нього аплетом. Ви можете модифікувати текст цього методу, якщо при кожному відвідуванні користувачем сторінки з аплетом необхідно виконувати яку-небудь додаткову ініціалізацію або виконання певних дії. Також даний метод викликається при розгортанні вікна (якщо воно було згорнуте).
Перед видаленням аплета з пам'яті викликається метод destroy, що визначений у базових класах як порожня заглушка.Методу destroy звичайно доручають усі необхідні операції, які варто виконати перед видаленням аплета. Наприклад, якщо в методі init ви створювали які-небудь потоки, у методі destroy їхній потрібно завершити.
Доповненням до методу start служить метод stop. Він одержує керування, коли користувач залишає сторінку з аплетом і завантажує у вікно браузера іншу сторінку, або згортає дану сторінку, робить її неактивною. Метод stop викликається перед методом destroy.
Додатковим методом, який часто використовується в аплетах є метод paint(). Даний метод описаний в пакеті java.awt. Він призначений для перемалювання області аплета. Кожного разу, коли вікно аплета перекривається іншими вікнами, а потім робиться активним, його необхідно перемалювати. Також даний метод призначений для спеціалізованого виводу в область аплету.
Життєвий цикл аплета наступний:
1. етап ініціалізації аплета (метод init())
2. етап старту аплета (метод start())
3. етап перемалювання вікна аплету та відображення вмісту аплету
4. перехід в режим очікування дій користувача
5. якщо відбулась якась подія, виконання реакції на дану подію, та знову перехід на 3 єтап
6. етап зупинки роботи аплета (метод stop())
7. етап звільнення пам'яті (метод destroy())
В основному з усіма етапами роботи аплета ми знайомі крім етапу реакції на події користувача. Реакція на події користувача здійснюється в більш раніших версіях Java за допомогою методу action(). Синтаксис даного методу:
public boolean action(Event evt, Object obj){ . . . }
В більш нових версіях використовують поняття внутрішніх класів (тобто класів, які описані всередині нашого класу) та поняття слухача подій. В цьому випадку створюють внутрішній клас, який реалізує інтерфейс ActionListener. В даному інтерфейсі присутній всього один метод actionPerformed(), який призначений для отримання повідомлень про виконання дій над складовими аплету. Проте, кожна складова аплету повинна бути підключена до слухача подій за допомогою методу addActionListener().
Приведемо приклад аплета, який реагує на певні події.
//<applet code=Probe.class width=200 height=200>
//</applet>
//Дані два рядки призначені для спрошення відладки аплета. Немає //необхідності створювати додатково HTML-файл, а можна просто запустити //даний код на виконання appletviewer Probe.java
import javax.swing.*; //Підключення бібліотеки для аплета
import java.awt.*;
import java.awt.event.*; //Підключення бібліотеки для обробки подій
public class Probe extends JApplet
{
/** Поля нашого класу
*/
JButton btn;
JTextField fld;
Actionlist act = new Actionlist(); //Екземпляр внутрішнього класу
/** Внутрішній клас з інтерфейсом ActionListener
*/
class Actionlist implements ActionListener
{
/** Procedure, which make some work on created action
*/
public void actionPerformed(ActionEvent evn)
{
if(evn.getSource() == btn) //Якщо виконали якісь дії над кнопкою
{
String str = fld.getText();
btn.setText(str);
}
}
}
public void init() //Метод для ініціалізації аплета
{
btn = new JButton("Start"); //Створення кнопки
fld = new JTextField("Start2",15); //Створення текстового поля
btn.addActionListener(act); //Добавлення кнопки до слухача подій
fld.addActionListener(act); //Добавлення поля до слухача подій
Container cp = getContentPane();
cp.setLayout(new FlowLayout()); //Встановлення розміщення елементів
cp.add(btn); //Добавлення кнопки до вікна аплету
cp.add(fld); //Добавлення поля до вікна аплету
}
}
Для управлінням розміщення елементів у вікні аплету використовують систему менеджерів розміщення. В Java існують багато видів менеджерів розміщення. Опишемо коротко властивості деяких з них.
FloyLayout - розміщує компоненти послідовно зліва на право, доки вони поміщаються в одному рядку. Потім переходить на наступний рядок і т.д.
GridLayout - представляє вікно аплета як таблицю N*M, де числа N та M вказуються при створенні менеджера. Після цього розміщує елементи аплету в клітинках так само, як попередній. Різниця полягає в тому, що для кожного елемента можна вказати його розміщення в даній таблиці.
BolderLayout - призначений для полярного розмішення елементів. Для нього визначені значення, які відповідають сторонам світу. Тому ми можемо розміщувати елементи з певним типом вирівнювання.
CardLayout - призначений для блокнотного розміщення компонентів. Всі елементи, які входять в контейнер визначаються як сторінки блокнота, тому в кожний момент часу видний тільки якась з сторінок.
GridBagLayout - найбільш універсальний метод розміщення компонент. Даний менеджер розглядає контейнер як таблицю, і кожний компонент може займати більше ніж одну клітинку.
Взаємодія аплетів між собою може бути побудована на основі двох методів:
· Створення каналу між аплетами (PipeInputStream/PipeOutputStream)
· За допомогою сокетів (якщо це окремі додатки)
· За допомогою елементів HTML-сторінки через параметри аплета
Більш детальний опис створення каналів між аплетами наведено в [літ.4]
8. Розподілене програмування
Сокети були розроблені в університеті Берклі (Каліфорнія) в якості засобу, який полегшує програмування мереж. Принцип сокетів спочатку з'явився в ОС UNIX, а пізніше і в інших операційних системах.
Сокет - це абстракція, яка ізолює код програми від низькорівневої реалізації стеку протоколів TCP/IP. Сокет - призначений для мережевого з'єднання одного додатку з іншим.
Сокети в основному працюють на двох видах протоколів UDP та ТСР. Відмінність між цими протоколами полягає в тому, що перший не гарантує доставку пакетів (дейтаграм), а другий - гарантує. Java реалізує дейтаграми на базі протоколу UDP, використовуючи для цього два класи. DatagramPacket та DatagramSoket. Об'єкти класу DatagramPacket являють собою контейнери з даними, a DatagramSocket -- це механізм, який використовується при передачі й одержанні об'єктів DatagramPacket.
В основному ми будемо розглядами роботу з ТСР/ІР сокетами, хоча загальний принцип роботи вних подібний.
TCP/IP-сокети використовуються для реалізації надійних двонаправлених, орієнтованих на роботу з потоками з'єднань точка-точка між вузлами Internet. Сокети можна використовувати для з'єднання системи вводу-виводу Java з програмами, що можуть виконуватися або на локальній машині, або на будь-якому іншому вузлі в Internet. На відміну від класу DatagramSocket, об'єкти класу Socket реалізують високонадійні та стійкі з'єднання між клієнтом і сервером.
У пакеті java.net існують два класи для роботи з сокетами, Socket і ServerSocket , які сильно відрізняються один від одного. Перша відмінність полягає в тому, що ServerSocket чекає, поки клієнт не встановить з ним з'єднання, у той час, як звичайний Socket призначений для ініціалізації створення нового з'єднання. Процес створення нового клієнт-серверного з'єднання можна описати наступним чином:
1. На програмі-сервер (далі просто сервер) створюється екземпляр класу ServerSocket, і викликається метод accept(), який очікує під'єднання клієнта до даного сокету.
. . .
ServerSocket ss = new ServerSocket(2000); //створення сокета на порті 2000
Socket s = ss.accept();
. . .
2. На стороні програми-клієнта створюється екземпляр Socket для встановлення з'єднання з сервером. Пристворенні цього екземпляра здійснюється спроба встановити зв'язок з сервером. Якщо зв'язок встановлено, то на стороні сервера також стоворюється сокет, і можна здійснювати передачу даних.
3. Після завершення передачі даних необхідно знищити екземпляри Socket як на сервері, так і на клієнті.
Увага!!! Якщо під час з'єднання ви відкрили потоки передачі даних, то їх необхідно закрити перед тим, як закривається сокет.
Для створення сокетів ви можете використовувати два конструктори:
Socket(String host, int port) - встановлює з'єднання між локальною машиною і зазначеним портом вузла Internet, ім'я якого було передано конструктору. Цей конструктор може збуджувати виключні ситуації UnknownHostException і IOException.
Socket(InetAddress address, int port) - виконує ту ж роботу, що і перший конструктор, але вузол, з яким потрібно установити з'єднання, задається не рядком, а об'єктом InetAddress. Цей конструктор може збуджувати тільки IOException.
З об'єкта Socket у будь-який час можна отримаати інформацію про адресу Internet і номері порту, з яким він з'єднаний. Для цього служать наступні методи:
getInetAddress() - повертає об'єкт InetAddress, зв'язаний з даним об'єктом Socket.
getPort() - повертає номер порту на вилученому вузлі, з яким встановлене з'єднання.
getLocalPort() - повертає номер локального порту, до якого приєднаний даний об'єкт.
Після того, як об'єкт Socket створений, ним можна скористатися для того, щоб одержати доступ до зв'язаного з ним вхідного і вихідного потоків. Ці потоки використовуються для прийому і передачі даних так само, як і звичайні потоки вводу-виводу:
getInputStream() - повертає InputStream, зв'язаний з даним об'єктом.
getOutputStream() - повертає OutputStream, зв'язаний з даним об'єктом.
close() - закриває вхідний і вихідний потоки об'єкта Socket.
Приведений нижче дуже простий приклад відкриває з'єднання з портом 880 сервера “timehost” і виводить отримані від нього дані.
import java.net.*;
import java.io.*;
class TimeHost {
public static void main(String args[]) throws Exception {
int c;
Socket s = new Socket("timehost.starwave.com",880);
InputStream in = s.getInputStream();
while ((c = in.read()) != -1) {
System.out.print( (char) c);
}
s.close();
} }
Як уже згадувалося раніше, Java підтримує сокети серверів. Для створення серверів Internet треба використовувати об'єкти класу ServerSocket. Коли ви створюєте об'єкт ServerSocket, він реєструє себе в системі, говорячи про те, що він готовий обслуговувати з'єднання клієнтів. У цього класу є один додатковий метод accept(), виклик якого блокує підпроцес доти, поки який-небудь клієнт не установить з'єднання по відповідному порту. Після того, як з'єднання встановлене, метод accept() повертає викликаючому його підпроцесу звичайний об'єкт Socket.
Два конструктори класу ServerSocket дозволяють задати, по якому порту ви хочете з'єднуватися з клієнтами, і як довго ви готові чекати, поки цей порт не звільниться.
ServerSocket(int port) - створює сокет сервера для заданого порту.
ServerSocket(int port, int count) - створює сокет сервера для заданого порту. Якщо цей порт зайнятий, метод буде чекати на нього звільнення максимум count миллисекунд.
URL
URL (Uniform Resource Locators - однорідні покажчики ресурсів) -- є найбільш фундаментальним компонентом Internet. Клас URL надає простий і лаконічний програмний інтерфейс для доступу до інформації в Internet за допомогою URL.
У класу URL з бібліотеки Java - чотири конструктори. У найбільше часто використовуваній формі конструктора URL адреса ресурсу задається в рядку, ідентичної тієї, котру ви використовуєте при роботі з браузером:
URL(String spec)
Два наступні різновиди конструкторів дозволяють задати URL, указавши його окремі компоненти:
URL(String protocol, String host, int port, String file)
URL(String protocol, String host, String file)
Четверта, і остання форма конструктора дозволяє використовувати існуючий URL як контекст, і створити на основі цього контексту новий URL.
URL(URL context, String spec)
У приведеному нижче прикладі створюється URL, що адресує www-сторінку (поставте туди свою адресу), після чого програма друкує властивості цього об'єкта.
import java.net.URL;
class myURL {
public static void main(String args[]) throws Exception
{
URL hp = new URL("http://coop.chuvashia.edu");
System.out. println("Protocol: " + hp.getProtocol());
System.out.printin("Port: " + hp.getPort());
System.out.println("Host: " + hp.getHost());
System.out.println("File: " + hp.getFile());
System.out.println("Ext: " + hp.toExternaLForm());
}
}
Для того, щоб отримати реальну інформацію, за заданим URL, необхідно на основі URL створити об'єкт URLConnection, скориставшись для цього методом openConnection().
URLConnection
URLConnection -- об'єкт, що ми використовуємо або для перевірки властивостей вилученого ресурсу, заданого URL, або для одержання його вмісту. У приведеному нижче прикладі ми створюємо URLConnection за допомогою методу openConnection, викликаного з об'єктом URL. Після цього ми використовуємо створений об'єкт для одержання вмісту і властивостей документа.
import java.net.*;
import java.io.*;
class localURL {
public static void main(String args[]) throws Exception
{
int c;
URL hp = new URL("http", "127.0.0.1", 80, "/");
URLConnection hpCon = hp.openConnection();
System.out.println("Date: " + hpCon.getDate());
System.out.println("Type: " + hpCon.getContentType());
System.out.println("Exp: " + hpCon.getExpiration());
System.out.println( "Last M: " + hpCon.getLastModified());
System.out.println("Length: " + hpCon.getContentLength());
if (hpCon.getContentLength() > 0)
{
System.out.println("=== Content ===");
InputStream input = hpCon.getInputStream();
int i=hpCon.getContentLength();
while (((c = input. read()) != -1) && (--i > 0))
{
System.out.print((char) c);
}
input.close();
}
else {
System.out.println("No Content Available");
}
} }
Ця програма встановлює HTTP-з'єднання з локальним вузлом по порту 80 (у вас на машині повинний бути встановлений Web-сервер) і запитує документ за замовчуванням, звичайно це - index.html. Після цього програма виводить значення заголовка, запитує і виводить вміст документа.
Подобные документы
Створення баз даних за допомогою стандартних бібліотек Java та клієнт-серверних програм. Основні стандартні класи і методи бібліотек SQL та swing, бібліотек, що дозволяють опрацьовувати дані СУБД та навчитись концепціям програмування мовою Java.
лабораторная работа [215,3 K], добавлен 04.10.2011Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016Розробка та тестування додатків, які базуються на елементах мови програмування Java, принципи програмування в її середовищі. Вивчення переваг Java-платформи, прикладний програмний інтерфейс та особливості сучасних засобів створення Java-додатків.
дипломная работа [2,8 M], добавлен 22.06.2011Об'єктно-орієнтована мова Python - сучасна мова програмування, проста у вивченні та використанні. Наявність повної стандартної бібліотеки. Середовища програмування на Python. Механізм функціонування інтерпретатора. Колекції даних, комбіновані оператори.
презентация [753,2 K], добавлен 06.02.2014Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Огляд об’єктно-реляційних перетворень. Схема роботи сервлету. Технології Object-relational mapping, JavaServlet, JSP та Spring framework для розробки web-проектів на мові програмування Java. Генерація текстових документів у відповідь на запит клієнта.
курсовая работа [295,9 K], добавлен 19.03.2015Прототип об'єктно-орієнтованого програмування. Управління процесом реалізації програми. Розвиток апаратних засобів. Об'єктно-орієнтовані мови програмування. Надійність і експлуатаційні якості програм. Візуальне об’єктна-орієнтовне проектування Delphi.
контрольная работа [28,9 K], добавлен 18.05.2009Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.
курсовая работа [123,3 K], добавлен 14.03.2013Історія розвитку мови Java, основні технології та їх застосування для роботи з SQL-серверами. Огляд багатопоточного програмування в Java. Принципи функціонування сервлетів та JSP-сторінок. Зміна розміру графічних об’єктів, робота з кольорами в Java.
курсовая работа [49,3 K], добавлен 29.03.2010Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.
курсовая работа [510,9 K], добавлен 14.03.2013