Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

10. Appletit

Java -sovellukset jaetaan kahteen eri ryhmään. Ensimmäisen ryhmän muodostavat yksinään toimivat sovellukset, jotka on tehty tietylle käyttöjärjestelmäalustalle. Windows NT:lle käännetty java sovellus ei voi toimia sellaisenaan unix -järjestelmäalustalla ja niin edelleen. Sovellusta ajetaan Java -tulkin päällä komentotasolla, kuten kurssin alkuosassa jatkuvasti tehtiin.  Yksinään toimiva sovellus saa koneelta käyttöönsä resursseja riippuen siitä, millä käyttäjätilillä ohjelmaa ajava prosessi luodaan. Tällä tarkoitetaan sitä, että onko ko. käyttäjätilillä oikeutta käyttää niitä resursseja, joihin ohjelmassa viitataan. Toisen luokan muodostavat javaa tukevan WWW -selaimen päällä toimivat sovellukset. Tälläisiä ovat esimerkiksi Java -appletit. Niiden huonona puolena on kuitenkin, ettei Appletilla ole mahdollisuuksia käyttää kaikkia resursseja. Apletti ei voi

lukea ja kirjoittaa asikastietokoneen tiedostoja
kommunikoida muiden www -sivustojen, kuin sen kanssa, joka sisälti appletin
käynnistää sovellusohjelmia asiakkaan koneessa
käyttää hyväkseen asiakaskoneen järjestelmän ohjelmia tai kirjastoja

Rajoitukset on tehty internet -turvallisuuden takia. Olisihan aika ikävää, jos kuka tahansa pystyisi javalla tekemään ohjelman, joka esimerkiksi ensitöikseen www -sivun avauduttua poistaisi järjestelmästä kaikki kilpailevien tuotteiden tiedostot.

Applettien rajoitukset voidaan kiertää JDK1.2:n mukana olevassa sertifikaatti- järjestelmällä, jolloin sertifikaatilla varustettu apletti saa kaikki yksinään toimivan java -sovelluksen oikeudet. Tällä kurssilla ei käsitellä sertifikointijärjestelmää, mutta se on selitetty yksityiskohtaisesti "Teach Yourself Java 1.2  in 21 days" (Borland Press), 1998.

10.1 Applettien käyttöönotto

Appletit luodaan seuraavalla tavalla, kuten esimerkissä E44 todettiin. Tämä tapahtui siis seuraavasti

  1. tee uusi luokka, joka periytyy luokasta java.applet.Applet
  2. ylikirjoita haluamasi metodit (yleensä ainakin paint())
  3. käännä luokasta tavukoodi -tiedosto .class
  4. tee HTML -sivu, jossa APPLET -tagilla lataat appletin (class -tiedoston)
  5. aja www -selaimella tai appletviewer -ohjelmalla tekemäsi HTML -sivu

Teemme nyt esimerkiksi oman appletin ja ajamme sitä tällä www-sivulla.

  1. Luodaan uusi luokka ja ylikirjoitetaan paint() -metodi

import java.awt.*;
public class E52 extends java.applet.Applet {
// Tähän oma applettikoodi, jossa on nyt vain ylikirjoitettu paint() -metodi
  Font f = new Font("TimesRoman",Font.BOLD,36);
  public void paint(Graphics ikkuna){
    ikkuna.setFont(f);
    ikkuna.setColor(Color.blue);
    ikkuna.drawString("Elämäni toinen appletti ", 5, 40);
  }
}

  1. Käännetään luokka E52

  2. Tehdään HTML -sivu E52.htm, jossa on seuraavanlainen html koodi

<html>
<head>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>Esimerkki E52</title>
</head>
<body>
<p>
<
applet width="600" height="100" code="E52.class">
Java -appletti</applet>
</p>
<p>Tässä java appletti, jonka  html-koodi näyttää tältä</p>
</body>
</html>

( meta-tagista ei tarvitse välittää. Käyttämäni HTML -editori lisäilee sen omia aikojaan ja sen voi hyvin poistaa HTML -sivulta)

  1. Ajetaan appletti  www -selaimessa

    Java -appletti

