Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP:n ja Java-appletin kommunikointi

peran [06.05.2004 19:55:19]

#

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
?>

makeuu [07.05.2004 08:45:37]

#

Onpas tuhti koodi :)

tsuriga [07.05.2004 11:03:59]

#

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.

peran [07.05.2004 14:24:47]

#

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ä.

tsuriga [21.06.2004 22:05:32]

#

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.

Graphic [20.06.2005 15:31:01]

#

Kommentit käskyn yläpuolelle, jotain muuta inffoa käskyihin yms. liittyen rivin perään vain.

Tomppu [18.08.2005 21:42:34]

#

eikö tuo luokan nimi pitäisi kirjoittaa isolla?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta