Kapitel 7 - Java

7.1 Vad är Java?
Java är ett plattformsoberoende, objektorienterat språk som liknar C. Det är utvecklat av Sun Microsystems. Java har influerats av många språk som ADA, C++ och C och är robust, distribuerbart och enkelt att lära sig. När man kompilerar ett Javaprogram så skapas klassfiler som består av bytekod som sedan kan köras på alla plattformar som kan köra Java bytekod. Tack vare detta så är språket plattformsoberoende, vilket innebär att samma kod t.ex. kan köras på under Windows som under Unix.


7.2 Vilka bläddrare stödjer Java?
För tillfället stödjer enbart Suns HotJava JDK 1.1 fullt ut. Internet Explorer och Netscape Navigator stödjer JDK 1.0.2 och delar av JDK 1.1.

Snart kommer dock Suns Java Activator, som är en plugin för webbläsare, som stödjer JDK 1.1 fullt ut, så då kommer även Netscape och Microsofts bläddrare att stödja JDK 1.1 fullt ut.


7.3 Vad finns det för böcker som lär ut Java, och var hittar jag dem?
Det finns ett stort utbud av böcker som lär ut Java. Själv lärde jag mig Java med hjälp av Core Java, skriven av Gary Cornell och Cay S. Horstmann. De flesta böckerna kan man beställa i bokhandeln, eller via någon av bokhandlarna på Internet. Några bra siter på Internet som säljer böcker är:

Bokus.com - svensk site som har de flesta kursböcker för högskolor och universitet samt mycket annat.
Adlibris - svensk site med rätt mycket böcker.
Amazon.com - amerikansk site med 2,5 miljoner böcker. Väldigt bra site. De har både fack- och skönlitteratur.
Books.com - amerikank site med nästan lika mycket böcker som Amazon.

Här är en lista på bra böcker:

Titel/författare Kommentar ISBN
Core Java 1.1 : Fundamentals (eng)
Gary Cornell, Cay S. Horstmann
Grundläggande Java 0137669577
Core Java 1.1 : Advanced Features (eng)
Gary Cornell, Cay S. Horstmann
Avancerad Java 0137669658
Java in a Nutshell : A Desktop Quick Reference, Deluxe (eng)
David Flanagan
Bra uppslagsbok och nybörjarbok 1565923049
Programmering i Java, del 1 (sv)
Set Lonnert
Grundläggande Java 9188782522
Programmering i Java, del 2 (sv)
Set Lonnert
Lite mer avancerad Java 9188782557
Java applets: Tips och tillämpningar (sv)
Jesper Ek, Rasmus Ekman
Tips för applettillverkaren 9163604272

7.4 Vad behöver jag för att programmera Java?
Det som man behöver för att kunna programmera Java är en texteditor, ett DOS fönster (eller motsvarande terminalfönster) och Suns JDK. Det finns även andra verktyg som man kan använda, men de som nämnts här är gratis och fungerar minst lika bra. Om man utvecklar en applet så kan det även vara bra att ha en Java kompatibel webbläsare så att man kan testa appleten genom webbläsarens säkerhetsmodul.

Det går bra att använda Anteckningar (Notepad) i Windows, pico under Unix, Emacs under Windows eller Unix och vilken annan texteditor som helst. Det kan dock vara trevligt att få färgkodning av nyckelord i koden, och då faller en del editorer bort. Själv använder jag GNU Emacs tillsammans med Anders Lindgrens Java font-lock mode och det fungerar väldigt bra.


7.5 Vad är JDK, och var hittar jag den?
JDK står för Java Developer Kit och är Suns utvecklingsverktyg för Java. Det innehåller kompilator, interpretator, appletviewer, debugger och en hel del annat. Den senaste fulla versionen av JDK är 1.1. Just nu finns beta4 av JDK 1.2 ute, och den innehåller en hel del nyheter.

JDK:n finns att hämta på Suns Java hemsida.


7.6 Vad finns det för utvecklingsverktyg för Java?
Det verktyg som är lättast att få tag på är JDK:n och en texteditor. Det finns många IDE, Integrated Developer Environment, för Java på Internet som är fria att använda. Det finns också ett antal kommersiella verktyg som man kan använda. Här nedan finns en lista på några av dem.

Namn Företag Typ
Visual Café  Symantec Kommersiell
JBuilder Borland Kommersiell
Jamba Jamba Kommersiell
Xelfi Xelfi Technologies Gratis reg. version tills vidare
Javelin Step Ahead Software  Testversion finnes, reg. kostar US$ 59 
Kawa Tek-Tools Inc. Testversion finnes, reg. kostar US$ 49 
JDE   Tilläggspaket till GNU Emacs, gratis

