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.