bild
Skolan för
elektroteknik
och datavetenskap

Laboration 6 - En enkel webbl�sare

M�l

  • Att bli f�rtrogen med ytterligare n�gra avancerade swing-komponenter:
    JEditorPane, JScrollPane, JTable och HTML.
  • Att kunna l�sa dokumentation om de avancerade komponenterna och h�mta den information man beh�ver, t.ex. alla l�nkar fr�n en webbsida.

Uppgift

Skriv en enkel webl�sare som bara klarar html-kod men f�rutom att den visar en webbsida s� ska den tabellera alla l�nkar som webbsidan har. S� h�r kan det se ut.

Labb 6

Tre h�ftiga swingkomponenterna kommer att anv�ndas, n�mligen JEditorPane, JScrollPane och JTable. En viktig roll har swingklassen HTML som hanterar och tolkar webbdokument.

Du kommer troligen att beh�va importera de h�r klasserna.

   import java.io.*;
   import java.awt.*;
   import java.awt.event.*;
   import java.net.*;
   import javax.swing.*;
   import javax.swing.event.*;
   import javax.swing.text.html.*;
   import javax.swing.text.*;

Det grafiska gr�nssnittet

N�r man ska skriva ett stort program �r det ofta l�mpligt att b�rja med en prototyp, dvs ett program som ser ut som den f�rdiga produkten med saknar funktionalitet. I det h�r fallet ska prototypen visa en JFrame med tre komponenter: I norr finns ett textf�lt, i centrum en JEditorPane och i �ster en JTable, alla tomma. Tabellen ska ha femtio rader och tv� kolumner, s� den f�r knappast plats i f�nstret. L�gg d�rf�r in den i ett rullf�nster som visar lagom m�nga rader i taget.
JTable table = new JTable(50,2);
JScrollPane links = new JScrollPane(table);
Det �r �nnu viktigare att l�gga in webbl�saren (centrumkomponenten) i ett rullf�nster eftersom hela webbsidan vanligen inte kommer att f� plats.

K�r programmet och kolla att det g�r att skriva text i alla tre komponenterna. N�r det g�ller webbsidan och l�nktabellen �r det en oavsiktlig finess (bug eller feature?) som vi inte vill ha. I textf�ltet ska anv�ndaren kunna skriva in �nskad webbadress och vid tryck p� retur/ENTER ska �nskad webbsida visas i v�r JEditorPane. D�rf�r beh�vs en lyssnare kopplad till textf�ltet.

Webbl�saren

Skriv en klass Webreader som �rver fr�n JEditorPane. Se till att det inte g�r att skriva i detta f�nster (metoden setEditable). Ge klassen en metod t.ex. showPage(webaddr). L�s dokumentationen om JEditorPane f�r att se hur man f�r den att visa en webbsida. Om den valda webbsidan inte g�r att visa, ge ett felmeddelande i form av en dialogruta. Anv�nd JOptionPane! Tag reda p� sj�lv hur man g�r (API:n eller �vningsanteckningar).

Anv�nd nu Webreader i huvudklassen ist�llet f�r JEditorPane.

Se till att text inskriven i f�ltet h�gst upp tolkas som en URL och att motsvarande webbsida visas i f�nstret n�r man trycker ENTER!

Innan ni g�r vidare, kolla att programmet fungerar s� h�r l�ngt genom att titta p� n�gra olika webbsidor. Sidan som syns p� bilden ovan g�r hyfsat bra att titta p�. H�r �r URL:er till n�gra andra CSC-medarbetares webbsidor. Dessa webbsidor ser OK ut i v�r enkla webbl�sare:

http://www.nada.kth.se/~orjan
http://www.nada.kth.se/~ala
http://www.nada.kth.se/~viggo
http://www.nada.kth.se/~vahid
http://www.nada.kth.se/~johanh
http://www.nada.kth.se/~ann

L�nktabellen – ing�r i grunduppgiften

I den h�r deluppgiften ska texterna som syns i tabellen till h�ger i bildexemplet ovan tas fram.

L�t webbl�saren vila ett tag och skriv ett nytt program som skriver ut alla l�nkar fr�n en webbsida. Programmet kan till att b�rja med best� av bara en main-metod som skriver ut r�tt information i terminalf�nstret. N�r det fungerar, �ndra s� att informationen ist�llet ges i en matris. Mer instruktioner nedan!

Hitta i webbsidan

Man skriver ut en webbsida tecken f�r tecken s� h�r.
   String webpage="http://www.nada.kth.se/~henrik";
   InputStream in=new URL(webpage).openConnection().getInputStream();   
   InputStreamReader reader= new InputStreamReader(in);
   while(reader.ready()) 
      System.out.print((char)reader.read());