7.7 Kan jag använda Java på Algonet?
Ja, det går bra. JDK 1.0 och JDK 1.1 finns installerade i /usr/modules/java/1.0/ resp /usr/modules/java/1.1/. JDK 1.2beta2 finns installerad under /usr/usr.


7.8 Hur kompilerar jag mitt Javaprogram?
För att kompilera en Java källkodsfil skriver man:

javac MinFil.java

om man nu vill kompilera filen MinFil.java. Man måste alltid ange hela namnet, dvs även .java.

Om det är en applikation man skrivit och vill starta den så skriver man:

java MinFil

för att starta den. Notera här att man inte tar med .class. Klassfilen måste innehålla en main() metod för att det skall gå att starta den. Om det däremot är en applet så måste man först skapa en HTML fil som innehåller en applet tag. Den kan se ut så här:

<applet code=MinFil width=200 height=100></applet>

I detta exempel så startas appleten MinFil och får storleken 200x100 pixels. Låt oss säga att vi har sparat denna HTML fil som test.html. För att starta appleten skriver man sedan:

appletviewer test.html


7.9 Kan jag köra en Javaserver på Algonet?
Ja, det går, men i abbonemangsvillkoren för Algonet så står det att man inte får köra servers på Algonets maskiner. Jag har dock kommit på en lösning som verkar fungera, men som jag inte kontrollerat med Algonet, och det är att starta servern och låta den leva i t.ex. fem minuter och sedan stängas ned. Då belastar den inte CGI maskinen nämnvärt.

Här finns lite exempelkod på hur man kan skriva sin Javaserver så att den stängs ned efter fem minuters inaktivitet:

Lösningen är väl kanske inte den snyggaste, men den fungerar :).


7.10 Kan jag göra ett CGI program i Java?
Ja, det går, men man får trixa lite. Här följer ett exempel på hur Hello world kan skrivas ut:

public class Hello {
   public static void main(String args[]) {
      System.out.println("Content-type: text/html\n");
      System.out.println("Hello world");
   }
}

Först får man kompilera detta och får då en klassfil som heter Hello.class. Denna placerar man t.ex. i sin cgi-bin katalog. Därefter måste man skriva ett litet shellskript som startar Java interpretatorn och kör skriptet. Här nedan följer ett sådant skript:

#!/bin/sh
cd /home/userX/LOGIN/public_html/cgi-bin
/usr/modules/java/1.0/bin/java -classpath .:..:/usr/modules/java/1.0/lib/classes.zip Hello

där ni får ersätta userX med den user ni ligger på samt LOGIN med erat login. Notera att anropet till java och ända fram till Hello skall stå på en rad. Här kan ni se resultatet. Här finns Javakällkoden samt shellskriptet.

- Skrivet av Set Lonnert och omarbetat av Mathias Axelsson


7.11 Hur kopplar jag min applet till min Javaserver?
För att koppla upp dig mot din server så använder du dig av en socket. Din server lyssnar på en viss port och det är den som du skall koppla upp dig mot. Om vi t.ex. har en server som lyssnar på port 7777 och ligger på cgi.algonet.se så gör man så här:

try {
   Socket s;
   DataInputStream dis;
   PrintStream ps;

   s = new Socket("cgi.algonet.se", 7777);
   dis = new DataInputStream(s.getInputStream());
   ps = new PrintStream(s.getOutputStream());
}
catch (Exception e) {
   e.printStackTrace();
}

Ursäkta att det inte ser så snyggt ut i HTML :). När man väl kopplat upp sig kan man skicka och ta emot data via DataInputStreamen resp. PrintStreamen. Ifall du får problem så kan det vara bra att läsa om en applets begränsningar när den körs i en webbläsare.


7.12 Säkerhetsaspekter med Java applets och webbläsare
När man kör en applet i en webbläsare så kontrolleras allting först i en säkerhetsmodul. Detta för att förhindra appleten från att förstöra saker på din hårddisk utan din vetskap. Detta ställer dock till en del problem när man skall göra lite mer avancerade applets. Här är en lista på de begränsningar som finns:

En del av dessa begränsningar kan man komma runt genom att använda sig av en egen server, t.ex. skriven i Java, som man kör på Algonet. Mer om detta i avsnittet och Java servers på Algonet. Det går dock fortfarande inte att skriva eller läsa på den lokala hårddisken (detta är en sanning med modifikation, se Jonas Flygares svar angående skillnader mellan applets och applikationer).


7.13 Vad är det för skillnad mellan de olika JDK versionerna?
JDK, eller Java Developers Kit, är en samling verktyg som en programmerare antas behöva för att kunna kompilera och exekvera Javaprogram. Allt eftersom språket har utvecklats har nya JDK kommit. De skiljs åt med versionsnummer och de som kommer att nämnas här är 1.0, 1.1 samt 1.2. Versionsnummer med en tredje siffra, t.ex. 1.1.3, är buggfixar till den tvåsiffriga versionen.

Många av de finesser som dök upp i 1.1 och senare 1.2 utvecklades separat i Java, och bedömdes som så bra att man lade till dem till 'standardpaketet'.

JDK 1.0 var den första 'riktiga' versionen av Java som släpptes.

JDK 1.1 tillförde bl.a. RMI, Remote Method Invocation, som påminner mycket om RPC, Remote Procedure Call, och är ett sätt att anropa en metod som sedan körs på en annan maskin. Detta innebär ett relativt enkelt sätt att skapa client/server lösningar. Vidare ändrades eventhanteringen i 1.1 och utökat stöd för Unicode och nationella egenheter i teckenhantering tillfördes. En del ändringar gjordes i klassbiblioteken, och Javaprogrammerarna var tvungna att lära sig vad "deprecation" betydde, dvs att en gammal metod som ersatts signaleras av kompilatorn, så att utvecklaren får direkt besked om att det är dags att läsa in sig på den nyare versionen av Java.

Fler förändringar gjordes, och kan återfinnas i dokumenterad form på http://www.javasoft.com.

- Skrivet av Jonas Flygare


7.14 Vad är bytekod?
Bytekod är kod som består av bytes, eller mer precist oktetter (minnesutrymmen om åtta bitar). Bakgrunden är följande:

För att kunna köra Java på alla plattformar så måste de olika plattformarna kunna härma en javaprocessor. Det man då gör är att man skapa en specifikation för en sådan processor, men istället för att bygga den i kisel så skapar man ett program som simulerar/emulerar (välj själv!) denna processor. Av flera skäl är det en bra ide att använda en maskinkod som definieras i bytes, eftersom man då har en 'blockstorlek' som är väldefinierad på ett stort antal maskiner (så fort man går över 8 bitar så faller plattformar bort, primärt alla 8-bitars diskmaskinsprocessorer, och Java togs bland annat fram för att kunna styra din brödrost, en typisk 8-bitarsmaskin :)). Denna maskinkod är vad vi kallar bytekod.

Vill du läsa mer om detta, så finns det flera böcker skrivna om JVM, Java Virtual Machine, som behandlar både bytekod och ett (eller flera) assemblerspråk för att direkt kunna assemblera bytekod.

Värt att notera är att eftersom det existerar en 'assemblernivå' så är det fullt möjligt att skriva kompilatorer som kompilerar till Java-assembler, för att därefter assemblera till bytekod för exekvering i den virtuella Javamaskinen (emulatorn). Bl.a. har en Ada->Java bytekod omvandlare tagits fram.

- Skrivet av Jonas Flygare


7.15 Vad är skillnaden mellan en applet och en applikation?
En applet och en applikation skiljer sig främst åt i vilka rättigheter de har i systemet där de kör. En applikation har i princip samma rättigheter som vilket annat program på din maskin, dvs tämligen fullständiga. En applet hålls i kontroll av en säkerhetshanterande modul som noga kontrollerar vad appleten får komma åt i systemet.

Anledningen är att en applet är avsedd att laddas ner via nätet och kan vara skriven i syfte att på olika sätt hindra ditt arbete eller irritera dig. Man tvingar därför en applet att alltid få sina operationer godkända av sin säkerhetshanterare.

Naturligtvis kan det hända att du vill att den skall få göra en del saker i systemet, t.ex. skriva till disk eller läsa filer, så därför har man i de senare versionerna av JDK:n lagt till sätt att på ett säkert sätt skapa elektroniska signaturer på den kod man skrivit. Du som laddar ner koden kan sedan säga till Javas säkerhetshanterare att denna kod har rätt att t.ex. skriva till disk.

Tyvärr hanterar relativt få webbläsare denna finess idag.

En liten varning... Många betraktar Java som säkert därför att man vet att applets är hårt hållna. En applikation som någon annan skrivit kör som sades ovan med fullständiga rättigheter och kan därför vara precis lika farlig som vilket annat program som hämtats hem. En applikation kan t.ex. byta ut den säkerhetshanterare som Java använder mot en som godkänner vad som helst, och när du sedan laddar hem en applet så har du inget skydd alls. Var därför försiktig med att hämta hem applikationer, eller att följa anvisningar om att byta säkerhetshanteraren. Den är vital i säkerhetssystemet!

- Skrivet av Jonas Flygare


7.16 Fungerar servlets på Algonet?
Nej, inte i dagsläget.


7.17 Hur får jag fram parametrar som skickas till mitt CGI skript?
Använd följande shellskript samt Javakällkoden här för att bearbeta parametrar skickade med GET resp. POST.

Eftersom getenv() inte fungerar i Java så får man använda properties och själv ställa in vilka environmentvariabler som man vill skicka till sitt CGI program. Detta gör man med -D flaggan. Om man t.ex. vill skicka in CONTENT_LENGTH så lägger man in följande i shellskriptet som startar Javaprogrammet:

-DCONTENT_LENGTH=$CONTENT_LENGTH

I Javakällkoden ovan finns exempel på hur man plockar fram de olika variablerna.


7.18 Hur kommer jag åt cookies från Java?
Set Lonnert har skrivit en förklaring till ett CGI paket som Marty Hall har knappat ihop.

Följande klasser kan användas för att hantera cookies i Java. Klasserna får fritt distribueras och användas.

Programmerare: Marty Hall. Mer information finns på: http://www.apl.jhu.edu/~hall/java

Detta dokument är skrivet av: Set Lonnert. Mer information finns på: http://www.algonet.se/~set_lo/java/

Medföljande filer

CgiParser.java En "grundanalysator" av CGI. Antar som argument data och vilka avgränsare som används. I t.ex. CGI anrop som är kodat blir QUERY_STRING:s avgränsare mellan varje objekt "&", samt mellan varje namn respektive värde "=".
CookieParser.java  En analysator för cookies. Utvidgar (använder) CgiParser. Har avgränsarna ";" mellan varje objekt samt "=" mellan varje namn respektive värde.
CssChoices.java En klass som innehåller de variationer av CSS (Cascading Style Sheet) som testas. Även den URL som upprepande gånger anropas finns här. Denna måste ändras om du själv vill prova klasserna.
CssTest.java En klass som testar cookies genom att använda det på CSS. Det dokument som genereras innehåller dels ett "huvud" (a header) av alla cookies som genererats av användaren eller genom standardval (default) printHttpHeaders(), men även det val som gjorts av Style Sheets printStyleRules(), samt de val som kan göras printDocument().
CssTest.sh Ett script som startar CGI-programmet, då vissa webbservrar inte kan köra Java direkt.
index.html Denna fil.
LookupTable.java En klass för hantering av index (arrays) för den interna analyseringen av data som kommer med CGI anrop.
QueryString
Parser.java
En klass som utvidgar CgiParser, och låter denna analysera data som kommer genom QUERY_STRING.
StringVector.java En intern klass för att hantera data från CGI.
URLDecoder.java Klass för att omvandla URL anrop (x-www-form-urlencoded) till hanterbar data. Jämför java.net.URLEncoder.

Installation

1. CGI kan ses som ett gränssnitt mellan en klient och en server. Detta paket måste först kompileras och sedan installeras (läggas upp) i den katalog som är avsedd för CGI. Vanligtvis är detta ~/public_html/cgi-bin.
 
2. Vissa parametrar måste också ändras. I CssChoises.java finns följande:

public static String url = "http://cgi.algonet.se/htbin/cgiwrap/LOGIN/CssTest.sh";

Ändra denna URL så att den pekar på ditt konto. URL:en skall peka mot CssTest.sh, dvs det CGI-skript som skall köras.
 

3. CGI-skriptet som startar Javaprogrammet måste ha korrekt sökväg (path). Dels till sh som i detta fall är /bin/sh, men även till Java, som måste finnas installerat. I detta fall finns det på /usr/pd/bin/java. Följande skript antar att CssTest.class finns i samma katalog som skriptet själv. Man kan också först förflytta sig till katalogen där den Javaklass finns som man vill köra med cd i Unix, och sedan ställa in CLASSPATH när man kör java.

#!/bin/sh
/usr/pd/bin/java -DQUERY_STRING="$QUERY_STRING" -DHTTP_COOKIE="$HTTP_COOKIE" CssTest

 

4. Slutligen kan du också skriva en HTML fil som anropar via CGI Javaklasserna:

<html>
<head>
<title>Test av CSS</title>
</head>

<body>
<p><a href="http://cgi.algonet.se/htbin/cgiwrap/LOGIN/
CssTest.sh">Testar CssTest</a></p>
</body>

</html>

där LOGIN skall ersättas med ditt login.

Här hittar ni arkivet med filerna.

- Skrivet av Set Lonnert


7.19 Bra länkar till Javasiter
Här följer lite länkar till kul och bra Javasiter.