Appletti on laitettu otsikon jälkeen. Voit tutkia tämän sivun lähdekoodia niin huomaat, että edellisen otsikon jälkeen on applet -tagi).

Applet -tagissa esiintyvät parametrit align, hspace, vspace code ja codebase on selitetty tavallisimmimpien  wysiwyg -editorien helpeissä. Useimmat niistä ovat tuttuja kuvankäsittelystä. (esim. tässä on selitetty align -parametrin attribuutit). Mainittakoon kuitenkin, errä code -parametri viittaa siihen tiedostonimeen, jossa .class tavukooditiedosto on ja codebase parametriin laitetaan se kansio, missä .class -tavukooditiedosto sijaitsee. Jos se on samassa kansiossa, missä html -sivu sijaitsee, codebase -parametriä ei tarvitse laittaa.. Jos siis laitat appletin .class tavukooditiedoston samaan kansioon, missä html -sivu sijaitsee, et tarvitse codebase -parametria laisinkaan.

Toinen tapa lisätä appletti html -sivulle on käyttää Applet -tagin sijasta Object -tagia. Seuraavassa on malliesimerkki object -tagiin käytöstä. Tässä yhteydessä ei puututa sen parametreihin.

<OBJECT CLASSID="java:E52.class" WIDTH=600 HEIGHT=100>
Appletti ei näy selaimessasi, koska se ei tue javaa!!!
</OBJECT>

10.1.1 Appletti -luokan perusmetodit

Appletti -luokka sisältää joukon perumetodeja, joita voidaan (usein pakko) ylikirjoittaa halutulla tavalla. Appletin toiminnan kannalta paint() -metodi on keskeinen, mutta myös muita tärkeitä ylikirjoitettavia metodeja on olemassa.

Appletissa ei ole lainkaan main() metodia. Sen sijaan appletti sisältää erilaisia metodeja, joita kutsutaan aina tilanteen niin vaatiessa. Appletti alustetaan init() -metodilla, aloitetaan start() -metodilla, pysäytetään stop() -metodilla ja poistetaan destroy() -metodilla. Appletin piirtoalueen päivitys tehdään paint() -metodilla. Seuraavaksi on lyhyesti käyty läpi kaikki tärkeimmät appletti -luokan perusmetodit. Sitä mukaa kun asia etenee, niitä käsitellään lisää.

10.1.1.1 init()

init() -metodia kutsutaan, kun appletti ladataan html -sivulle. Siinä kannattaa luoda kaikki appletin tarvitsemat oliot, alustaa ne, ladata kuvat ja fontit ja asettaa tärkeimpien vakioiden arvot. Tämä tapahtuu ylikirjoittamalla init() -metod seuraavasti

public void init(){
// tähän kirjoitetaan metodin koodi
}

10.1.1.2 start()

Alustamisen jälkeen appletti aloitetaan. Appletti voidaan aloittaa useaan kertaan mutta vain kerran alustaa. Tälläinen tilanne syntyy, jos selaimen käyttäjä hyppää appletin sisältävän sivun jälkeen takaisin appletti -sivulle. Joka kerta kun hän palaa takaisin tälle sivulle start() -metodi suoritetaan. start() -metodi ylikirjoitetaan seuraavasti

public void start(){
// tähän kirjoitetaan metodin koodi
}

10.1.1.3 stop()

Appletii voidaan koska tahansa pysäyttää stop() -metodilla. Metodi suoritetaan myös aina, kun selaimessa hypätään jollekin toiselle sivulle. Se käyttäytyy siis hyvin samalla tavalla kuin start() -metodi. Lopetusmetodi ylikirjoitetaan seuraavasti

public void stop(){
// tähän kirjoitetaan metodin koodi
}

10.1.1.4 destroy()

Appletti voidaan kokonaa hävittää, jolloin sen tarvitsemat resurssit vapautetaan muuhun käyttöön. destroy() -metodia ei kuitenkaan voi suoranaisesti käyttää appletin poistamiseen. Sitä käytetään käytännössä appletin sisältämien säikeiden poistamiseen.  Säikeisiin palaamme aivan kurssin lopussa. Poistometodi ylikirjoitetaan seuraavasti