try-catch m�ste l�ggas till eftersom uppkopplingen (andra raden ovan) kan misslyckas. I st�llet f�r att l�sa instr�mmen och skriva ut den i terminalf�nstret, skapa ett tomt HTMLDocument (doc) och l�t ett HTMLEditorKit l�sa in webbsidan till dokumentet med
   doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
   new HTMLEditorKit().read(reader,doc,0);
(Utan den f�rsta satsen f�r man ChangedCharSetException p� alla svenska sidor som ordentligt anger teckenupps�ttningen iso-8859-1.) En HTML-sida inneh�ller taggar av olika slag och den tagg som anv�nds vid l�nkar heter A och har ett attribut HREF vars v�rde �r l�nkens webbadress. Den nionde raden i tabellen i bildexemplet ovan kan motsvaras av f�ljande i html-dokumentet:

<A HREF = "http://www.nada.kth.se/~gerd">hustru</A>

Iterera nu genom dokumentet fr�n A-tagg till A-tagg, l�s av attributet HREF och skriv ut dess v�rde. F�r detta �ndam�l skapas ett Tag.A-iteratorobjekt och ett HREF-attributobjekt. Skriv ut HREF-attributet inne i slingan. L�s dokumentationen f�r klassen HTML och dess inre klasser!

N�r det h�r fungerar, skriv ut den text som st�r mellan A-taggen och dess sluttagg med hj�lp av it.getStartOffset() och it.getEndOffset(). L�s i dokumentationen f�r HTMLDocument hur man kan f� ut en deltext ur dokumentet! Vi g�r igenom ett liknande exempel (med tagg men inte attribut) p� �vning 6.

L�gg adress och text i en matris

N�r utskrifterna fungerar s� �ndra testprogrammet s� att det ist�llet f�r en main-metod med utskrift har en metod som returnerar en String-matris med adresser och texter motsvarande tabellen. Matrisen ska ha tv� kolumner och begr�nsat antal rader, t.ex. 50 st. Om det finns fler �n 50 l�nkar struntar man allts� i de sista. Metoden som skapar matrisen b�r ta webbsidans adress (en String) som parameter. Testa separat i en main-metod innan den nya metoden anv�nds i huvudprogrammet.

Anv�nd matrisen i huvudprogrammet

I huvudprogrammet finns en JTable med 50 x 2 positioner, men fr�n b�rjan inget inneh�ll. Enklaste s�ttet att �ndra p� inneh�llet i en JTable �r att byta ut dess modell. Modellen kan skapas fr�n tv� String-arrayer, d�r den ena �r tabellinneh�llet och den andra �r tabellens rubriker. H�r �r ett exempel:
table.setModel(new DefaultTableModel(..., header));
Prickarna ska ers�ttas med skapandet av l�nkmatrisen. Sl� upp dokumentationen av JTable och l�s d�r om ni beh�ver veta mer!

Redovisning

  • Visa att man kan g� till "sn�lla" webbsidor genom att skriva in adressen i textf�ltet och trycka ENTER.
  • En felaktig URL ska ge en ruta med felmeddelande. Ingen uppdatering av sida eller l�nkar ska d� g�ras. Felmeddelanden i bakgrunden accepteras inte, inte heller att programmet avslutas.
  • Om en webbsida har fler �n 50 l�nkar ska bara de 50 f�rsta visas. N�got Exception som ArrayIndexOutOfBounds eller liknande f�r inte genereras.
  • Visa UML-klassdiagram med klassnamn och de metoder ni skrivit sj�lva (inklusive omdefinierade metoder).

 

Extrauppgift f�r betygsh�jning - klickbara l�nkar

Webbl�sarprogrammet vi har gjort reagerar inte p� att man klickar p� l�nkarna i webbsidan. Extrauppgiften �r att g�ra l�nkarna klickbara och se till att den nya webbsidan visas i f�nstret.

Tv� saker m�ste g�ras i webbl�saren: g�r setEditable(false) (kanske redan gjort), s� att inte klickningen tolkas som att du vill b�rja �ndra i texten. L�gg ocks� till till en HyperlinkListener. Anropet getURL().toString() till en HyperlinkEvent ger en fullst�ndig webbadress som kan skrivas in i adressf�ltet. L�s dokumentationen om Hyperlink... och ta reda p� vad som beh�vs!

Krav

  • Webbl�saren ska reagarera p� klickningar av l�nkarna, inte bara p� att mark�ren (musen) h�lls �ver l�nken.

  • Den klickade l�nken ska visas i adressf�ltet hos webbl�saren och den valda sidan ska visas som aktuell webbsida. N�gra till�gg i Webreader kan fixa detta. N�r den nya sidan ska visas kan man ha nytta av att fr�n programmet framkalla en h�ndelse (ActionEvent) genom att anropa textf�ltets postActionEvent().


Copyright © Sidansvarig: Ann Bengtsson <ann@nada.kth.se>
Uppdaterad 2013-05-14