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.