6.2 Raporttien HTML-katselusovellus

Tee uusi itsenäinen ohjelma, raportointisovellus, jota käytetään selaimesta käsin HTML-sivujen avulla. Tätä varten toteutetaan oma HTTP-palvelin.

Ohjelmaa käytetään selaimen läpi siten, että annettaessa selaimelle osoite http://127.0.0.1:2000/ tulee näkyviin HTML-sivu, jossa on linkit ohjelmalla tuotettaviin raportteihin. Osoitteesta http://127.0.0.1:2000/jasenlistaus saa Jäsenlistaus -raportin ja osoitteesta http://127.0.0.1:2000/tyyppitilasto saa Tyyppitilasto -raportin. Muista osoitteista tulee 'Sivua ei löydy' -tyyppinen virheilmoitus.

Molempien ohjelmien (Jäsenrekisterin graafisen hallintaohjelman ja raportointipalvelimen) tulee käyttää samoja Jasen, Jasentyyppi ja Luottamustoimi-luokkia sekä samaa raportin HTML:ksi muotoilu -logiikkaa.

Raportit tulostetaan nyt tiedoston sijasta TCP/IP -soketin läpi selaimelle. Tätä varten täytyy pystyttää serverisoketti kuuntelemaan jotain vapaata porttia (esim. 2000). Selaimelle asetetaan tällöin osoitteeksi: http://koneenIP:2000. Eli ohjelman tulee toimia HTTP-palvelimena.

Tätä varten tarvitaan java.net.ServerSocket ja java.net.Socket -luokkia. ServerSocket.accept() -kutsu palautuu, kun joku on ruvennut kuuntelemaan ao. porttia. Socket.getInputStream() ja .getOutputStream antavat streamit; joita voidaan käsitellä kuten tiedostoja.

HTTP-protokollassa selaimen ja serverin välinen keskustelu tapahtuu yksinkertaistettuna seuraavasti:

Selain lähettää merkkijonon:
---------------------------------
GET /raportit/raportti1.html HTTP/1.1
selaimen tyyppi
muutatietoa
etc.

----------------------------------
eli viesti loppuu kahteen peräkkäiseen rivinvaihtoon. 
(Formeilla rivinvaihtojen jälkeen tulisi formin data.)
/raportit/raportti1.html -tarkoittaa sivun polkua ao. serverillä.

Serveri vastaa:
---------------------------------
HTTP/1.1 200 OK
pvm...
Content-Length: 2863
Connection: close
Content-Type: text/html
Cache-Control: no-cache
Pragma: no-cache
selaimen tyyppi....
muuta tietoa

<html>
 HTML-sivun sisältö
</html>
----------------------------------
Header-osan ja sisältö osan välissä on samalla tavoin kaksi peräkkäistä rivinvaihtoa.

Content-Length -rivillä on siirrettävän sivun koko. Tätä ei tarvita, jos sivu on HTML-sivu (selain osaa päätellä sivun koon).

Tässä tapauksessa muiden parametrien (Connection, Content-Type, Cache-Control, Pragma) kannattaa olla ylläolevissa arvoissa, jotta selain ymmärtää, että siirrettävä data on HTML:ää ja ettei dataa tule säilöä välimuistiin.

Protokollan toimintaa voi tutkia esim. telnet:llä ottamalla yhteyden johonkin HTTP-palvelimeen (porttiin 80). eli esim.:

[aapo@veto-k1 tehtavat]$ telnet 192.168.168.1 80  
Trying 192.168.168.1...
Connected to 192.168.168.1.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 25 May 2001 13:57:38 GMT
Server: Apache/1.3.12 (Unix)  (Red Hat/Linux) PHP/3.0.15 mod_perl/1.21
Last-Modified: Fri, 23 Feb 2001 12:48:44 GMT
ETag: "403a-b2f-3a965c2c"
Accept-Ranges: bytes
Content-Length: 2863
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
 <HEAD>

etc.

Oman palvelimen toimintaa voi tutkia samoin komennolla telnet 127.0.0.1 2000 .