• No results found

Java Applications Controlled over WWW

N/A
N/A
Protected

Academic year: 2021

Share "Java Applications Controlled over WWW"

Copied!
44
0
0

Loading.... (view fulltext now)

Full text

(1)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INFORMA ˇ

CN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INFORMATION SYSTEMS

APLIKACE V JAZYCE JAVA OVL ´

ADAN ´

E P ˇ

RES WWW

DIPLOMOV ´

A PR ´

ACE

MASTER’S THESIS

AUTOR PR ´

ACE

Bc. TOM ´

A ˇ

S HOMOLA

AUTHOR

(2)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INFORMA ˇ

CN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INFORMATION SYSTEMS

APLIKACE V JAZYCE JAVA OVL ´

ADAN ´

E P ˇ

RES WWW

JAVA APPLICATIONS CONTROLLED OVER WWW

DIPLOMOV ´

A PR ´

ACE

MASTER’S THESIS

AUTOR PR ´

ACE

Bc. TOM ´

A ˇ

S HOMOLA

AUTHOR

VEDOUC´I PR ´

ACE

Ing. RADEK BURGET, Ph.D.

SUPERVISOR

(3)

Zad´

an´ı diplomov´

e pr´

ace

ˇ

Reˇsitel Homola Tom´aˇs, Bc. Obor Informaˇcn´ı syst´emy

T´ema Aplikace v jazyce Java ovl´adan´a pˇres WWW Kategorie Web

Pokyny:

1. Seznamte se se zp˚usobem tvorby grafick´eho uˇzivatelsk´eho rozhran´ı a applet˚u v jazyce Java

2. Prostudujte moˇznosti vyuˇzit´ı jazyka XML pro komunikaci mezi aplikacemi

3. Navrhnˇete zp˚usob komunikace aplikace bˇeˇz´ıc´ı na serveru a aplikac´ı zajiˇst’uj´ıc´ı GUI

4. Implementujte serverovou ˇc´ast komunikace jako knihovnu kompatibiln´ı s knihovnami AWT nebo Swing

5. Implementujte klientskou ˇc´ast jako applet

6. Zhodnot’te moˇzn´a omezen´ı a navrhnˇete pokraˇcov´an´ı projektu

Literatura:

• Spell, B.: Java programujeme profesion´alnˇe. Computer Press, Praha, 2002 Pˇri obhajobˇe semestr´aln´ı ˇc´asti diplomov´eho projektu je poˇzadov´ano:

• Body 1 aˇz 3

Podrobn´e z´avazn´e pokyny pro vypracov´an´ı diplomov´e pr´ace naleznete na adrese http://www.fit.vutbr.cz/info/szz

Technick´a zpr´ava diplomov´e pr´ace mus´ı obsahovat formulaci c´ıle, charakteristiku souˇcasn´eho stavu, teo-retick´a a odborn´a v´ychodiska ˇreˇsen´ych probl´em˚u a specifikaci etap, kter´e byly vyˇreˇseny v r´amci roˇcn´ıkov´eho a semestr´aln´ıho projektu (30 aˇz 40% celkov´eho rozsahu technick´e zpr´avy).

Student odevzd´a v jednom v´ytisku technickou zpr´avu a v elektronick´e podobˇe zdrojov´y text technick´e zpr´avy, ´

uplnou programovou dokumentaci a zdrojov´e texty program˚u. Informace v elektronick´e podobˇe budou uloˇzeny na standardn´ım pamˇet’ov´em m´ediu (disketa, CD-ROM), kter´e bude vloˇzeno do p´ısemn´e zpr´avy tak, aby nemohlo doj´ıt k jeho ztr´atˇe pˇri bˇeˇzn´e manipulaci.

Vedouc´ı Burget Radek, Ing., Ph.D., UIFS FIT VUT Datum zad´an´ı 28. ´unora 2006

(4)

Licenˇ

cn´ı smlouva

Licenˇcn´ı smlouva v kompletn´ım znˇen´ı je uloˇzena v archivu Fakulty informaˇcn´ıch technologi´ı Vysok´eho uˇcen´ı technick´eho v Brnˇe.

(5)

Abstrakt

C´ılem je navrˇzen´ı a implemetace knihovny pro tvorbu aplikac´ı, kter´e bude moˇzn´e ovl´adat vzd´alenˇe pˇres WWW. Tato knihovna bude poskytovat virtualn´ı grafick´e uˇzivatelsk´e rozhran´ı a bude zajiˇst’ovat komunikaci se skuteˇcn´ym vzd´alen´ym grafick´ym uˇzivatelsk´ym rozhran´ım, kter´e bude navrˇzeno jako applet aplikace v jazyce Java a se kter´ym bude moˇzn´e ovl´adat vzd´alenou aplikaci. N´avrh ˇreˇsen´ı je zaloˇzen na vzd´alen´em vol´an´ı metod (RMI), kter´e bude zajiˇst’ovat komunikaci mezi appletem a aplikac´ı bˇeˇz´ıci na serveru.

Kl´ıˇcov´

a slova

applet, RMI, tvorba GUI v Javˇe, Swing, webov´a aplikace

Abstract

The goal is to design and to implement a library for developing Java applications controlled over WWW. This library provides a virtual graphical user interface and it implements the network communication with a real remote graphical user interface. The remote graphical user interface is implemented as a Java applet. The proposed solution is based on the Remote Method Invocation (RMI) framework that provides the communication between the applet and the application running on the server.

Keywords

applet, RMI, GUI creation in JAVA, Swing, web application

Citace

Tom´aˇs Homola: Aplikace v jazyce Java ovl´adan´e pˇres WWW, diplomov´a pr´ace, Brno, FIT VUT v Brnˇe, 2007

(6)

Aplikace v jazyce Java ovl´

adan´e pˇres WWW

Prohl´

aˇsen´ı

Prohlaˇsuji, ˇze jsem tuto bakal´aˇrskou pr´aci vypracoval samostatnˇe pod veden´ım pana Ing. Radka Burgeta, Ph.D. Uvedl jsem vˇsechny liter´arn´ı prameny a publikace, ze kter´ych jsem ˇ

cerpal.

. . . . Tom´aˇs Homola 22. kvˇetna 2007

c

Tom´aˇs Homola, 2007.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe in-formaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´avnˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.

(7)

Obsah

1 Uvod´ 3

2 Tvorba GUI a applet˚u v jazyce Java 5

2.1 Kontejnery . . . 5

2.2 Spr´avci rozvrˇzen´ı . . . 5

2.2.1 CardLayout . . . 6 2.2.2 FlowLayout . . . 6 2.2.3 GridLayout . . . 6 2.2.4 BorderLayout . . . 7 2.2.5 GridBagLayout . . . 7 2.2.6 BoxLayout . . . 7 2.3 Grafick´e komponenty . . . 7 2.4 Ud´alosti . . . 7 2.5 Applet . . . 8

3 Remote Method Invokation (RMI) 10 3.1 Architektura . . . 10

3.2 Architektura s firewall . . . 10

3.3 RMI protokol . . . 11

3.3.1 V´ystupn´ı proud. . . 11

3.3.2 Vstupn´ı proud . . . 13

3.3.3 Typy hodnot pouˇzit´ych v RMI protokolu . . . 14

3.4 Pˇrenos parametr˚u. . . 14

4 N´avrh architektury pro vzd´alen´e ovl´ad´an´ı aplikac´ı 15 4.1 Komunikace klient-server . . . 16

4.2 Reprezentace vzd´alen´ych objekt˚u . . . 16

4.3 Popis klienta . . . 17

4.4 Popis serveru . . . 18

5 Realizace 21 5.1 Klient . . . 22

5.2 Server . . . 23

5.3 Stavba server knihovny . . . 24

6 Interaktivn´ı editor aplikace ovl´adan´e pˇres WWW 25 6.1 Moˇznosti editoru . . . 25

(8)

6.3 Popis obsluhy editoru . . . 27

7 Z´avˇer 29

A Pˇr´ılohy 31

A.1 Rozdˇelen´ı do bal´ık˚u . . . 31

A.2 Popis knihovny komponent . . . 31

(9)

Kapitola 1

´

Uvod

Pˇri tvorbˇe softwarov´ych aplikac´ı s grafick´ym uˇzivatelsk´ym rozhran´ı se v souˇcasnosti pouˇz´ıvaj´ı dva z´akladn´ı pˇr´ıstupy k realizaci tohoto rozhran´ı. U lok´alnˇe instalovan´ych aplikac´ı se jedn´a desktopovou aplikaci a u aplikac´ı typu klient – server se pouˇz´ıv´a pˇrev´aˇznˇe webov´e rozhran´ı. V´yhoda desktopov´e aplikace je, ˇze jej´ı uˇzivatelsk´e rozhran´ı, i sloˇzitˇejˇs´ı rozhran´ı, lze navrhnout a implementovat jednoduˇse. V´ysledn´a aplikace zpravidla nem´ıv´a ˇz´adn´a omezen´ı pro vykon´av´an´ı sv´eho programu na poˇc´ıtaˇci, kde byla instalovan´a. Naproti m´a nev´yhody, protoˇze m´a probl´em s pˇrenositelnost´ı a se sd´ılen´ım mezi v´ıce uˇzivateli.

Webov´e aplikace s WWW rozhran´ım nemaj´ı probl´em s pˇrenositelnost´ı ani se sd´ılen´ım mezi uˇzivateli. Ale n´avrh uˇzivatelsk´eho rozhran´ı pro tento typ aplikac´ı je sloˇzit´e a v´ysledn´e uˇzivatelsk´e rozhran´ı nenab´ız´ı takov´e moˇznosti a takovou pˇr´ıvˇetivost prostˇred´ı, jako nab´ız´ı bˇeˇzn´e desktopov´e aplikace. Je to d´ano t´ım, ˇze HTML nenab´ız´ı takov´e grafick´e uˇzivatelsk´e komponenty, kter´e maj´ı bˇeˇzn´e deskotopov´e aplikace standardnˇe. Mezi takov´e komponenty patˇr´ı Menu, PopupMenu, v´ıcesloupcov´e seznamy, editovateln´e tabulky, zobrazen´ı stromov´ych struktur, z´aloˇzky, komponenta pro v´ybˇer datumu a dalˇs´ı. Tyto pokroˇcil´e komponenty je si nutn´e, dosti sloˇzitˇe, pomoc´ı prostˇredk˚u HTML/Javascript/CSS implementovat a nav´ıc n´am zde kladou omezen´ı i nˇekter´e internetov´e prohl´ıˇzeˇce, protoˇze maj´ı r˚uznou podporu pro nˇekter´e vlastnosti a tak´e chov´an´ı nˇekter´ych vlastnost´ı. Ale je i probl´em s prvky uˇzivatelsk´e rozhran´ı, kter´e HTML nab´ız´ı, a to v pˇr´ıpadˇe pokud chceme pˇres tyto prvky zobrazit v HTML vytvoˇren´e popumenu, tak se n´am tyto prvky zobraz´ı i v tomto popupmenu.

Pokud si vybereme pozitivn´ı vlastnosti z obou typ˚u pˇredchoz´ıch aplikac´ı, jako je vzhled a jednoduch´y n´avrh uˇzivatelsk´eho rozhran´ı u bˇeˇzn´ych deskotopov´ych aplikac´ı a pˇrenositelnost, jednoduch´e moˇznosti sd´ılen´ı aplikace mezi v´ıce uˇzivateli u webov´ych aplikac´ı, tak n´am vznikne vzd´alenˇe ovl´adan´a aplikace pˇres WWW. Implementace aplikace z˚ustane na serveru. Uˇzivatelsk´e rozhran´ı bude ve formˇe appletu, kter´y bude spuˇstˇen v prostˇred´ı internetov´eho prohl´ıˇzeˇce. Nav´ıc n´am applet umoˇzˇnuje vytvoˇrit uˇzivatelsk´e rozhran´ı, kter´e bude nez´avisl´e na platformˇe ani na internetov´em prohl´ıˇzeˇci. A nav´ıc vzhled cel´eho uˇzivatelsk´eho rozhran´ı bude stejn´e na jak´e jsme zvykl´ı v dan´em prostˇred´ı (MS Windows, Mac OS, Linux). A im-plementace takov´eho typu aplikace bude prob´ıhat tak, jako by to byla bˇeˇzn´a desktopov´a aplikace. Jenom budu m´ıt k dispozici ekvivalentn´ı knihovnu ke knihovnˇe AWT/Swing, takˇze bude moˇzn´e pouˇz´ıt i st´avaj´ıc´ı desktopovou aplikaci a pouhou zmˇenou importovan´e knihovny, lze vytvoˇrit aplikaci, kter´a bude ovl´adan´a vzd´alenˇe pˇres WWW.

C´ılem pr´ace je navrhnout a implementovat knihovnu, kter´a umoˇzn´ı tvorbu vzd´alenˇe ovl´adan´ych aplikac´ı. N´avrh je zaloˇzen na aplikaˇcn´ım rozhran´ı standardn´ı Javovsk´e kni-hovny AWT/Swing (kapitola 2), komunikace mezi klientskou a serverovou ˇc´ast´ı vyuˇz´ıv´a prostˇredky RMI (popsan´e v kapitole 3). Navrˇzen´a architektura je pops´ana v kapitole 4 a

(10)

implementaˇcn´ı detaily jsou d´ale rozebr´any v kapitole 5. V kapitole 6 je pops´ana aplikace pro demonstrov´an´ı funkˇcnosti syst´emu vzd´alenˇe ovl´adan´ych aplikac´ı. V pˇr´ıloh´ach je popis kom-ponent pro tvorbu aplikac´ı ovl´adan´ych pˇres WWW a uk´azka srovn´an´ı k´odu aplikace napsan´e jako bˇeˇzn´a deskotopov´a aplikace s pouˇzit´ım standardn´ı javovsk´e knihovny AWT/Swing a k´odu t´e stejn´e aplikace zapsan´e jako vzd´alenˇe ovl´adan´a aplikace.

(11)

Kapitola 2

Tvorba GUI a applet˚

u v jazyce

Java

V Javˇe je moˇzn´e vytvoˇrit grafick´e uˇzivatelsk´e rozhran´ı pomoc´ı knihovny java.awt nebo javax.swing. Pˇriˇcemˇz tˇr´ıdy, kter´e jsou v knihovnˇe Swing, jsou odvozeny od tˇr´ıd z knihovny Awt. D´ale se budu vˇenovat komponent´am z knihovny Swing.

2.1

Kontejnery

Kontejner je spr´avce komponent, kter´e chceme, aby se zobrazili na nˇejak´e jin´e komponentˇe. Nejˇcastˇeji se pouˇz´ıvaj´ı: JFrame, JDialog, JApplet, JPanel.

Pˇriˇcemˇz kaˇzd´a komponenta m´a svoje specifick´e pouˇzit´ı:

JFrame – Obvykle se pouˇz´ıv´a pro vytvoˇren´ı hlavn´ıho okna aplikace. Souˇc´ast´ı je JRootPane (obr´azek2.1), kter´y je tvoˇren glassPane (Component) a layeredpane (JLayeredPane). layeredpane je jeˇstˇe tvoˇren contentPane (Component) a voliteln´ym menuBar (JMenuBar). layeredpane je rodiˇc vˇsech komponent, kter´e jsou zde um´ıstˇeny.

JDialog – Vyuˇz´ıv´a se pro tvorbu mod´aln´ıch nebo nemod´aln´ıch dialogov´ych oken. Souˇc´ast´ı je JRootPane.

JApplet – Je vhodn´y pro vloˇzen´ı do jin´e aplikace (pˇr. webov´a str´anka). Nem˚uˇze b´yt pouˇzit jako samostatn´y program. Souˇc´ast´ı je JRootPane. V´ıce o appletech je n´aps´ano d´ale. JPanel – Je vhodn´y pro umist’ov´an´ı souvisej´ıc´ıch komponent na JFrame, JDialog ˇci na

jin´y JPanel.

2.2

Spr´

avci rozvrˇ

zen´ı

Pokud si chceme zjednoduˇsit n´avrh a rozmist’ov´an´ı komponent, kter´e jsou vloˇzeny do kon-tejneru, tak m˚uˇzeme vyuˇz´ıt nˇekter´eho ze spr´avc˚u rozvrˇzen´ı, kter´y se bude starat o um´ıstˇen´ı a velikost komponenty. T´ım je moˇzn´e vytv´aˇret flexibiln´ı uˇzivatelsk´e rozhran´ı, jinak si takov´e chov´an´ı mus´ıme sami pracnˇe naprogramovat.

Java poskytuje nˇekolik spr´avc˚u rozvrˇzen´ı, kaˇzd´y z nich m´a jin´e chov´an´ı a jinak se i pouˇz´ıv´a. Pokud nechceme vyuˇz´ıt sluˇzeb od ˇz´adn´eho ze spr´avc˚u rozvrˇzen´ı, m˚uˇzeme nastavit

(12)

Obr´azek 2.1: Vrstvy JRootPane

jako spr´avce rozvrˇzen´ı null, potom jednotliv´e komponenty jsou um´ıstˇeny staticky podle zadan´ych parametr˚u (velikost, pozice). Tak´e m´ame moˇznost si dalˇs´ı spr´avce rozvrˇzen´ı do-programovat, aby vyhovovali podle naˇsich pˇredstav.

D´ale pˇredstav´ım nˇekolik z´akladn´ıch spr´avc˚u rozvrˇzen´ı: CardLayout, FlowLayout, Grid-Layout, BorderGrid-Layout, GridBagGrid-Layout, BoxLayout.

2.2.1 CardLayout

Jedn´a se o nejjednoduˇs´ı spr´avce rozvrˇzen´ı. Umoˇzˇnuje zobrazit v jednom okamˇziku pouze jednu komponentu. Velikost komponenty je urˇcena podle dostupn´e zobrazovac´ı plochy kon-tejneru. Kter´a komponenta bude zobrazena, m˚uˇzeme urˇcit pomoc´ı metod tˇr´ıdy CardLayout next(), previous(), first(), last() a show(). Metoda first() zobraz´ı komponentu, kter´a je prvn´ı v seznamu. Metoda last() zobraz´ı komponentu, kter´a je posledn´ı v seznamu. Metody next(), previous() umoˇzˇnuj´ı pr˚uchod seznamu dopˇredu nebo dozadu. Metoda show() zobraz´ı konkretn´ı komponentu. Kaˇzd´a komponenta mus´ı m´ıt pˇriˇrazen´y jedineˇcn´y n´azev.

2.2.2 FlowLayout

Tento spr´avce rozvrˇzen´ı uspoˇr´ad´av´a komponenty podle toho v jak´em jsou poˇrad´ı vkl´ad´any do kontejneru. Uspoˇr´ad´av´a je postupnˇe zleva doprava a shora dol˚u. Velikosti jednotliv´ych komponent nemˇen´ı, ponech´av´a je tak, jak byly nastaveny. Kolik komponent um´ıst´ı na jedin´em ˇr´adku, z´aleˇz´ı podle toho, jak´a je ˇs´ıˇrka ˇr´adku. Umoˇzˇnuje nastavit, jak se maj´ı ˇr´adky s komponentami zarovn´avat pomoc´ı konstant tˇr´ıdy FlowLayout LEFT, CENTER, RIGHT.

2.2.3 GridLayout

Tento spr´avce rozvrˇzen´ı rozdˇel´ı prostor na mˇr´ıˇzku rovnomˇern´ych bunˇek. Do kaˇzd´e buˇnky lze um´ıstit jednu komponentu. Jak m´a b´yt prostor rozdˇelen, lze urˇcit parametry tˇr´ıdy GridLayout a to poˇctem ˇr´adk˚u a sloupc˚u. Velikost kaˇzd´e komponenty je upravena tak, aby se veˇsla do buˇnky.

(13)

2.2.4 BorderLayout

Tento spr´avce rozvrˇzen´ı rozdˇel´ı plochu na pˇet oblast´ı, kam lze vkl´adat komponenty (sever, jih, v´ychod, z´apad a stˇred). Kam bude jednotliv´a komponenta um´ıstˇena, je urˇceno kon-stantou tˇr´ıdy BorderLayout NORTH, SOUTH, EAST, WEST, CENTER. Do kaˇzd´e oblasti lze vloˇzit pouze jednu komponentu. Velikost komponenty bude upravena podle velikosti jednotliv´e oblasti.

2.2.5 GridBagLayout

Tento spr´avce rozvrˇzen´ı je nejflexibilnˇejˇs´ı pro n´avrh uˇzivatelsk´eho rozhran´ı, tak´e je nejsloˇ zi-tˇejˇs´ı na pouˇzit´ı. Podle n´azvu, tak jako GridLayout, rozdˇeluje plochu na mˇr´ıˇzku bunˇek. Ale zde nen´ı vyˇzadov´ano, aby kaˇzd´a komponenta mˇela stejnou velikost, ˇc´ımˇz se velikost kaˇzd´eho ˇr´adku a sloupce m˚uˇze liˇsit. Tak´e podporuje nastavov´an´ı omezen´ı GridBagConstraints, kter´e urˇc´ı, do kter´e buˇnky se komponenta vloˇz´ı, a jak se bude komponenta v r´amci buˇnky chovat. Moˇzn´e je tˇreba zarovnan´ı, velikost, pˇr´ıpadnˇe jestli bude i jedna komponenta zo-brazena i pˇres sousedn´ı buˇnky. Velikost komponent je vˇetˇsinou urˇcena upˇrednostˇnovan´ymi rozmˇery, pokud je prostor dostateˇcnˇe velk´y, jinak nastav´ı rozmˇery, kter´e budou vyhovovat. Ale nikdy nestav´ı velikost menˇs´ı, neˇz jak´a je minim´aln´ı velikost komponenty.

2.2.6 BoxLayout

Tento spr´avce rozvrˇzen´ı je zjednoduˇsenou verz´ı GridBagLayout. Umoˇzˇnuje zobrazovat kom-ponenty pouze na jedin´em ˇr´adku nebo sloupci. Oproti ostatn´ım spr´avc˚um rozvrˇzen´ı, spr´avce rozvrˇzen´ı BoxLayout vyuˇz´ıv´a v´ıce i urˇcit´ych vlastnost´ı komponent, jako je minim´aln´ı a maxim´aln´ı velikost komponenty. D´ale vyuˇz´ıv´a odsazen´ı na ose X a Y. Velikost kompo-nent nastavuje podle dostupn´e velikosti zobrazovan´e plochy, ale tak´e pˇrihl´ıˇz´ı k minim´aln´ı a maxim´aln´ı velikosti komponent, takˇze nenastav´ı velikost menˇs´ı, neˇz jak´a je ud´ana minim´aln´ı velikost´ı. A naopak nenastav´ı velikost vˇetˇs´ı, neˇz jakou ud´av´a maxim´aln´ı velikost.

2.3

Grafick´

e komponenty

Pro tvorbu grafick´eho uˇzivatelsk´eho rozhran´ı m´ame k dispozici celou ˇradu prvk˚u grafick´eho uˇzivatelsk´eho rozhran´ı. R˚uzn´e typy tlaˇc´ıtek ( JCheckbox, JToggleButton, JRadioButton, JButton ...), editaˇcn´ı pole (JTextField, JTextArea ...), statick´e objekty (JLabel ...), prvky pro tvorbu menu a popupmenu (JMenu, JMenuItem, JPopupMenu ...), sloˇzitˇejˇs´ı prvky pro zobrazen´ı r˚uzn´ych seznam˚u (JComboBox, JList, JTable, JTree ...) a spoustu dalˇs´ıch prvk˚u. Prvky um´ıst’ujeme na nˇejakou zobrazovanou plochu (JFrame, JPanel ...). Nastavujeme jim, jak´e ud´alosti budeme zpracov´avat.

2.4

Ud´

alosti

Pro zpracov´an´ı ud´alost´ı je moˇzn´e pouˇz´ıt dva modely: model pozorovatele (nebo tak´e vy-davatel/odbˇeratel) a model dotazov´an´ı. Model dotazov´an´ı nen´ı pˇr´ıliˇs efektivn´ı, protoˇze je nutn´e se opakovanˇe dotazovat, zdali uˇz nˇejak´a ud´alost nastala a jestli se tedy m´a prov´est jej´ı obsluha. Model pozorovatele je mnohem lepˇs´ı. Pokud nˇejak´a ud´alost nastane, tak je moˇzn´e okamˇzitˇe prov´est zpracov´an´ı ud´alosti. V programovac´ıch jazyc´ıch se model pozorovatele

(14)

naz´yv´a ud´alostmi ˇr´ızen´e programov´an´ı. V jazyce Java je tento model tak´e pouˇzit. Tud´ıˇz jen programujeme, co se bude d´ıt, kdyˇz nˇejak´a ud´alost nastane.

Nen´ı potˇreba reagovat na vˇsechny ud´alosti, kter´e nastanou. M´ame moˇznost si vybrat na jakou ud´alost budeme reagovat. Staˇc´ı si jen vytvoˇrit posluchaˇce (listener, objekt im-plementuj´ıc´ı rozhran´ı EventListener) a pˇriˇradit ho komponentˇe, u kter´e chceme reagovat na danou ud´alost. V Javˇe existuj´ı rozˇs´ıˇren´ı k obecn´emu rozhran´ı EventListener, dˇel´ı se podle toho, na jak´e typy ud´alosti se specializuj´ı. Pro ud´alosti generovan´e myˇs´ı se pouˇzije rozhran´ı MouseListener, pro ud´alost´ı generovan´e nˇejakou akc´ı se pouˇzije ActionListener, pro ud´alosti generovan´e stisknut´ım nˇejak´e kl´avesy se pouˇzije KeyListener a mnoh´e dalˇs´ı.

Pokud implementujeme nˇejak´e poˇzadovan´e rozhran´ı posluchaˇce, pak uˇz staˇc´ı pˇredat tento posluchaˇc komponentˇe pouˇzit´ım metody addXXXListener(), kde XXX znaˇc´ı n´azev implementovan´eho rozhran´ı (pro MouseListener to bude addMouseListener()). Protoˇze kaˇzd´e rozhran´ı posluchaˇce nab´ız´ı mnoho metod (kaˇzd´a je na obsluhu jin´e ud´alost), kter´e je nutn´e implementovat, i kdyˇz chceme reagovat pouze jen na jednu ud´alost, m´ame k dispozici adapt´ery (pˇr. MouseAdapter), kter´e implementuj´ı rozhran´ı posluchaˇce, tak ˇze na ud´alost nijak nereaguj´ı. T´ım je d´an prostor k odvozen´ı a pˇrekryt´ı jen metody, kter´a n´as zaj´ım´a.

Kaˇzd´e metodˇe pro zpracov´an´ı ud´alosti je samozˇrejmˇe pˇred´ana informace o vznikl´e ud´alosti a to kter´a komponenta ji generuje. B´azov´a tˇr´ıda pro vˇsechny typy ud´alosti je java.util.EventObject, ostatn´ı tˇr´ıdy ud´alost´ı jsou od n´ı odvozeny, podle toho o jak´y typ ud´alosti se jedn´a. Napˇr´ıklad pro ud´alosti generovan´e stisknut´ım kl´avesnice je pˇred´an objekt tˇr´ıdy KeyEvent, kde se dozv´ıme, kter´e kl´avesa byla stisknuta a zdali nebylo z´aroveˇn stisknuta kombinace kl´aves (pˇr. CTRL+S).

2.5

Applet

Applet je speci´aln´ı kontejner pro prvky grafick´eho uˇzivatelsk´eho rozhran´ı, kter´y m˚uˇze b´yt vloˇzen jako souˇc´ast webov´e str´anky, protoˇze poskytuje rozhran´ı pro komunikaci mezi ap-pletem a prostˇred´ım, ve kter´em je spuˇstˇen. Protoˇze applet si je moˇzn´e st´ahnout jako souˇc´ast ned˚uvˇeryhodn´ych webov´ych str´anek, a pak je k´od appletu spuˇstˇen na klientsk´em poˇc´ıtaˇci, je nutn´e aby mˇel definovan´e omezen´ı, co m˚uˇze prov´adˇet a co ne. Proto je ap-plet spuˇstˇen v uzavˇren´em prostˇred´ı “p´ıskoviˇstˇe” (sandbox), kter´e mu odm´ıtne vykon´avat nˇejakou podezˇrelou ˇcinnost. Toto prostˇred´ı zajiˇst’uje virtu´aln´ı stroj jazyka Java.

V´yhody appletu je rozˇs´ıˇren´ı statick´eho obsahu webov´ych str´anek. Umoˇzˇnuje tvoˇrit sloˇzitˇejˇs´ı dynamick´y obsah oproti Javascriptu a nav´ıc k´od appletu je uˇz zkompilov´an do byte-k´odu, takˇze je mnohem rychlejˇs´ı na interpretaci neˇz Javascript.

Bezpeˇcnostn´ı politika pro applety se liˇs´ı podle toho, jestli se jedn´a o d˚uvˇeryhodn´y nebo ned˚uvˇeryhodn´y k´od. Za d˚uvˇeryhodn´y applet se povaˇzuje ten, kter´y je digit´alnˇe podeps´an, a potom m´a vˇetˇs´ı “p´ıskoviˇstˇe” na hran´ı. M˚uˇze tˇreba pˇristupovat k lok´aln´ım soubor˚um. Seznam omezen´ı pro ned˚uvˇeryhodn´e applety:

• Nelze ˇc´ıst soubory na klientsk´em souborov´em syst´emu.

• Nelze zapisovat do soubor˚u na klientsk´em souborov´em syst´emu.

• Nelze mazat soubory na klientsk´em souborov´em syst´emu a to bud’ metodou File.delete() nebo vol´an´ım syst´emov´eho pˇr´ıkazu rm nebo del.

• Nelze pˇrejmenov´avat soubory na klientsk´em souborov´em syst´emu a to bud’ metodou File.renameTo() nebo vol´an´ım syst´emov´eho pˇr´ıkazu mv nebo rename.

(15)

• Nelze vytv´aˇret adres´aˇre na klientsk´em souborov´em syst´emu a to bud’ metodou File.mkdirs() nebo vol´an´ım syst´emov´eho pˇr´ıkazu mkdir.

• Nelze prohl´ıˇzet obsah adres´aˇr˚u.

• Nelze testovat, zdali nˇejak´y soubor existuje ˇci ne.

• Nelze z´ısk´avat informace o nˇejak´em souboru jako je velikost, typ, datum a ˇcas posledn´ı modifikace.

• Nelze vytv´aˇret s´ıt’ov´e spojen´ı k jak´emukoli jin´emu poˇc´ıtaˇci, kromˇe toho odkud byl applet staˇzen.

• Nelze poslouchat a pˇrij´ımat s´ıt’ov´e spojen´ı na libovoln´em portu na klientsk´em syst´emu. • Nelze vytvoˇrit okno na nejvyˇsˇs´ı ´urovni bez zobrazen´eho upozornˇen´ı, ˇze okno bylo

vytvoˇreno ned˚uvˇeryhodn´ym appletem.

• Nelze jak´ymkoli zp˚usobem z´ısk´avat jm´eno uˇzivatele nebo jm´eno jeho domovsk´eho adres´aˇre pˇres syst´emov´e promˇenn´e user.name, user.home, user.dir, java.home a java.class.path.

• Nelze definovat jakoukoli syst´emovou promˇenou.

• Nelze spustit jak´ykoli program pouˇzit´ım metody Runtime.exec().

• Nelze ukonˇcit interpret Javy pouˇzit´ım System.exit() nebo Runtime.exit(). • Nelze naˇc´ıtat dynamick´e knihovny na klientsk´em syst´emu pouˇzit´ım metod load()

nebo loadLibrary() z tˇr´ıd Runtime nebo System.

• Nelze vytv´aˇret nebo jinak manipulovat s vl´akny, kter´e nejsou ve stejn´e skupinˇe vl´aken (ThreadGroup) jako applet.

• Nelze vytv´aˇret ClassLoader. • Nelze vytv´aˇret SecurityManager.

• Nelze specifikovat funkce pro s´ıt’ovou kontrolu pomoc´ı ContentHandlerFactory, SocketImplFactory nebo URLStreamHandlerFactory.

(16)

Kapitola 3

Remote Method Invokation (RMI)

