Applety Applet ( Application program–let ) je javský program upravený ke spuštění v klientově prohlížeči ( browseru ). Prohlížeč je aplikace ( application program ), který stáhne z http-serveru soubor, interpretuje HTML a další soubory, čímž vytvoří HTML stránku. Jsou-li ve stránce značky: <APPLET ....> .... </APPLET> či od HTML5 , <OBJECT> …. </OBJECT>, prohlížeč vytvoří ve stránce appletový panel, stáhne bytekód programu, tj. soubor typu .class, a spustí ho. Prohlížeč musí mít lokálně instalovaný JRE ( Java Runtime Environment ), který obsahuje JVM a příslušné balíčky. Je-li instalovaný JRE starší verze, mohou vzniknout potíže – nejspíše proto, že balíčky neobsahují novější třídy. Ve stránce může být více appletových okének s různými applety, které mohou mezi sebou komunikovat. PJV10
HTML stránka s applety Tomcat A Hi ! B < HTML > Hello Duke ! < APPLET CODE= xxx.class CODEBASE=... ARCHIVE=mysql-connector-java-3.0.7-stable-bin.jar;… NAME=A WIDTH=... HEIGHT=... ALIGN=... > A Hi ! < PARAM NAME=... VALUE=... > < PARAM NAME=... VALUE=... > </ APPLET > blablablablablablabla B < APPLET CODE= yyy.class CODEBASE=... NAME=B WIDTH=... HEIGHT=... ALIGN=... > Tomcat </ APPLET > blablablablablablablablabla </ HTML > PJV10
Applety Bytekód appletu se zpravidla prezentuje vizuálně v okénku - případně i akusticky – a samozřejmě může skrytě dělat rozmanité výpočty. Applet nemůže škodit klientskému počítači, neboť nemůže: přistupovat k lokálním souborům, zjišťovat a měnit vlastnosti systému, vytvářet knihovny a definovat nativní metody, spouštět programy, navazovat komunikaci s třetí stranou. Je-li však applet podepsaný ( signed ), může klient tato omezení zmírnit svojí politikou ( policy ) – svolením ( grant ) k daným operacím. Viz: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html http://www-personal.umich.edu/~lsiden/tutorials/signed-applet/signed-applet.html http://www.codeproject.com/KB/java/Singed_Applet.aspx http://www.gios.cz/wiki/index.php/Jak_vytvorit_self-signed_applet PJV10
Konstrukce appletu Applety jsou potomky třídy java.applet.Applet či javax.swing.JApplet. Prohlížeč vytvoří instanci stáhnuté třídy – leč jen s užítím jejího bezparametrického konstruktoru - jímž tedy nelze instanci parametrizovat. To lze učinit pomocí značek <PARM NAME= … VALUE= … > Metoda main( String[ ] args ) je nepořebná. Třídy Applet a JApplet neobsahují žádné přípravy k animacím ( Thread, Runnable, run( ) apod. ) - ty je případně třeba přidat v potomcích. Ke konstrukci je nutný balíček java.applet s třídou Applet a interfejsy: AudioClip - s metodami play( ), loop( ), stop( ). AppletContext – pro popis prostředí appletu, tj. dokumentu v němž se nalézá a pro přístup k dalším appletům. AppletStub – pro návaznost na browser. PJV10
java.applet Applet Container Panel Object Component JApplet java.lang Object AppletContext ImageObserver java.awt Component MenuContainer AudioClip Accessible java.awt Container AppletStub java.awt Panel Accessible Applet javax.swing JApplet RootPane Container PJV10
Třída java.applet.Applet Konstruktor je bez parametrů. Čtyři prázdné metody volá browser ( nikoli programátor ) a to při: public void init( ) – inicializaci jež supluje činnost konstruktoru public void start( ) – znovuobjevení appletu, start animací public void stop( ) – skrytí appletu, zastavení animací public void destroy( ) – zrušení appletu, uvolnění zdrojů public String getParameter( String key ) – získání hodnoty z PARM public URL getCodeBase( ) – získání lokace bytekódu public URL getDocumentBase( ) – získání lokace HTML stránky public AppletContext getAppletContext ( ) public Image getImage( URL u, String name ) – stažení obrázků, což zařídí browser - tedy není třeba MediaTracker. public void showStatus( String msg ) – zápis do stavové řádky PJV10
Třída java.applet.Applet public AccessibleContext getAccessibleContext ( ) - kontext public String getAppletInfo ( ) – popis appletu pro uživatele public String[ ] [ ] getParameterInfo( ) – pro popis vstupních parametrů public static final AudioClip getAudioClip( URL u ) – stažení zvuku public AudioClip getAudioClip( URL u, String name ) – stažení zvuku public void play( URL u, String name ) – přehrání zvuku public Locale getLocale( ) – získání místních specifik public void resize( … ) – změna velikosti okénka public boolean isActive( ) – aktivita public void setStub( AppletStub stub ) PJV10
Třída javax.swing.JApplet obohacuje applet o možnost vrstvení, zasklení a menu. protected JRootPane createRootPane( ) get/set RootPane, ContentPane, GlassPane, LayeredPane get/set JMenuBar přepisuje metody: public void update( Graphics g ) public void remove( Component comp ) PJV10
Interfejs java.applet.AppletContext umožňuje přístup k prohlížeči public Applet getApplet( String name ) – přístup k appletu na stránce. public Enumeration getApplets( ) – výčet appletů na stránce z téhož hostu. public AudioClip getAudiolip( URL u ) – stažení zvuku public Image getImage( URL u ) – stažení obrázku public void showDocument( URL u, String target ) – ukáže další stránky v definovené okně target. public void showStatus( String status ) – ukázuje stav Pro práci se streamy slouží: public Iterator getStreamKeys( ) public InputStream getStream( String key ) public void setStream( String key, InputStream is ) PJV10
appletviewer Je standardní tester appletů dodávaný v jdk/bin/ Jeho vstupem je HTML-stránka s extenzí .html nebo .htm . Avšak interpretuje jen úsek <applet> ... </applet> Umožňuje testovat chování při volání jeho metod z browseru init - start – paint stop start – paint stop - destroy PJV10
“http://server/... /far/classes” Code a Document somedirectory Lokálně: A.html /classes < APPLET CODEBASE = classes CODE = “proj.X.class” /images /proj X.class GIF package proj; class X { .. } Vzdáleně: somedirectory server/... A.html /classes < APPLET CODEBASE = “http://server/... /far/classes” CODE = “proj.X.class” /proj X.class package proj; class X { .. } PJV10
Syntax tagu APPLET < APPLET { CODE = appletFile | OBJECT = objectFile } [ CODEBASE = codebaseURL | . ] default is dot. WIDTH = pixels HEIGHT = pixels [ ARCHIVE = "file1, file2" ] preloaded [ NAME = appletInstanceName ] [ ALIGN = alignment ] [ VSPACE = pixels ] [ HSPACE = pixels ] [ ALT = alternateText ] > [ < PARAM NAME = name VALUE = value > ]* [ alternateHTML ] </APPLET> PJV10
Applet i aplikace Hlavní rozdíl mezi appletem a aplikací je způsob použití a spouštění – vlastní program se liší jen okrajově. Lze vytvářet programy, které lze spouštět jako aplikace i jako aplety. Ježto Applet i JApplet jsou potomci java.awt.Panelu, lze tak s nimi nakládat v aplikacích. Nutno však volat metodu init( ) a start( ), aby provedly činnosti v nich definované. Způsob předání parametrů se liší – což je třeba vyřešit v úvodu programu. Případné ovládání metod start( ), stop( ) a destroy ( ) musí vyřešit aplikace. PJV10
Program jako aplet i aplikace (1/2) class Program extends Applet { boolean isStandalone = false; String var = null; public String getParameter( String key, String defValue ) { // aux. method return isStandalone ? System.getProperty( key, defValue ) : getParameter( key ) != null ? // inherited method call getParameter( key ) : // inherited method call defValue ; } public void init( ) { var = this.getParameter(“KEY", “XYZ"); // aux. method call public void start( ) { ... } PJV10
Program jako applet i aplikace (2/2) public static void main( String[ ] args ) { Program pgm = new Program( ); pgm.isStandalone = true; Frame frame = new Frame( “Frame with Applet“ ); frame.add( pgm, BorderLayout.CENTER ); pgm.init( ); pgm.start( ); frame.setBounds( ... ); frame.setVisible( true ); } } // end of Program Program bude mít v proměnné var řetěz ABC. Spustí se jako aplikace takto: java Program –DKEY=ABC applet takto: appletviewer program.html přičemž uvnitř bude <PARAM NAME=KEY VALUE=ABC > PJV10
Další možnosti Applet může ke komunikaci s člověkem používat také: Frame, JFrame, Dialog, FileDialog či JFileChooser a jejich potomky. Tisk pomocí System.out.println( … ) se svede do Java console prohlížeče. PJV10
Double buffering class MyApplet extends Applet { Graphics bufferGraphics; Image offscreen; Dimension dim; public void init( ) { dim = this.getSize(); offscreen = createImage( dim.width, dim.height ); bufferGraphics = offscreen.getGraphics( ); } public void update( Graphics g ) { paint( g ); } public void paint( Graphics g ) { bufferGraphics.clearRect( 0, 0, dim.width, dim.width ); bufferGraphics.setColor( … ); bufferGraphics.fillRect( … ); g.drawImage( offscreen, 0, 0, this ); PJV10
Archive Parametr ARCHIVE umožňuje appletu stáhnout další soubory a balíčky v komprimované formě jar nebo zip . To je výhodné, neboť přenos je hromadný a kratší. APPLET = “ file1, file2, ... “ Žel, některé prohlížeče tuto možnost interpretují poněkud jinak. PJV10