Programutvecklingsteknik 5 februari 2002

Övning 4

  1. Skriv programmet Fetkoll som läser igenom valfri webbsida och skriver ut alla ord och fraser som står med fetstil. I HTML anges det med starttaggen <B> och sluttaggen </B>.


  2. Du ska utveckla ett program för den som vill ha full koll på sina klasskamrater. För varje klasskamrat har man förstås namn och adress. För kamraterna i överklassen noteras dessutom Rolexmodell och yachtsegelyta; för kamraterna i underklassen noteras om dom knarkar,super eller svär.
          Objektmodellera med namn och typer på metoder och parametrar och med angivande av eventuella static, public, private osv. I modellen ska en underklass heta Överklass.


  3. Ditt program är klart men några problem kvarstår.


  4. Ditt klasskamratprogram blev en sådan framgång att du nu tänker sätta upp en webbplats för klasskamrater av alla slag i hela landet. Alla ska kunna lägga in sin egen klass i en stor databas, men för att det ska fungera tänker du bara lägga in XML-filer med av dej specificerade taggar. Föreslå taggar och attribut om man vill ha med uppgifter av följande typ.
          Årskurs F-59 på KTH
    Andersson, Eva, f 40-06-23, barn Bo 1965, Åsa 1968, Pia 1976.
    Bengtsson, Jan, f 39-11-01, d 99-12-30, barn Jon 1961.
    Eriksson, Henrik, f 42-01-19, barn Viggo 1964, Kimmo 1967, Jonna 1972.
    - - -
    Skriv början på XML-filen så långt som exemplet går.


  5. Din kamratwebbsajt blev en sådan dundersuccé att KTH vill ha upp ett kamratträd på på webben, ett JTree där gamlingar ska kunna klicka på KTH-roten och få fram sektionerna, på sin sektion och få fram årskurserna och så vidare. Du måste nu läsa en jättestor XML-fil och bygga upp detta träd från roten. Till din hjälp har du metoder av det slag som finns i xml.SAX eller i HTML.Document, dvs du itererar automatiskt över starttaggarna och kan avläsa värdet på attributen och eventuell text mellan start och sluttagg.

    Skriv helst ingen javakod men beskriv i ord hur du skulle göra, till exempel "...och så skapar jag ett nytt barn till noden och lägger in namnet där och så...".


  6. Grattis! Din kamratwebbsajt är nu bland dom tio populäraste. Trycket är stort på att den ska byggas ut med en tjattfunktion. Kraven är följande. Beskriv i ord hur detta ska kunna fungera. Du kan anta att alla som vill vara med på egen hand skaffar sej PGP-nyckel.

Lösningar

  1. import javax.swing.text.html.*                                          ;
    import javax.swing.text.*                                               ;
    import javax.swing.*                                                    ;
    import java.net.*                                                       ;
    import java.awt.*                                                       ;
    import java.io.*                                                        ;
                   
    public class Fetkoll                                                    {
    
      public static void main(String[] args)                                {
        String webbsida="http://www.nada.kth.se/~henrik"                    ;
        if(args.length>0) webbsida=args[0]                                  ;
        try                                                                 {
          InputStream in=new URL(webbsida).openConnection().getInputStream();
          HTMLDocument doc = new HTMLDocument()                             ;
          InputStreamReader reader= new InputStreamReader(in)               ;
          new HTMLEditorKit().read(reader,doc,0)                            ;
          HTMLDocument.Iterator it= doc.getIterator(HTML.Tag.B)             ;
          while(it.isValid())                                               {
    	int start=it.getStartOffset()                                   ;
    	int slut=it.getEndOffset()                                      ;
    	System.out.println(doc.getText(start,slut-start))               ;
    	it.next()                                                       ;}}
        catch (Exception e)                                                 {
           System.out.println("Kan inte koppla mej till "+webbsida)         ;}}}
    
  2. Om man stoppar in segelytsklassen från nästa uppgift får man följande UML.
                   ___________________
                  |     Klasskamrat   |
                  |___________________|
                     ^            ^
               ______|_____   ____|______        __________
              | Underklass | | Överklass |1    1| Segelyta |
              |____________| |___________|------|__________|     
     
     KLASS          DATAFÄLT            METODER
    Klasskamrat    String namn        String getNamn()
                   String adress      String getAdress()
                                      void setNamn(String namn)
                                      void setAdress(String adress)
    Underklass     boolean knarkare   boolean knarkar()
                   boolean svärare    boolean svär()
                   boolean drinkare   boolean missbrukarSprit()
                                      void setKnarkare(boolean sant)
                                      void setSvärare(boolean sant)
                                      void setDrinkare(boolean sant)
    Överklass      String Rolex       String getRolex()
                   Segelyta segel     Segelyta getSegel();
                                      void setRolex(String Rolex)
                                      void setSegel(Segelyta segel)
    
    Alla datafält är private, alla metoder public, ingenting static.

  3. <?xml version="1.0"?> 
    <klasskamrater skola="KTH" klass="F-59"> 
      <kamrat enamn="Andersson" fnamn="Eva">
        <födelsedatum år="1940" månad="06" dag="23"> </födelsedatum>
        <barn fnamn="Bo" födelseår="1965"> </barn>
        <barn fnamn="Åsa" födelseår="1968"> </barn>
        <barn fnamn="Pia" födelseår="1976"> </barn>
      </kamrat>
      <kamrat enamn="Bengtsson" fnamn="Jan">
        <födelsedatum år="1939" månad="11" dag="01"> </födelsedatum>
        <dödsdatum år="1999" månad="12" dag="30"> </dödsdatum>
        <barn fnamn="Jon" födelseår="1961"> </barn>
      </kamrat>
      <kamrat enamn="Eriksson" fnamn="Henrik">
        <födelsedatum år="1942" månad="01" dag="19"> </födelsedatum>
        <barn fnamn="Viggo" födelseår="1964"> </barn>
        <barn fnamn="Kimmo" födelseår="1967"> </barn>
        <barn fnamn="Jonna" födelseår="1972"> </barn>
      </kamrat>
      - - -
    </klasskamrater> 
    

  4. Man skapar en rotnod med en sats av typen
    root = new DefaultMutableTreeNode("KTH")
    och sedan börjar man parsa xml-filen. Varje gång man stöter på starttaggen klasskamrater läser man av attributet skola och kollar att det har värdet KTH. I så fall skapar man en ny nod med det namn som attributet klass och adderar den som barn till rotnoden. När man stöter på starttaggen kamrat skapar man en ny nod och adderar den som barn till aktuell klassnod och när man hittar starttaggen barn skapar man en ny nod och adderar den som barn till aktuell kamratnod. På så sätt skapas ett träd där man kan klicka sej ner till Viggo.
    Noderna vi talat om tillhör datamodellen men till varje nod hör också ett grafiskt objekt, till exempel en mappsymbol med namn på. När rotnoden skapades skickade vi med detta namn och det gjorde vi också för klassnoden. Men kamratnoder och barnnoder har så mycket information att den inte får plats på mappikonen. Man får skicka med den som ett informationsobjekt, alltså till exempel
    new DefaultMutableTreeNode(new Barndata("Viggo",1964))
    Objektet har en toString() som bestämmer vad som ska stå på mappikonen. På samma sätt gör man med kamratnoderna.
    Den fullständiga informationen kan till exempel komma upp i en JOptionPane om man högerklickar på en kamrat eller ett barn.

  5. ^ Upp till kurssidan.


    Sidansvarig: <henrik@nada.kth.se>
    Senast ändrad 9 januari 2003
    Tekniskt stöd: <webmaster@nada.kth.se>