public void destroy(){
// tähän kirjoitetaan metodin koodi
}

10.1.1.5 paint()

Appletin piirtopinnalla tarkoitetaan sitä aluetta selaimen ikkunasta, joka on ilmoitettu APPLET -tagin width ja height -parametreissa. Tämä piirtopinta pitää aina piirtää uudelleen, mikäli appletissa muutetaan sen sisältöä. Piirtopintaa ei päivitetä automaattisesti vaan se tehdään repaint() -metodilla, joka kutsuu paint() -metodia. paint() -metodia kutsutaan kuitenkin myös muulloin.

ensimmäisen kerran sitä kutsutaan applettia ladattaessa.
samoin sitä kutsutaan joka kerta kun sivulle palataan joltain muulta www -sivulta.
lisäksi sitä kutsutaan käyttöjärjestelmän puolesta silloin, kun selaimen ikkuna naksautetaan näkyviin jonkin muun ikkunan takaa tai vieritetään selaimessa.
sitä kutsutaan myös käyttöjärjestelmästä silloin, kun ikkunaa skaalataan venyttämällä uudelleen (tämä edellyttää tietysti, että skaalaus on sallittu) tai vieritetään palkista. (ts aina, kun appletin piirtopintaa siirretään.

Piirtometodi ylikirjoitetaan seuraavasti

public void paint(Graphics g){
// tähän kirjoitetaan metodin koodi
}

Kaikki tässä mainitut metodit sisältävät siis samanlaisen piirteen. Niitä voidaan kutsua

suoraan appletista ohjelman kirjoittajan haluamalla tavalla
selain kutsuu niitä tietyssä vaiheessa
käyttöjärjestelmä kutsuu niitä tietyssä vaiheessa

Tämä tulee aina ottaa huomioon metodeja ylikirjoitettaessa.

10.1.2 JAR -tiedostot

Ladattaessa html -sivu selaimeen palvelimelta, latautuu ensin itse html -sivu. Sen jälkeen latautuvat java -ohjelmat, sen vaatimat luokat,  kuvat yms. tiedostot. Jokaisen palan haku aloitetaan yhteyden muodostamisella palvelimeen ja lopetetaan yhteyden katkaisemiseen. Yhteyksien muodostaminen ja lopettaminen ovat varsin aikaa vievää puuhaa. Poistaakseen tämän ongelman, voidaan html -sivun kaikki javapalaset koota yhteen jar -asiakirjatiedostoksi (java archive). JDK:n komennolla jar voidaan appletin käyttämät tiedostot tallettaa yhdeksi asiakirjatiedostoksi. Tiedosto voi olla pakattu ZIP -standardilla tai olla pakkaamaton. Seuraavalla komennolla muodostettaisiin ohjelman animaatio.java arkistotiedosto

jar cf animaatio.jar animaatio.class *.gif

Optiolla cf tarkoitetaan seuraavaa. Optio c merkitsee, että uusi Java -arkistotiedosto luodaan, ja f merkitsee, että seuraavassa argumentissä on mainittu tulostiedoston nimi.

Vastaavasti html -sivulle kirjoitetaan applet -tagiin

<applet code="animaatio.class" archive="animaatio.jar" width=45 height=40>
</applet>

Selain hakee .jar tiedoston, purkaa sen ja suorittaa appletin, joka on mainittu code -parametrissa. Kaikissa uusimmissa www -selaimissa on tuki javan arkistotiedostoille.

Mikäli halutaan pienentää siiirrettävän tiedon määrää, voidaan .jar tiedosto pakata zip tai cab -tiedostoksi. Tällöin applet -tagi näyttäisi seuraavalta. (esimerkki pätee zip -pakkasstandardille)

<applet code="animaatio.class" archive="animaatio.zip" width=45 height=40>
</applet>

WWW- selain osaa purkaa pakkausen automaattisesti.

10.1.3 Tehtäviä

  1. Tee appletti, jossa kirjoitetaan kolmelle riville tekstin seuraavasti

Ei nakkikioskia - ei kahvilaa,
vain ravintola ja tylsää asemaa,
voi mikä toivottomuus - Pieksämäen asemalla blues

Vastaus

  1. Tee www -sivulle neljä applettia yhden näytön alueelle, jossa edellinen laulu jatkuu siten, että jokaisessa appletti-ikkunassa on uusi säkeistö (jos et tiedä sanoja, nii keksi itse uusi). Vastaus
  2. Kopioi kaikki tämän www -sivun materiaali itsellesi (appletit saat kopiotua laittamalla www -osoitteeksi tämän sivun kansio + appletin nimi) ja tee siitä .jar -tiedosto. Kokeile, aukeaako www -sivu oikein. Jos sinulla on oma www-sivu tai sinulla on mahdollista käyttää koulun www -palvelinta, laita sivu sinne ja katso, käynnistyykö sivu oikein. Vastaus

10.2 Parametrien välitys appletille

Appletille voidaan välittää html -sivuilta parametreja applet -tagin sisään kirjoitettavalla param -tagilla seuraavasti.

<applet width="600" height="100" code="E53.class">
<
PARAM NAME = font VALUE = "TimesRoman">
<
PARAM NAME = size VALUE = "24">
Java -appletti
<
/applet>

Appletissa vastaavat käytetään Applett -luokan getParameter() -metodia. Seuraavksi korjaamme ohjelmaa E52 siten, että parametrit f ja size luetaan html -sivulta eo. param -tageilla. Appletissa varaudutaan siihen, että param -tagit ovat unohtuneet ja näinollen f ja/tai size saavat arvon null. Tämä tehdään yleensä init() -metodissa

import java.awt.*;
public class E53 extends java.applet.Applet {
  Font f;
   // pakko olla tässä. Ei voi laittaa init() -metodiin, koska silloin paint() -metodissa ei sitä ole esitelty
  public void init() {
    String tmp = getParameter("size");
    if (tmp == null) tmp="24";
    int koko = Integer.parseInt(tmp);  // getParam() palauttaa aina String -tyypin.
                                                       // Keskeytykseen olisi syytä varautua
    String merkisto = getParameter("font");   //
    if (merkisto == null) merkisto = "TimesRoman";
    f = new Font(merkisto,Font.BOLD,koko);
  }
  public void paint(Graphics ikkuna){
    ikkuna.setFont(f);
    ikkuna.setColor(Color.red);'
    ikkuna.drawString("Jo kolmas appletti ", 5, 40);
  }
}

Tuloksena on seuraavanlainen appletti. Java appletti E53.class ei näy selaimessasi, koska selaimesi ei tue javaa!!!!

Edellinen appletti saatiin tagilla

<applet width="400" height="100" code="E53.class" hspace="20" vspace="20" align="middle">
<
param name="font" value="TimesRoman">
<
param name="size" value="40">Java appletti E53.class ei näy selaimessasi, koska selaimesi ei tue javaa!!!!
</applet>

Kokeillaa saamaa nyt tagilla

<applet width="400" height="100" code="E53.class" hspace="20" vspace="20" align="middle">
<
param name="font" value="Courier">
<
param name="size" value="12">Java appletti E53.class ei näy selaimessasi, koska selaimesi ei tue javaa!!!!
</applet>

Jolloin  tuloksena on

Java appletti E53.class ei näy selaimessasi, koska selaimesi ei tue javaa!!!!

10.2.1 Tehtäviä

  1. Tee appletti, joka kirjoittaa yhden rivin palindromin appletti-ikkunaan. Palindromi välitetään parametrina www -sivulta. Mikäli parametria ei anneta, kirjoitetaan palindromi "Go hang a salami, I'm a lasagna hog". Vastaus

  2. Tee appletti, joka saa parametrina www -sivulta ympyrän säteen ja kirjoittaa appletti-ikkunaan (esim säde on 3). Vastaus

Ympyrän (r=3) pinta-ala on A=28.274

(Ohje: Käytä Float.parseFloat() -metodia.)

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava