Java-appletti sellaisenaan on varsin rajoitettu, mutta pienellä ohjelmanpätällä saadaan vuorovaikutteisuutta parannettua.
Apuna voidaan käyttää php:tä tai jotain muuta dynaamista html:lää.
Esimerkkini on tehty php:llä.
Tämä esimerkki sijaitsee: http://koti.mbnet.fi/sojanen/Peleja/phpjavademo/index.html
Esimerkki kirjoittaa appletin kautta serverissä olevaan tekstitiedostoon. Php-palauttaa serverin tiedoston sisällön takaisin appletille. Appletin tekstikentän sisältö voi joko korvata teksti.txt:n tai lisätä teksti.txt:iin. Php:n palauttama teksti näytetään appletissa omassa ikkunassaan.
Puzzle peli hiScorella: http://koti.mbnet.fi/sojanen/Peleja/PUZZLE/index.html
Kaksin pelattava shakki: http://koti.mbnet.fi/sojanen/Peleja/SHAKKI/Netissa/index.html
Shakissa kannattaa kokeilla Demo:n alla olevia linkkejä.
Esimerkki tarvitsee tyhjän tiedoston teksti.txt samaan hakemistoon tekstia.php:n ja phpjava.class:n kanssa ja siihen php:lle luku- ja kirjoitusoikeudet.
index.html
<html><head><title>php ja javan yhdistelmä</title></head><body> Lisää tai korvaa alla olevaan kenttään teksti, joka kirjoitetaan php:lla serverin tiedostoihin. <br> <applet code=phpjava.class id=Puzzle width = 400 height = 400 > </applet> <br><a HREF="teksti.txt">Teksti, joka luetaan appletilla</a> </body> </html>
phpjava.java
import java.applet.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.*;
import java.io.*;
public class phpjava extends Applet implements ActionListener
{
   private boolean m_Post = true;
// lähetetäänkö $_GET:lle vai $_POST:lle
   private String m_Href = "tekstia.php";
// php ohjelma, jota kutsutaan
   private Frame f = new Frame("Apu ikkuna");
// apu php:n tuloksen näyteikkuna
   private TextField tf = null;
// php:n syöte
   private Dialog dg2 = null;
// apu dialogi, joka sijaitsee f:ssä
   private TextArea tarea = null;
// teksti area, jossa näkyy tulos
   private URL Urkki = null;
// URL-osoite php:tä varten
   private InputStream is = null;
// tämän avulla luetaan php:n tulos
   final static int ReadKoko = 1500;
// lukupuskurin koko
   private byte buffer[] = new byte[ReadKoko];
// lukupuskuri
   public phpjava() {
   }
   public void init() {
      Button b = new Button("Lisää teksti");
// appletissa näkyvä lisää teksti button
      b.setActionCommand("OK");
// antaa OK komennon
      b.addActionListener(this);
// keskeytys käsitellään tässä luokassa
      tf = new TextField("");
// alustetaan php:n syöte
      setLayout(new BorderLayout());
// annetaan Layoutti
      add("North",tf);
// php:n syöte ylös
      add("South",b);
// Lisää teksti button alas
      b=new Button("Korvaa");
// Korvaa Buttoni luodaan
      b.setActionCommand("korvaa");
// antaa korvaa komennon
      b.addActionListener(this);
// keskeytys käsitellään tässä luokassa
      add("Center",b);
// korvaa Buttoni laitetaan hölmösti keskelle
   }
   public void actionPerformed (ActionEvent e) {
// Buttonien keskeytykset
      String Comm=e.getActionCommand();
// otetaan komento muistiin
      if (Comm.equals("OK")||Comm.equals("korvaa")) {
// Jos komento on OK tai korvaa niin...
         if (dg2==null) {
// Luodaan dialogi
            dg2 = new Dialog(f,"Tämä tulee php:ltä",true);
// Asetetaan dialogi f:ään
            dg2.setSize(this.getSize());
// Asetetaan Dialogi Appletin kokoiseksi
            tarea = new TextArea();
// luodaan tarea
            Button b = new Button("OK");
// luoda, Ok buttoni
            b.setActionCommand("OK2");
// asetetaan käskyksi ok2
            b.addActionListener(this);
// keskeytys käsitellään tässä luokassa
            dg2.setLayout(new BorderLayout());
// annetaan layoutti
            dg2.add("Center",tarea);
// keskelle tarea
            dg2.add("South",b);
// alas ok buttoni
         }
         try {
             String s="";
// Muuttuja GET-toimintoa ja Bufferia varten
             String posti = "teksti="+URLEncoder.encode(tf.getText());
// lähtevä posti teksti muuttujaan
             if (Comm.equals("korvaa")) posti+="&korvaa=1";
// jos korvaa asetetaan korvaa muuttuja postiin
             if (m_Post==false) {
                s="?"+posti;
// jos lähetetään GET:llä asetetaan s
             }
             Urkki = new URL(getDocumentBase(),m_Href+s);
// luodaan URL
             System.out.println("Connect:"+Urkki.getProtocol()+"://"+
                  Urkki.getHost()+"/"+Urkki.getFile());
// Tulostetaan URL
             int ReadLen;
// Luettujen merkkien lkm.
             URLConnection con;
// tarvitaan yhteyden luonnissa
             HttpURLConnection Http = null;
// tarvitaan http-pyyntöön
             OutputStream outs = null;
// $_POST:n lähetys tämän kahvan avulla
             try {
                con = Urkki.openConnection();
// luodaan yhteys serveriin
                if (m_Post) {
// jos postataan
                   if (Urkki.getProtocol().equalsIgnoreCase("http")) {
// jos http
                     Http = (HttpURLConnection)con;
// asetetaan http
                     con.setDoOutput(true);
// asetetaan postille streami
                     outs = con.getOutputStream();
// Otetaan out:lle streami
                     outs.write(posti.getBytes());
// lähetetään posti
                     outs.close();
// Suljetaan virta
                   }
                }
                is = con.getInputStream();
// luodaan virta php:n lähettämää dataa varten
                ReadLen=is.read(buffer);
// luetaan tavuja bufferiin
                while (ReadLen>=1) {
// luetaan bufferia kunnes sieltä ei enään tule
                   s += (new String(buffer)).substring(0,ReadLen);
// tallennetaan s:lle
                   ReadLen=is.read(buffer);
// luetaan tavuja bufferiin
                }
                is.close();
// suljetaan virta
                if (Http!=null) {
                    System.out.println(
                      "HTTP seuraa uudelleen osoittelua="+Http.getFollowRedirects());
                    Http.disconnect();
                }
             } catch (Exception ex) {
                 System.out.println(ex.toString());
             }
             tarea.setText(s);
         } catch (Exception exc) {
           System.out.println(exc.toString());
         }
         dg2.setVisible(true);
      }
      if (Comm.equals("OK2")) {
         dg2.setVisible(false);
// Jos komento on OK2 suljetaan ikkuna
         f.setVisible(false);
      }
   }
}tekstia.php
<?php $t=""; $k=FALSE; if (isset($_GET["teksti"])) $t=$_GET["teksti"]; if (isset($_GET["korvaa"])) $k=TRUE; if (isset($_POST["teksti"])) $t.=$_POST["teksti"]; //Otetaan java-appletin lähettämä data talteen if (isset($_POST["korvaa"])) $k=TRUE; // Java-appletti määrää korvataanko teksti if (strlen($t)>2000) $t=substr($t,0,2000); if (!is_file("teksti.txt")||($k)) // jos $k=true korvataan teksti $f = fopen("teksti.txt","w+"); // jos ei tiedostoa luodaan se. else if ($t!="") $f = fopen("teksti.txt","r+"); // Luetaan ja kirjoitetaan else $f = fopen("teksti.txt","r"); // Jos appletti ei ole lähettänyt // dataa luetaan vain serveristä teksti if (!$k) $s=fread($f,filesize ("teksti.txt")); if ($t!="") fwrite($f,$t); // kirjoitetaan data serverin tiedostoon fclose($f); // suljetaan tiedosto if (isset($s)) print "$s"; // tulostetaan appletille tiedoston sisältö print "$t"; // palautetaan -"- data ?>
Onpas tuhti koodi :)
Käyhän se näinkin. Muistaakseni php:ssä on myös jokin Java-extension, jonka käyttöä jokin tietäväisempi voisi havainnollistaa. Kommentit voi laittaa myös komentojen perään samalle riville, mutta en oikein muista olisiko se sitten Java Coding Conventionien (tjsp) mukaista.
Alunperin mulla olikin kommentit samalla rivillä. Koska Ohjelmointiputka haukkaa hiukan rivin leveyttä, ajattelin että koodi näyttää hiukan selkeämmältä kommenttien ollessa eri riveillä.
Juu hyvä idea, yleensä kommentti tulee kuitenkin käskyn yläpuolelle. PHP:n Java extensionista minulle sanottiin IRCnetin #php-kanavalla, että "et tahdo sekaantua siihen" :). Nähtävästi, koska se on vielä kokeiluasteella.
Kommentit käskyn yläpuolelle, jotain muuta inffoa käskyihin yms. liittyen rivin perään vain.
eikö tuo luokan nimi pitäisi kirjoittaa isolla?
Aihe on jo aika vanha, joten et voi enää vastata siihen.