Jedn´a se o distribuovanou technologii, kter´a umoˇzˇnuje vzd´alen´e vol´an´ı metod objekt˚u. Podobn´y syst´em je vzd´alen´e vol´an´ı procedur (RPC).

3.1

Architektura

Distribuovan´y syst´em je tvoˇren registrem, kter´y uchov´av´a odkazy na vzd´alen´e objekty. Server aplikace, kter´a nab´ız´ı objekty pro vzd´alen´y pˇr´ıstup, mus´ı odkaz na tyto objekty, pro vzd´alen´e vol´an´ı, zaregistrovat v registru. Klient, kter´y chce z´ıskat odkaz na vzd´alen´y objekt, se nejdˇr´ıve dot´aˇze registru, zdali poˇzadovan´y objekt je registrov´an, a pokud je registrov´an, tak mu vr´at´ı odkaz na poˇzadovan´y objekt. Komunikace mezi jednotliv´ymi ˇc´astmi je zajiˇstˇen pomoc´ı RMI protokolu. Na obr´azku3.1je jeˇstˇe web server, kter´y zde vystupuje jako zp˚usob distribuce k´odu pro klienta pomoc´ı URL protokolu (HTTP, FTP, ...).

Obr´azek 3.1: RMI architektura

3.2

Architektura s firewall

Standardnˇe se RMI snaˇz´ı nav´azat pˇr´ım´e spojen´ı pˇres internet ke vzd´alen´emu poˇc´ıtaˇci, jenˇze takov´e pokusy mohou blokovat firewally. Ale RMI poskytuje jeˇstˇe dva alternativn´ı zp˚usoby

(17)

spojen´ı pomoc´ı HTTP mechanizmu, coˇz umoˇzn´ı klientovi za firewallem volat vzd´alen´e metody.

RMI vol´an´ı je posl´ano v tˇele HTTP POST poˇzadavku, a potom v´ysledek je vr´acen v HTTP odpovˇedi. Poˇzadavek je moˇzn´e poslat dvˇema zp˚usoby, z´aleˇz´ı co umoˇzn´ı firewall. Prvn´ı moˇznost je, ˇze HTTP dotaz bude posl´an hostiteli na libovoln´y port, na kter´em RMI server poslouch´a. Nebo firewall umoˇzˇnuje poslat HTTP poˇzadavky jen na zn´am´e HTTP porty, pak je HTTP dotaz posl´an hostiteli na port 80, kde poslouch´a HTTP server a zde bude spuˇstˇen skript, kter´y tento poˇzadavek zpracuje t´ım, ˇze se spoj´ı s RMI serverem a pˇred´a RMI vol´an´ı ke zpracov´an´ı. Po zpracovan´ı RMI serverem je v´ysledek pˇred´an zpˇet skriptu a ten vytvoˇr´ı HTTP odpovˇed’.

Obr´azek 3.2: RMI architektura pˇres firewall

Vzd´alen´e vol´an´ı metod objektu pˇres HTTP poˇzadavky je pomalejˇs´ı neˇz, kdyby byly pos´ıl´any pˇres pˇr´ım´e spojen´ı.

3.3

RMI protokol

Pˇrenos zpr´av se prov´ad´ı pomoc´ı dvou proud˚u (v´ystupn´ı a vstupn´ı). V´yznam proud˚u je ve vztahu ke klientovi. V´ystupn´ı proud se pouˇz´ıv´a pro odchoz´ı zpr´avy a vstupn´ı proud pro pˇr´ıjem pˇr´ıchoz´ıch zpr´av.

3.3.1 V´ystupn´ı proud

Proud je tvoˇren hlaviˇckou a pak n´asleduje seznam zpr´av. Specifikace form´atu v´ystupn´ıho proudu je pˇrebr´ana z dokumentu [1, JavaT M Remote Method Invocation Specification]. Out:

(18)

Header Messages HttpMessage Header:

0x4a 0x52 0x4d 0x49 Version Protocol Version: 0x00 0x01 Protocol: StreamProtocol SingleOpProtocol MultiplexProtocol StreamProtocol: 0x4b SingleOpProtocol: 0x4c MultiplexProtocol: 0x4d Messages: Message Messages Message

Jsou definov´any tˇri typy odchoz´ıch zpr´av: Call – vol´an´ı metody

Ping – testov´an´ı zdali vzd´alen´y poˇc´ıtaˇc je pˇripraven

DgcAck – potvrzen´ı, ˇze klient pˇrijal vzd´alen´e objekty v n´avratov´e hodnotˇe Message: Call Ping DgcAck Call: 0x50 CallData Ping: 0x52 DgcAck: 0x54 UniqueIdentifier CallData:

ObjectIdentifier Operation Hash Argumentsopt ObjectIdentifier:

ObjectNumber UniqueIdentifier UniqueIdentifier:

Number Time Count Arguments: Value Arguments Value Value: Object Primitive

(19)

HttpMessage:

HttpPostHeader Header Message HttpReturn:

HttpResponseHeader Return

3.3.2 Vstupn´ı proud

Specifikace form´atu zpr´av pro vstupn´ı proud je pˇrebr´ana z dokumentu [1, JavaT M Remote Method Invocation Specification].

Jsou definov´any tˇri typy pˇr´ıchoz´ıch zpr´av: ReturnData – v´ysledek vol´an´ı metody HttpReturn – v´ysledek v HTTP protokolu PingAck – odpovˇed’ na Ping

In: ProtocolAck Returns ProtocolNotSupported HttpReturn ProtocolAck: 0x4e ProtocolNotSupported: 0x4f Returns: Return Returns Return Return: ReturnData PingAck ReturnData: 0x51 ReturnValue PingAck: 0x53 ReturnValue: 0x01 UniqueIdentifier Valueopt 0x02 UniqueIdentifier Exception

(20)

3.3.3 Typy hodnot pouˇzit´ych v RMI protokolu

Pouˇzit´y typ Typ v Javˇe Count short Exception java.lang.Exception Hash long Hostname UTF Number int Object java.lang.Object ObjectNumber long Operation int PortNumber int

Primitive byte, int, short, long...

Time long

3.4

renos parametr˚

u

Aby bylo moˇzn´e pˇren´aˇset parametry pro vol´an´ı vzd´alen´e metody nebo n´avratov´e hodnoty, mus´ı tyto parametry implementovat rozhran´ı java.io.Serializable. Parametry, kter´e nejsou poskytov´any pro vzd´alen´y pˇr´ıstup, jsou pˇred´any jako kopie. Tedy nejsou pˇred´any referenc´ı, jak to b´yv´a obvykl´e v Javˇe. Proto pˇred vol´an´ım vzd´alen´e metody jsou pro tyto parametry a n´avratovou hodnoty vytvoˇreny kopie, kter´e jsou pak serializovan´e.

(21)

Kapitola 4

avrh architektury pro vzd´

alen´

e

ovl´

ad´

an´ı aplikac´ı

Architektura bude navrˇzena jako klient-server architektura, kde klienta bude pˇredstavovat applet spuˇstˇen´y v prostˇred´ı internetov´eho prohl´ıˇzeˇce a server bude aplikace s virtu´aln´ım grafick´ym uˇzivatelsk´ym rozhran´ım. Navrˇzen´a architektura je na obr´azku 4.1.

(22)

Klient bude tvoˇren z: • appletu

• periodick´eho dotazov´an´ı • RMI

Server bude tvoˇren z: • vlastn´ı aplikace

• virtu´aln´ıho grafick´eho uˇzivatelsk´e rozhran´ı • fronty pˇr´ıkaz˚u

• fronty zpr´av • RMI

4.1

Komunikace klient-server

Komunikaci mezi klientem a serverem bude zajiˇst’ovat RMI (Remote Method Invocation), kter´e zajist´ı pˇrenos zpr´av pr´avˇe vol´an´ım vzd´alen´e metody. Komunikaˇcn´ı rozhran´ı pˇres RMI, kter´e bude poskytovat server, umoˇzn´ı z´ıskat seznam pˇr´ıkaz˚u a signalizovat vzniklou ud´alost na klientovi.

Rozhran´ı poskytovan´e serverem:

interface ServerAppInterface extends Remote {

List<Command> getCommands() throws RemoteException; void event(Event e) throws RemoteException;

}

Protoˇze RMI umoˇzˇnuje jen volat metody server aplikace, je nutn´e, aby se applet ak-tivnˇe dotazoval (polling) server aplikace, zdali m´a obdrˇzet zpr´avu. Tato funkˇcnost bude zajiˇstˇena ˇc´ast´ı appletu pro periodick´e vol´an´ı getCommands() a pot´e pokud jsou nˇejak´e pˇr´ıkazy obdrˇzeny, bude informovat applet.

4.2

Reprezentace vzd´

alen´

ych objekt˚

u

Vytvoˇren´ı vzd´alen´ych objekt˚u se bude prov´adˇet obecn´ym mechanismem pomoc´ı objektu Class, kter´y umoˇzn´ı vytvoˇrit instanci tˇr´ıdy, kterou objekt tˇr´ıdy Class popisuje. Podobnˇe se bude postupovat pˇri vol´an´ı metod vzd´alen´ych objekt˚u. Pouˇzije se objekt tˇr´ıdy Method, kter´y popisuje metodu tˇr´ıdy. Zavol´an´ı popisovan´e metody se provede metodou invoke(). Takˇze pro zavol´an´ı vzd´alen´e metody n´am bude staˇcit popis tˇr´ıdy, textov´y n´azev metody, popis parametr˚u metody a hodnoty parametr˚u.

(23)

// vyvtoˇren´ı instance

Class jbutton = javax.swing.JButton.class;

javax.swing.JButton obj = (javax.swing.JButton)jbutton.newInstance(); // vol´an´ı metody

Class[] parameterType = { String.class }; Object[] args = { ‘‘Hello World!’’ }

jbutton.getMethod(‘‘setText’’, parameterType).invoke(obj, args);

Protoˇze nelze pouˇz´ıt pˇr´ımou referenci na vzd´alen´y objekt, mus´ıme si pomoct ˇretˇezcovou identifikac´ı, kter´a bude stejn´a pro klientsk´y i serverov´y objekt. A na obou ˇc´astech se bude tato identifikace pˇrev´adˇet na kontr´etn´ı objekt.

4.3

Popis klienta

Applet bude vykon´avat pˇr´ıkazy, kter´e mu poˇsle server, jako tˇreba vytvoˇr tlaˇc´ıtko na pozici x,y a nastav popis na “abc”. Bude se tedy jednat o pˇr´ıkazy pro vytvoˇren´ı a ´upravu vzhledu grafick´eho uˇzivatelsk´eho rozhran´ı, ale tak´e zde budou pˇr´ıkazy pro nastaven´ı ud´alost´ı, kter´e maj´ı b´yt pos´ıl´any zpˇet na server. Budou to ud´alosti vznikaj´ıc´ı pˇri nˇejak´e akci uˇzivatele, jako je kliknut´ı na tlaˇc´ıtko ˇci jin´e akci. Posl´an´ı ud´alosti zpˇet na server bude provedeno prostˇrednictv´ym vol´an´ım vzd´alen´e metody serveru event(). V parametru funkce bude pˇred´ana ud´alost Event.

Form´at ud´alosti: class Event {

String srcObjId; // identifikace zdrojov´eho objektu String evId; // identifikace ud´alosti

Class evDispClass; // typ objektu (doruˇcovatele), kter´y bude // obsluhovat tuto ud´alost

Object[] evData; // hodnoty ud´alost´ı

List<UpdateCommand> updCommands; // synchronizaˇcn´ı pˇr´ıkazy }

Souˇc´ast´ı ud´alosti jsou i synchronizaˇcn´ı pˇr´ıkazy, kter´e generuje klient, aby bˇehem obsluhy ud´alosti mˇel server k dispozici aktu´aln´ı stav uˇzivatelsk´eho rozhran´ı, jak´y byl v dobˇe vzniku ud´alosti na klientovi.

Form´at synchronizaˇcn´ıho pˇr´ıkazu: class UpdateCommand

{

String objId; // identifikace objektu

String method; // n´azev volan´e metody (jedno parametrov´a) Class valClass; // typ hodnoty

Object val; // hodnota }

(24)

4.4

Popis serveru

Server pˇrij´ım´a zpr´avy od klienta prostˇrednictv´ım RMI a zaˇrazuje si je do fronty zpr´av, kde ˇ

cekaj´ı na zpracov´an´ı. Z fronty zpr´av si zpr´avu vyzvedne virtu´aln´ı grafick´e rozhran´ı a pˇred´a ji ke zpracov´an´ı vlastn´ı aplikaci. Aplikace bˇehem zpracov´an´ı zpr´avy m˚uˇze prostˇrednictv´ım virtu´aln´ıho grafick´eho rozhran´ı generovat pˇr´ıkazy, kter´e budou mˇenit uˇzivatelsk´e rozhran´ı. Tyto pˇr´ıkazy jsou vkl´ad´any do fronty pˇr´ıkaz˚u. Seznam tˇechto pˇr´ıkaz˚u je posl´an pˇres RMI klientovi.

Z´aklad pro tvorbu pˇr´ıkaz˚u. Identifikuje objekt, kter´emu je pˇr´ıkaz urˇcen. class Command

{

String objId; // identifikace objektu }

Pˇr´ıkazy, kter´e generuje server jsou:

CreateComponent – Vytvoˇr´ı komponentu podle zadan´eho typu. class CreateComponentCommand extends Command

{

Class<?> objClass; // typ objektu, kter´y m´a b´yt vytvoˇren }

AssociateComponent – Vytvoˇr´ı vazbu mezi dvˇema komponentami. Vˇetˇsinou se jedn´a o um´ıstˇen´ı jedn´e komponenty do jin´e. Napˇr´ıklad JButton do JPanel. Jeˇstˇe obsahuje popis metody, kterou m´a pouˇz´ıt, napˇr´ıklad u JPanel m´a pouˇz´ıt add() a JScrollPane m´a pouˇz´ıt setViewportView().

class AssociateComponentCommand extends Command {

String methodName; // n´azev volan´e metody

Class<?>[] parameterType; // typy parametr˚u volan´e metody Object[] parameters; // hodnoty parametr˚u volan´e metody String assocObjId; // identifikace nadˇrazen´e komponenty }

SetAttributeComponent – Pˇr´ıkaz pro zavol´an´ı nˇejak´e metody komponenty, obvykle se jedn´a o nastaven´ı nˇejak´e vlastnosti. Pˇr´ıkaz obsahuje identifikaci komponenty a popis metody, kterou chceme zavolat. Popis metody se skl´ad´a z n´azvu metody, typy parametr˚u metody a hodnoty parametr˚u, kter´e chceme nastavit.

class SetAttributeComponentCommand extends Command {

String methodName; // n´azev volan´e metody

Class<?>[] parameterType; // typy parametr˚u volan´e metody Object[] parameters; // hodnoty parametr˚u volan´e metody }

(25)

CreateModel – Vytvoˇr´ı model, kter´y vyuˇz´ıvaj´ı nˇekter´e komponenty (JComboBox – List-Model, JTable – TableModel), podle zadan´eho typu.

class CreateModelCommand extends Command {

Class<?> objClass; // typ objektu, kter´y m´a b´yt vytvoˇren }

AssociateModel – Vytvoˇr´ı vazbu mezi komponentou a modelem. Obsahuje identifikaci komponenty a identifikaci modelu a popis metody komponenty, kter´a se m´a pouˇz´ıt. class AssociateModelCommand extends Command

{

String methodName; // n´azev volan´e metody

Class<?>[] parameterType; // typy parametr˚u volan´e metody Object[] parameters; // hodnoty parametr˚u volan´e metody String assocObjId; // identifikace nadˇrazen´e komponenty }

SetAttributeModel – Pˇr´ıkaz pro zavol´an´ı nˇejak´e metody komponenty, obvykle se jedn´a o nastaven´ı nˇejak´e vlastnosti. Pˇr´ıkaz obsahuje identifikaci modelu a popis metody, kterou chceme zavolat. Popis metody se skl´ad´a z n´azvu metody, typy parametr˚u metody a hodnoty parametr˚u, kter´e chceme nastavit.

class SetAttributeModelCommand extends Command {

String methodName; // n´azev volan´e metody

Class<?>[] parameterType; // typy parametr˚u volan´e metody Object[] parameters; // hodnoty parametr˚u volan´e metody }

SetEvent – Slouˇz´ı pro nastaven´ı odeb´ır´an´ı nˇekter´e ud´alosti, kter´a nastane nad zadanou komponentou. Pˇr´ıkaz obsahuje identifikaci komponenty, identifikaci EventHandler, kter´y se m´a pouˇz´ıt, a popis metody, kter´a se m´a zavolat.

class SetEventCommand extends Command {

String methodName; // n´azev volan´e metody

Class<?>[] parameterType; // parametry volan´e metody String evObjId; // identifikace obsluhy ud´alosti

Class evObjClass; // typ obsluhy ud´alosti (pro vytvoˇren´ı instance) }

RegisterEvent – Slouˇz´ı pro registraci ud´alost´ı, kter´e se maj´ı pos´ılat ke zpracov´an´ı na server. Pˇr´ıkaz obsahuje identifikaci komponenty a identifikaci EventHandler.

class RegisterEventCommand extends Command {

String evObjId; // identifikace obsluhy ud´alosti }

(26)

ConfirmEvent – Slouˇz´ı pro potvrzen´ı, ˇze ud´alost, kter´a byla posl´ana na server ke zpra-cov´an´ı, uˇz byla zpracov´ana. Pˇr´ıkaz obsahuje identifikaci ud´alosti, kter´a byla zpra-cov´ana.

class ConfirmEventCommand extends Command {

String evObjId; // identifikace obslouˇzen´e ud´alosti }

Ve v´yˇctu generovan´ych pˇr´ıkaz˚u jsou pˇr´ıkazy pro komponenty a pro modely, protoˇze pro identifikaci komponent z knihovny AWT/Swing lze vyuˇz´ıt vlastnost name, kterou nab´ız´ı z´akladn´ı tˇr´ıda Component, od kter´e jsou pak odvozeny veˇsker´e prvky uˇzivatelsk´eho rozhran´ı. Modely nemaj´ı ˇz´adnou vhodnou v´ychoz´ı tˇr´ıdu, takˇze je nutn´e si odvodit vlastn´ı tˇr´ıdy a sjednotit je implementac´ı rozhran´ı Identifiable.

interface Identifiable {

String getId();

void setId(String objId); }

(27)

Kapitola 5

Realizace

Celkov´a architektura navrˇzen´eho syst´emu je zn´azornˇena na obr´azku 5.1. Cel´y syst´em lze rozdˇelit na serverovou a klientskou ˇc´ast. V t´eto kapitole se budeme vˇenovat podrobnˇejˇs´ımu popisu obou tˇechto ˇc´ast´ı.

(28)

5.1

Klient

Pomoc´ıˇcasovaˇce si klient zajist´ı, aby periodicky prov´adˇel z´ısk´av´an´ı pˇr´ıkaz˚u pomoc´ı vzd´alen´ e-ho vol´an´ı getCommnads(). Z´ıskan´e pˇr´ıkazy jsou vykon´any (CommandHandler).

Ud´alosti, kter´e vzniknou nad uˇzivatelsk´ym rozhran´ı, zpracov´avaj´ı posluchaˇci, kteˇr´ı sig-nalizuj´ı, ˇze doˇslo ke zmˇenˇe uˇzivatelsk´eho rozhran´ı a tuto zmˇenu pˇredaj´ı spr´avci zmˇen (ModificationManager). Tak´e kontroluj´ı zdali tato ud´alost je registrov´ana serverovou ap-likac´ı a pokud ano, tak generuj´ı ud´alost, kter´a bude prostˇrednictv´ım odes´ılatele ud´alost´ı (EventSender) posl´ana na server. Odes´ılatel ud´alosti k dan´e ud´alosti jeˇstˇe pˇriloˇz´ı synchro-nizaˇcn´ı pˇr´ıkazy od spr´avce zmˇen a pak ji odeˇsle na server vzd´alen´ym vol´an´ı event(). Identi-fikaci odeslan´e ud´alosti pˇred´a spr´avci odeslan´ych ud´alost´ı (SentEventManager) a on provede zablokov´an´ı uˇzivatelsk´eho rozhran´ı, aby uˇzivatel nemohl vytv´aˇret dalˇs´ı ud´alosti dokud tato ud´alost nebude serverovou aplikac´ı zpracov´ana. Zpracov´an´ı ud´alosti je od serveru signali-zov´ano potvrzovac´ım pˇr´ıkazem (ConfirmEvent).

RMI – Slouˇz´ı pro vol´an´ı vzd´alen´ych metod.

ServerApp – Poskytuje rozhran´ı serveru, pˇres toto rozhran´ı se prov´ad´ı vol´an´ı event() a getCommands().

CommandHandler – Prov´ad´ı zpracov´an´ı pˇr´ıkaz˚u, kter´e obdrˇz´ı od server aplikace. Typy pˇr´ıkaz˚u, kter´e zpracov´av´a jsou:

CreateComponent – Vytvoˇr´ı komponentu podle zadan´e Class a pˇriˇrad´ı ji identi-fikaci, kter´a je stejn´a jak u klientsk´e komponenty tak i u serverov´e komponenty. AssociateComponent – Vytvoˇr´ı vazbu mezi dvˇema komponentami. Vˇetˇsinou se jedn´a o um´ıstˇen´ı jedn´e komponenty do jin´e. Napˇr´ıklad JButton do JPanel. Jeˇstˇe obsahuje popis metody, kterou m´a pouˇz´ıt, napˇr´ıklad u JPanel m´a pouˇz´ıt add() a JScrollPane m´a pouˇz´ıt setViewportView().

SetAttributeComponent – Pˇr´ıkaz pro zavol´an´ı nˇejak´e metody komponenty, ob-vykle se jedn´a o nastaven´ı nˇejak´e vlastnosti. Pˇr´ıkaz obsahuje identifikaci kompo-nenty a popis metody, kterou chceme zavolat. Popis metody se skl´ad´a z n´azvu metody, typy parametr˚u metody a hodnoty parametr˚u, kter´e chceme nastavit. CreateModel – Vytvoˇr´ı model, kter´y vyuˇz´ıvaj´ı nˇekter´e komponenty (JComboBox

– ListModel, JTable – TableModel), podle zadan´e Class a pˇriˇrad´ı ji identifikaci, kter´a je stejn´a jak u klientsk´eho modelu tak i u serverov´eho modelu.

AssociateModel – Vytvoˇr´ı vazbu mezi komponentou a modelem. Obsahuje identi-fikaci komponenty a identiidenti-fikaci modelu a popis metody komponenty, kter´a se m´a poˇz´ıt.

SetAttributeModel – Pˇr´ıkaz pro zavol´an´ı nˇejak´e metody komponenty, obvykle se jedn´a o nastaven´ı nˇejak´e vlastnosti. Pˇr´ıkaz obsahuje identifikaci modelu a popis metody, kterou chceme zavolat. Popis metody se skl´ad´a z n´azvu metody, typy parametr˚u metody a hodnoty parametr˚u, kter´e chceme nastavit.

SetComponentEvent – Slouˇz´ı pro nastaven´ı odeb´ır´an´ı nˇekter´e ud´alosti, kter´a na-stane nad zadanou komponentou. Pˇr´ıkaz obsahuje identifikaci komponenty, iden-tifikaci EventHandler, kter´y se m´a pouˇz´ıt, a popis metody, kter´a se m´a zavolat. RegisterEvent – Slouˇz´ı pro registraci ud´alost´ı, kter´e se maj´ı pos´ılat ke zpracov´an´ı na server. Pˇr´ıkaz obsahuje identifikaci komponenty a identifikaci EventHandler.

(29)

ConfirmEvent – Slouˇz´ı pro potvrzen´ı, ˇze ud´alost, kter´a byla posl´ana na server ke zpracov´an´ı, uˇz byla zpracov´ana. Pˇr´ıkaz obsahuje identifikaci ud´alosti, kter´a byla zpracov´ana. Souˇc´ast´ı zpracov´an´ı tohoto pˇr´ıkazu je odblokov´an´ı uˇzivatelsk´e rozhran´ı, kter´e bylo zablokov´ano pˇred odesl´an´ım ud´alosti na sever ke zpracov´an´ı. ComponentManager – Spr´avce komponent uchov´av´a seznam vytvoˇren´ych klientsk´ych

komponent a poskytuje pˇrevod identifikace na konkretn´ı komponentu.

ModelManager – Spr´avce model˚u uchov´av´a seznam vytvoˇren´ych klientsk´ych model˚u a poskytuje pˇrevod identifikace na konkretn´ı model.

EventManager – Spr´avce obsluh ud´alost´ı uchov´av´a seznam vytvoˇren´ych obsluh ud´alost´ı a poskytuje pˇrevod identifikace na konkretn´ı obsluhu ud´alosti.

EventHandlerManager – Spr´avce registrovan´ych ud´alost´ı obsahuje seznam registrova-n´ych ud´alost´ı, kter´e maj´ı b´yt posl´any na server ke zpracov´an´ı.

SentEventManager – Spr´avce odeslan´ych ud´alost´ı obsahuje seznam odeslan´ych ud´alost´ı na server ke zpracov´an´ı, a kter´e jeˇstˇe nebyli potvrzeny, ˇze jsou zpracov´any.

Timer – ˇCasovaˇc slouˇz´ı pro zajiˇstˇen´ı pravideln´eho opakovan´ı volan´ı z´ısk´an´ı a zpracov´an´ı pˇr´ıkaz˚u ze serveru.

Applet – Na appletu jsou um´ıst’ov´any prvky uˇzivatelsk´eho rozhran´ı, kter´e jsou viditeln´e uˇzivateli a se kter´ymi m˚uˇze pracovat.

EventHandler – Obsluha vznikl´e ud´alosti. Pokud je tato ud´alost registrovan´a, tak se poˇsle ke zpracov´an´ı na server. Pokud je to ud´alost, kter´a vnikla uˇzivatelskou zmˇenou nˇekter´e komponenty, tak se tato zmˇena uloˇz´ı k pozdˇejˇs´ımu odesl´an´ı na server. Nejl´epe jako souˇc´ast nˇejak´e ud´alosti, kter´a je posl´ana na server ke zpracov´an´ı.

ModificationManager – Spr´avce uˇzivatelsk´ych zmˇen nˇekter´ych komponent. N´aslednˇe pak generuje pˇr´ıkazy pro synchronizaci stavu klientsk´ych a serverov´ych komponent. EventSender – Souˇc´ast pro odes´ıl´an´ı ud´alosti na server. K ud´alosti pˇriloˇz´ı zmˇeny k

syn-chronizaci, aby serverov´a aplikace mˇela k dispozici aktu´aln´ı data ke zpracov´an´ı ud´alosti. Napˇr´ıklad vyplnˇen´y text v nˇejak´em editovateln´em textov´em poli. Pˇred odesl´an´ım ud´alosti provede zablokov´an´ı uˇzivatelsk´eho rozhran´ı dokud nebude ud´alost zpracov´ana.

5.2

Server

D˚uleˇzit´a ˇc´ast je zde smyˇcka zpr´av (EventLoop), kter´a umoˇzˇnuje tvoˇrit ud´alostmi ˇr´ızenou aplikaci. Smyˇcka zpr´av ˇcek´a na pˇr´ıchoz´ı ud´alost a aˇz je nˇejak´a ud´alost signalizovan´a, vyzvedne si ji u spr´avce ud´alost´ı (EventManager) a provede jej´ı zpracov´an´ı t´ım, ˇze nejdˇr´ıv provede synchronizaci pomoc´ı synchronizaˇcn´ıch pˇr´ıkaz˚u, kter´e jsou souˇc´asti ud´alosti, a pak ud´alost pˇred´a zadan´emu doruˇcovateli ud´alost´ı. Kter´y doruˇcovatel ud´alost´ı m´a b´yt pouˇzit, je pˇred´ano ve struktuˇre Event. Pˇres doruˇcovatele je ud´alost pˇred´ana c´ılov´emu objektu a jeho posluchaˇc˚um. Bˇehem zpracov´an´ı ud´alost´ı aplikac´ı m˚uˇzou b´yt generov´any pˇr´ıkazy pro zmˇenu uˇzivatelsk´eho rozhran´ı. Pˇr´ıkazy jsou pˇred´av´any spr´avci pˇr´ıkaz˚u (CommandManager), kter´y je pak pˇred´a klientovi, aˇz si o nˇe poˇz´ad´a vzd´alen´ım vol´an´ım getCommands(). Po ukonˇcen´ı obsluhy ud´alosti mus´ı smyˇcka zpr´av poslat potvrzovac´ı pˇr´ıkaz (ConfirmEvent), kter´ym in-formuje klienta, ˇze tato ud´alost byla zpracov´ana.

(30)

RMI – Slouˇz´ı pro pˇr´ıjem vzd´alen´ych vol´an´ı z klienta. ServerAppListener – Implementace rozhran´ı serveru.

CommandManager – Spr´avce pˇr´ıkaz˚u, kter´e maj´ı b´yt odesl´any na klienta.

ComponentManager – Spr´avce komponent a model˚u, kter´e jsou vytvoˇreny. Poskytuje pˇrevod identifikace na konkretn´ı komponentu ˇci model.

EventManager – Spr´avce ud´alost´ı, kter´e poslal klient ke zpracov´an´ı.

EventLoop – Smyˇcka zpr´av, kter´a zajiˇst’uje odeb´ıran´ı pˇr´ıchoz´ıch ud´alost´ı a pˇred´av´a je aplikaci ke zpracov´an´ı. Pˇred t´ım neˇz pˇred´a ud´alost aplikaci ke zpracov´an´ı, tak provede synchronizaci podle pˇriloˇzen´ych pˇr´ıkaz˚u.

EventDispatcher – Doruˇcen´ı ud´alosti registrovan´ym posluchaˇc˚um. Zajiˇst’uje pˇrevod for-m´atu doruˇcen´e ud´alosti na ud´alost, kter´a je pak pˇred´ana posluchaˇc˚um.

Application – Implementace libovoln´e aplikace, kter´a vyuˇz´ıv´a vzd´alenˇe ovl´adan´e uˇ ziva-telsk´e rozhran´ı.

5.3

Stavba server knihovny

Knihovna pro tvorbu vzd´alenˇe ovl´adan´ych aplikac´ı je vytvoˇrena tak, aby odpov´ıdala kni-hovnˇe AWT/Swing, takˇze je moˇzn´e zmˇenit pouze importovan´e bal´ıky z AWT/Swing na bal´ıky se vzd´alenˇe ovl´adan´ymi komponentami. A t´ım bude pˇrevedena desktopov´a aplikace na vzd´alenˇe ovl´adanou aplikaci.

Hierarchie vzd´alenˇe ovl´adan´ych komponent je v pˇr´ıloze na obr´azku A.1.

P˚uvodnˇe bylo myˇsleno, ˇze pro reprezentaci ud´alost´ı budou vyuˇzity typy z knihovny AWT/Swing, ale protoˇze nˇekter´e typy ud´alost´ı se omezuj´ı jen na zdrojov´y typ komponenty java.awt.Component, tak je nutn´e si tyto ud´alosti implementovat a zmˇenit typ zdrojov´e komponenty na obecn´y typ Object. Samozˇrejmˇe pokud jsou zmˇenˇeny typy ud´alost´ı, je nutn´e implementovat pro tyto ud´alosti i rozhran´ı posluchaˇc˚u a adapt´er˚u.

(31)

Kapitola 6

Interaktivn´ı editor aplikace

ovl´

adan´

e pˇ

res WWW

Pro demonstrov´an´ı funkˇcnosti syst´emu vzd´alen´eho ovl´ad´an´ı aplikace pˇres WWW je vytvo-ˇrena aplikace (Interaktivn´ı editor aplikace ovl´adan´e pˇres WWW), kter´a bude demonstrovat funkˇcnost t´eto knihovny. Vytvoˇren´a aplikace je interaktivn´ı a veˇsker´e zmˇeny nad uˇ zivatel-sk´em rozhran´ı se projev´ı v appletu na klientovi a naopak zmˇeny v appletu se tak´e projev´ı v editoru (ve formul´aˇri i v seznamu vlastnost´ı).

Obr´azek 6.1: Interaktivn´ı editor

6.1

Moˇ

znosti editoru

• Lze vytv´aˇret prvky uˇzivatelsk´eho rozhran´ı, kter´e maj´ı b´yt zobrazeny v appletu na klientovi.

• Lze nastavovat jednotliv´e atributy u kaˇzd´eho prvku uˇzivatelsk´eho rozhran´ı. • Lze registrovat ud´alosti, o kter´ych m´a klientsk´y applet informovat editor.

(32)

Obr´azek 6.2: Vytvoˇren´e vzd´alen´e uˇzivatelsk´e rozhran´ı

• Veˇsker´e uˇzivatelsk´e zmˇeny v appletu na klientovi se projev´ı i v editoru.

6.2

ˇ

asti editoru

Panel komponent uˇzivatelsk´eho rozhran´ı – Jednotliv´e komponenty, kter´e lze um´ıstit do v´ysledn´eho formul´aˇre.

Tabulka s vlastnostmi a ud´alostmi – Vlastnosti, kter´e lze nastavit, a ud´alosti, kter´e si lze zaregistrovat. Zmˇena atributu komponety se projev´ı i ve vzd´alen´e komponentˇe. Seznam signalizovan´ych ud´alost´ı – V´ypis zaregistrovan´ych ud´alost´ı, kter´e nastaly. Panel pro um´ıst’ov´an´ı prvk˚u uˇzivatelsk´eho rozhran´ı – Zde je vidˇet uˇzivatelsk´e

roz-hran´ı, kter´e se zobrazuje u klienta.

K dispozici m´ame sadu komponent uˇzivatelsk´eho rozhran´ı, kter´e lze um´ıstit do vytv´aˇ re-n´eho formul´aˇre. U kaˇzd´eho prvku uˇzivatelsk´eho rozhran´ı m´ame moˇznost nastavovat nˇekter´e jeho atributy a tak´e registrovat ud´alosti, o kter´ych chceme b´yt informov´ani.

Seznam dostupn´ych prvk˚u uˇzivatelsk´eho rozhran´ı: JButton – bˇeˇzn´e tlaˇc´ıtko

JRadioButton – pˇrep´ınaˇc, automaticky je um´ıstˇen do ButtonGroup JCheckBox – zaˇskrt´avac´ı tlaˇc´ıtko

(33)

JToggleButton – stavov´e tlaˇc´ıtko (zm´aˇcknut´e, nezm´aˇcknut´e) JTextField – vstupn´ı jednoˇr´adkov´e textov´e pole

JTextArea – vstupn´ı v´ıceˇr´adkov´e textov´e pole

JScrollPane – panel, kter´y umoˇzn´ı zobrazit posuvn´ıky a ˇr´ıdit tak vloˇzenou komponentu JPanel – kontejner na prvky uˇzivatelsk´eho rozhran´ı

JLabel – statick´y textov´y popisek

6.3

Popis obsluhy editoru

Spuˇstˇen´ı editoru

Editor lze spustit bez parametr˚u a pot´e bude poslouchat na vˇsech s´ıt’ov´ych rozhran´ı a bude poslouchat na v´ychoz´ım portu 3232. Editoru lze vnutit adresu a port, na kter´em m´a poslouchat, staˇc´ı do parametru na pˇr´ıkazov´e ˇr´adce napsat tˇreba:

java remoteguibuilder.Main 147.229.66.44 5678

Spuˇstˇen´ı appletu

Applet si je nutn´e pˇres internetov´y prohl´ıˇzeˇc st´ahnout pr´avˇe z takov´e adresy, na kter´e poslouch´a i editor. Je to d´ano bezpeˇcnostn´ım omezen´ım appletu, kter´y pak m˚uˇze nav´azat s´ıt’ov´e spojen´ı jen s poˇc´ıtaˇcem, odkud byl tento applet staˇzen. Adresa, na kterou se m´a applet pˇripojit, je pˇred´ana jako parametr appletu. Tyto parametry jsou naps´any v HTML str´ance, ve kter´e je um´ıstˇen i applet.

Pˇr´ıklad:

<applet code=‘‘remotegui/client/ClientApplet.class’’ width=400 height=300> <!-- nastavit vhodne parametry -->

<param name=‘‘host’’ value=‘‘192.168.0.57’’ /> <param name=‘‘port’’ value=‘‘3232’’ />

</applet>

V´ybˇer prvku pro um´ıstˇen´ı na formul´aˇr

V panelu prvk˚u si vybereme prvek, kter´y chceme um´ıstit na formul´aˇr a pot´e lev´ym kliknut´ım ve formul´aˇri se n´am na zvolen´e pozici objev´ı vybran´y prvek. Pokud chceme um´ıstit nˇekter´e komponenty do jin´e komponenty jako tˇreba do JPanel nebo JScrollPane, tak to m˚uˇzeme prov´est tak, ˇze na komponentˇe, kam chceme prvek um´ıstit, klikneme lev´ym tlaˇc´ıtkem na myˇsi.

(34)

Nastaven´ı vlastnost´ı, ud´alost´ı

V panelu prvk˚u vybereme moˇznost “Select” a prav´ym kliknut´ım na poˇzadovan´y prvek se zobraz´ı v z´aloˇzk´ach tabulka se seznamem vlastnost´ı, kter´e lze zmˇenit, a s ud´alostmi, kter´e si lze zaregistrovat, a pak editor bude o tˇechto ud´alostech informov´an. ´Uprava libovoln´e vlastnosti se okamˇzitˇe projev´ı jak na formul´aˇri tak i na vzd´alen´em uˇzivatelsk´em rozhran´ı. Form´at nˇekter´ych typ˚u vlastnost´ı

Boolean : true/false

Barva : r,g,b,a (jednotliv´e barvy se zad´avaj´ı ˇc´ıslem od 0 do 255) Pozice : x,y,w,h (jednotliv´e ´udaje jsou celoˇc´ıseln´e kladn´e hodnoty)

Interakce nad appletem

Vytvoˇren´e uˇzivatelsk´e rozhran´ı si lze ihned vyzkouˇset v appletu na klientovi. Uˇzivatelsk´e zmˇeny se projev´ı zpˇet i v editoru, ale aˇz pokud nastane nˇejak´a registrovan´a ud´alost.

(35)

Kapitola 7

avˇ

er

Navrˇzen´y a vytvoˇren´y syst´em pro tvorbu vzd´alenˇe ovl´adan´ych aplikac´ı je schopen fungo-vat jako webov´a aplikace s uˇzivatelsk´ym rozhran´ım jako m´a bˇeˇzn´a deskotopov´a aplikace. Protoˇze struktura a form´at knihovny komponent pro tvorbu vzd´alenˇe ovl´adan´ych aplikac´ı odpov´ıd´a standardn´ı javovsk´e knihovnˇe AWT/Swing, lze pouˇz´ıt k´od jiˇz hotov´e aplikace s uˇzivatelsk´ym rozhran´ım, vytvoˇren´ym pomoc´ı AWT/Swing, a zmˇenit pouze importovan´e bal´ıky. A m´ame hotovou vzd´alenˇe ovl´adanou aplikaci. V pˇr´ıloze B je pˇr´ıklad implementace aplikace pomoc´ı AWT/Swing a knihovny pro tvorbu vzd´alenˇe ovl´adan´ych aplikac´ı (Re-moteGUI), kter´y demonstruje jednoduchost pˇrevodu. Syst´em je pouˇziteln´y i tam, kde je komunikace omezov´ana firewall, protoˇze komunikaci zprostˇredkov´av´a RMI, kter´e je schopno komunikaci zabalit do HTTP protokolu.

St´avaj´ıc´ı knihovna komponent zat´ım nab´ız´ı pouze z´akladn´ı komponety, ze kter´ych nelze vytvoˇrit plnohodnotn´e uˇzivatelsk´e rozhran´ı, takˇze bude potˇreba tuto knihovnu rozˇs´ıˇrit o dalˇs´ı komponenty (JDialog, JComboBox, JList, JMenu, ..) a pˇridat podporu pro spr´avce rozvrˇzen´ı. D´alˇs´ı moˇznost´ı rozˇs´ıˇren´ı je vyˇreˇsen´ı moˇznosti v´ıceuˇzivatelsk´eho pˇr´ıstupu k aplikaci (moˇzn´e ˇreˇsen´ı je pro kaˇzd´eho uˇzivatele vytvoˇrit jednu instanci programu nebo v r´amci jed-noho programu spustit dalˇs´ı vl´akno). D´ale je potˇreba testovat aktivitu klienta a serveru, v pˇr´ıpadˇe klienta jestli uˇz aplikaci neukonˇcil (potˇreba pos´ılat zpr´avy, ˇze je klient st´ale ak-tivn´ı), v pˇr´ıpadˇe serveru pokud nen´ı uˇz k dispozici (nezdaˇr´ı se st´ahnout seznam pˇr´ıkaz˚u). V obou pˇr´ıpadech je nutn´e danou aplikaci ukonˇcit. D´ale je potˇreba rozˇs´ıˇrit syst´em a dalˇs´ı typy pˇr´ıkaz˚u (RemoveAssociateComponent – zruˇsen´ı vazby mezi komponentama, Unreg-isterEvent – zruˇsen´ı registrace odeb´ıran´ych ud´alost´ı, DeleteComponent – smaz´an´ı kompo-nenty).

(36)

Literatura

[1] WWW dokument. Java(tm) remote method invocation specification. http://java.sun.com/j2se/1.5/pdf/rmi-spec-1.5.0.pdf.

[2] Brett Spell. Java Programujeme profesion´alnˇe. Computer Press, 2002. ISBN 80-7226-667-5.

[3] WWW str´anky. Html — wikipedia, the free encyclopedia.

http://en.wikipedia.org/w/index.php?title=HTML&oldid=132283938. [4] WWW str´anky. Html 4.01 specification. http://www.w3.org/TR/html401/. [5] WWW str´anky. Jdk(tm) 5.0 documentation.

http://java.sun.com/j2se/1.5.0/docs/. [6] WWW str´anky. A swing architecture overview.

http://java.sun.com/products/jfc/tsc/articles/architecture/. [7] WWW str´anky. Web application — wikipedia, the free encyclopedia.

(37)

Dodatek A

r´ılohy

A.1

Rozdˇ

elen´ı do bal´ık˚

u

Jednotliv´e ˇc´asti cel´eho syst´emu jsou dˇeleny do bal´ık˚u.

remotegui.common – Obsahuje definice typu objekt˚u, kter´e jsou spoleˇcn´e pro obˇe ˇc´asti jak klientskou tak serverovou (pˇr´ıkazy, ud´alosti, rozhran´ı serveru).

remotegui.client – Obsahuje implementaci klientsk´e ˇc´asti j´adra syst´emu pro vzd´alen´e ovl´ad´an´ı komponent.

remotegui.client.components – Obsahuje implementaci upraven´ych komponent a im-plementaci posluchaˇc˚u pro zpracov´an´ı ud´alost´ı.

remotegui.server – Obsahuje implementaci serverov´e ˇc´asti j´adra syst´emu pro vzd´alen´e ovl´ad´an´ı komponent.

remotegui.server.components – Obsahuje implementaci knihovny vzd´alenˇe ovl´adan´ych komponent. Odpov´ıd´a bal´ıku java.awt a javax.swing.

remotegui.server.components.text – Obsahuje komponenty pro tvorbu komponent pra-cuj´ıc´ıch s textem. Odpov´ıd´a bal´ıku javax.swing.text.

remotegui.server.components.event – Obsahuje implementace ud´alost´ı, posluchaˇc˚u a adapt´er˚u. Odpov´ıd´a bal´ıku java.awt.event a javax.swing.event.

remotegui.server.components.dispatch – Obsahuje implementaci doruˇcovatel˚u ud´alost´ı.

A.2

Popis knihovny komponent

Bal´ık remotegui.server.components obsahuje komponenty pro tvorbu vzd´alenˇe ovl´adan´eho uˇzivatelsk´eho rozhran´ı.

RemoteComponent – Z´aklad pro tvorbu vzd´alenˇe ovl´adan´ych komponent. Poskytuje identifikaci a prostˇredky pro generovan´ı pˇr´ıkaz˚u. Nem´a ekvivalent na klientovi. Component – Z´akladn´ı tˇr´ıda pro tvorbu komponent. Odpov´ıd´a java.awt.Component. Container – Z´akladn´ı tˇr´ıda pro tvorbu komponent, kter´e mohou obsahovat dalˇs´ı

(38)

Obr´azek A.1: Hierarchie

JComponent – Z´aklad pro tvorbu komponent, kter´e maj´ı odpov´ıdat komponent´am z kni-hovny Swing. Odpov´ıd´a javax.swing.JComponent.

AbstractButton – Z´aklad pro tvorbu tlaˇc´ıtek. Odpov´ıd´a javax.swing.AbstractButton. JButton – Bˇeˇzn´e tlaˇc´ıtko. Odpov´ıd´a javax.swing.JButton.

JToggleButton – Tlaˇc´ıtko reprezentuj´ıc´ı stav zapnuto/vypnuto. Odpov´ıd´a komponentˇe javax.swing.JToggleButton.

JRadioButton – Tlaˇc´ıtko se stavem zapnuto/vypnuto. Vhodn´e pro tvorbu pˇrep´ınaˇc˚u. Odpov´ıd´a javax.swing.JRadioButton.

JCheckBox – Tlaˇc´ıtko se stavem zapnuto/vypnuto zobrazen´e jako zatrh´avac´ı r´ameˇcek. Odpov´ıd´a javax.swing.JCheckBox.

(39)

JPanel – Komponenta, do kter´e je moˇzn´e vkl´adat jin´e komponenty a dˇelit tak uˇzivatelsk´e rozhran´ı do logick´ych celk˚u. Odpov´ıd´a javax.swing.JPanel.

JScrollPane – Komponenta pro zobrazen´ı vertik´aln´ıch a horizont´aln´ıch posuvn´ık˚u. Lze jimi ovl´adat jinou komponentu, kter´a byla do t´eto komponenty vloˇzena. Pouˇz´ıv´a se tˇreba v kombinaci s JTextArea. Odpov´ıd´a javax.swing.JScrollPane.

JTextComponent – Z´akladn´ı komponenta pro zobrazen´ı editovateln´eho textu. Odpov´ıd´a javax.swing.text.JTextComponent.

JTextArea – Komponenta pro zobrazen´ı v´ıceˇr´adkov´eho editovateln´eho textu. Odpov´ıd´a javax.swing.JTextArea.

JTextField – Komponenta pro zobrazen´ı jednoˇr´adkov´eho editovateln´eho textu. Odpov´ıd´a javax.swing.JTextField.

MainFrame – Komponenta, kter´a reprezentuje hlavn´ı okno aplikace. Snaˇz´ı se tv´aˇrit, ˇze odpov´ıd´a javax.swing.JFrame, ale ve skuteˇcnosti se pˇrev´ad´ı na objekt tˇr´ıdy javax.swing.JApplet, kter´y na klientovi tvoˇr´ı hlavn´ı okno.

ButtonGroup – Komponenta pro tvorbu pˇrep´ınaˇc˚u. Odpov´ıd´a javax.swing.ButtonGroup. Bal´ık remotegui.server.components.event obsahuje tˇr´ıdy pro zpracov´an´ı ud´alost´ı ze vzd´alenˇe ovl´adan´eho uˇzivatelsk´eho rozhran´ı.

ActionEvent – Reprezentace ud´alosti, kter´a vznikla nˇejakou akc´ı (napˇr. stisk tlaˇc´ıtka). Odpov´ıd´a java.awt.event.ActionEvent.

ActionListener – Rozhran´ı, kter´e pˇrij´ım´a ud´alosti ActionEvent ke zpracov´an´ı. Odpov´ıd´a rozhran´ı java.awt.event.ActionListener.

CaretEvent – Reprezentace ud´alosti, kter´a vznikla zmˇenou textov´eho kurzoru. Odpov´ıd´a javax.swing.event.CaretEvent.

CaretListener – Rozhran´ı, kter´e pˇrij´ım´a ud´alosti CaretEvent ke zpracov´an´ı. Odpov´ıd´a rozhran´ı javax.swing.event.CaretListener.

FocusEvent – Reprezentace ud´alosti, kter´a vznikla zmˇenou aktivn´ı komponenty. Odpov´ıd´a tˇr´ıdˇe javax.swing.event.FocusEvent.

FocusListener – Rozhran´ı, kter´e pˇrij´ım´a ud´alosti FocusEvent ke zpracov´an´ı. Odpov´ıd´a rozhran´ı java.awt.event.FocusListener.

FocusAdapter – Implementace rozhran´ı FocusListener. Implementace odpov´ıd´a stan-dardn´ı tˇr´ıdˇe java.awt.event.FocusAdapter.

InputEvent – Reprezentace ud´alosti, kter´a vznikla nˇejakou vstupn´ı akc´ı (stisk myˇsi, stisk kl´avesy). Odpov´ıd´a java.awt.event.InputEvent.

KeyEvent – Obsahuje informace o ud´alosti, kter´a vznikla stiskem kl´avesy. Odpov´ıd´a java.awt.event.KeyEvent.

KeyListener – Rozhran´ı, kter´e pˇrij´ım´a ud´alosti KeyEvent ke zpracov´an´ı. Odpov´ıd´a rozhran´ı java.awt.event.KeyListener.

(40)

KeyAdapter – Implementace rozhran´ı KeyListener. Implementace odpov´ıd´a standardn´ı tˇr´ıdˇe java.awt.event.KeyAdapter.

MouseEvent – Obsahuje informace o ud´alosti, kter´a vznikla stiskem myˇsi. Odpov´ıd´a java.awt.event.MouseEvent.

MouseListener – Rozhran´ı, kter´e pˇrij´ım´a ud´alosti MouseEvent ke zpracov´an´ı. Odpov´ıd´a rozhran´ı java.awt.event.MouseListener.

MouseAdapter – Implementace rozhran´ı MouseListener. Implementace odpov´ıd´a stan-dardn´ı tˇr´ıdˇe java.awt.event.MouseAdapter.

(41)

Dodatek B

Uk´

azka pouˇ

zit´ı knihovny

Uk´azka aplikace s pouˇzit´ım knihovny AWT/Swing. Aplikace m´a zadan´y text pˇrev´est na text psan´y velk´ymi p´ısmeny.

import java.awt.event.*; import javax.swing.*; public class AWTSwingApp {

public static void main(String[] args) { (new AppForm()).setVisible(true); } } import java.awt.event.*; import javax.swing.*;

public class AppForm extends JFrame {

private JTextField text1; private JTextField text2; private JButton btn; public AppForm() {

text1 = new JTextField(); text2 = new JTextField(); btn = new JButton(); text1.setBounds(5, 5, 150, 20); text1.setText(‘‘hello world!’’); text2.setBounds(5, 60, 150, 20); btn.setBounds(30, 30, 100, 25); btn.setText(‘‘Convert’’); btn.addActionListener(new ActionListener()

(42)

{

public void actionPerformed(ActionEvent evt) { text2.setText( text1.getText().toUpperCase() ); } }); this.setLayout(null); this.add(text1); this.add(btn); this.add(text2); } }

Obr´azek B.1: Aplikace vytvoˇren´a pomoc´ı AWT/Swing

Ta sam´a aplikace zapsan´a pomoc´ı knihovny RemoteGUI. import java.net.InetAddress;

import remotegui.server.ServerAppListener; public class RemoteGUIApp

{

public static void main(String[] args) { String thisAddress = ‘‘’’; try { thisAddress = (InetAddress.getLocalHost()).toString(); } catch(Exception e) { } int thisPort = 3232; ServerAppListener.create(thisPort); (new AppForm()).setVisible(true);

(43)

} }

import remotegui.server.components.event.*; import remotegui.server.components.*;

public class AppForm extends MainFrame {

private JTextField text1; private JTextField text2; private JButton btn; public AppForm()

{

text1 = new JTextField(); text2 = new JTextField(); btn = new JButton(); text1.setBounds(5, 5, 150, 20); text1.setText(‘‘hello world!’’); text2.setBounds(5, 60, 150, 20); btn.setBounds(30, 30, 100, 25); btn.setText(‘‘Convert’’); btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) { text2.setText( text1.getText().toUpperCase() ); } }); this.add(text1); this.add(btn); this.add(text2); } }

Rozd´ıly jsou minim´aln´ı, postaˇc´ı jen zmˇenit importovan´e bal´ıky a z deskotopov´e aplikace je aplikace ovl´adan´a pˇres WWW.

(44)

References

Related documents

6 Minta daftar persediaan yang mencakup nama barang, kualitas, dan harga per tanggal neraca serta cocokkan dengan buku besar.. 7 Lakukan penelaah analitis (analytical review)

We chose these behavioural tasks because they were more commonly used and are considered as a golden standard to evaluate specific aspects of executive functions, in particular

Routine cognitive assessment to identify cancer patients with memory problems, dementia awareness training for the cancer team to help them support people with memory problems to

or information about their expertise, which is repeated mainly with Negation feedback. Social: we mean context information related to a user’s role at work, and

事前テストと事後テストはそれぞれリーディング Part5 から Part7 に分かれており、TOEIC テストの出題形式と同じ形式で Part 5 短文穴埋め問題 13 問、Part 6 長文穴埋め問題 3

On the other hand, in order to identify the nature and characteristics of ELF interactions, several corpus studies, such as Vienna-Oxford International Corpus of English

Looking to both feminist linguistic and social-science research, I argue that Pinterest exhibits a unique traffic in visual and verbal codes—an emerging online rhetoric that allows

Three measurements of the longitudinal field over a time interval of 64 days are reported by Mathys &amp; Hubrig (1996): all yielded a field close to − 2. Since we found that it