import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /** Een voetbalclub. De enige relevante * eigenschap van een club is haar naam. * @author Lieven Smits * @version 1.1 4/1/2002 */ class Team { /** Officiele benaming van het team. */ String naam; /** Lijst van alle bestaande teams. */ static Team[] deLijst; /** Construeer een nieuw team (zonder naam, * dat is niet de bedoeling). */ protected Team() { } /** Construeer een nieuw team. * @param naam * Officiele benaming van het team. */ public Team(String naam) { this.naam = naam; } } /** Een voetbalclub met tussentijdse resultaten. * @author Lieven Smits * @version 1.0 25/7/2000 */ class TeamScore extends Team { /** Behaalde punten. Een winst levert drie punten op, * een gelijkspel 1 punt voor beide teams. */ int punten; /** Aantal gespeelde wedstrijden. */ int wedstrijden; /** Aantal overwinningen. */ int gewonnen; /** Aantal gelijke spelen. */ int gelijk; /** Aantal nederlagen. */ int verloren; /** Aantal gescoorde doelpunten. */ int voor; /** Aantal geincasseerde doelpunten. */ int tegen; } /** Een gespeelde wedstrijd. * @author Lieven Smits * @version 1.0 25/7/2000 */ class Wedstrijd { /** Index van het thuisteam in de rij Team.deLijst[]. */ int thuisPloeg; /** Index van het bezoekende team in de rij Team.deLijst[]. */ int uitPloeg; /** Aantal doelpunten gemaakt door het thuisteam. */ int thuisScore; /** Aantal doelpunten gemaakt door het bezoekende team. */ int uitScore; /** Datum van de wedstrijd. */ GregorianCalendar datum; /** Construeer een nieuwe wedstrijduitslag. * @param thuis * Index van het thuisteam in de rij Team.deLijst[]. * @param uit * Index van het bezoekende team in de rij Team.deLijst[]. * @param thuisScore * Aantal doelpunten gemaakt door het thuisteam. * @param uitScore * Aantal doelpunten gemaakt door het bezoekende team. * @param datum * Datum van de wedstrijd. */ public Wedstrijd(int thuis, int uit, int thuisScore, int uitScore, GregorianCalendar datum) { this.datum = datum; thuisPloeg = thuis; uitPloeg = uit; this.thuisScore = thuisScore; this.uitScore = uitScore; } /** Geef de datum van de wedstrijd. * @return * Datum van de wedstrijd. Het formaat is een tekst * bestaande uit: de dag van de maand, de maand van het * jaar (een getal van 1 tot 12) en het volledige jaartal, * gescheiden door schuine strepen. */ public String geefDatum() { String s = new String(datum.get(Calendar.DAY_OF_MONTH) + "/" + datum.get(Calendar.MONTH) + "/" + datum.get(Calendar.YEAR)); return s; } } /** Een servlet om een webpagina met een voetbalklassement * te tonen, gebaseerd op de inhoud van een database * met wedstrijduitslagen. * @author Lieven Smits * @version 1.0 14/7/2000 */ public class Voetbalklassement extends HttpServlet { /** Construeer de tekst van de HTML-pagina met de uitslagen. * @param request * Informatie over het HTTP-request en de client. * @param response * Het HTTP-response dat de huidige servlet levert. */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Wedstrijd[] w = leesDatabase(); TeamScore[] t = berekenStand(w); response.setContentType("text/html"); PrintWriter out = response.getWriter(); printStandHTML(out, t); out.close(); } /** Lees de complete lijst van wedstrijduitslagen * uit de database. Momenteel is deze methode * slechts een simulatie die gebaseerd is op * hardgecodeerde gegevens. Met behulp van JDBC * kan dat probleemloos omgevormd worden tot * een echte raadpleging van een database. * @return * De lijst van alle bekende wedstrijduitslagen. */ public static Wedstrijd[] leesDatabase() { Team[] t = new Team[6]; t[0] = new Team("Mauve"); t[1] = new Team("Rood"); t[2] = new Team("Blauw"); t[3] = new Team("Paars"); t[4] = new Team("Geel"); t[5] = new Team("Rouge"); Team.deLijst = t; Wedstrijd[] w = new Wedstrijd[8]; w[0] = new Wedstrijd(4, 1, 3, 1, new GregorianCalendar(2000, 9, 16)); w[1] = new Wedstrijd(5, 3, 1, 0, new GregorianCalendar(2000, 9, 16)); w[2] = new Wedstrijd(4, 2, 0, 0, new GregorianCalendar(2000, 9, 23)); w[3] = new Wedstrijd(5, 1, 2, 1, new GregorianCalendar(2000, 9, 23)); w[4] = new Wedstrijd(0, 3, 3, 0, new GregorianCalendar(2000, 9, 23)); w[5] = new Wedstrijd(3, 4, 1, 0, new GregorianCalendar(2000, 9, 30)); w[6] = new Wedstrijd(2, 5, 2, 0, new GregorianCalendar(2000, 9, 30)); w[7] = new Wedstrijd(1, 0, 0, 1, new GregorianCalendar(2000, 9, 30)); return w; } /** Construeer een lijst met berekende resultaten per team. * @param w * De lijst van wedstrijden waarop de berekening * van toepassing is. * @return * De lijst met resultaten, gerangschikt * volgens dalend aantal punten en bij gelijk * aantal punten, volgens stijgend aantal wedstrijden. */ public static TeamScore[] berekenStand(Wedstrijd[] w) { int aantalTeams = Team.deLijst.length; TeamScore[] t = new TeamScore[aantalTeams]; for (int i = 0; i < aantalTeams; i++) { t[i] = new TeamScore(); t[i].naam = Team.deLijst[i].naam; } // Bereken de scores for (int j = 0; j < w.length; j++) { t[w[j].thuisPloeg].wedstrijden++; t[w[j].uitPloeg].wedstrijden++; t[w[j].thuisPloeg].voor += w[j].thuisScore; t[w[j].uitPloeg].tegen += w[j].thuisScore; t[w[j].thuisPloeg].tegen += w[j].uitScore; t[w[j].uitPloeg].voor += w[j].uitScore; if (w[j].thuisScore > w[j].uitScore) { t[w[j].thuisPloeg].gewonnen++; t[w[j].uitPloeg].verloren++; t[w[j].thuisPloeg].punten += 3; } else if (w[j].thuisScore < w[j].uitScore) { t[w[j].thuisPloeg].verloren++; t[w[j].uitPloeg].gewonnen++; t[w[j].uitPloeg].punten += 3; } else { t[w[j].thuisPloeg].gelijk++; t[w[j].uitPloeg].gelijk++; t[w[j].thuisPloeg].punten++; t[w[j].uitPloeg].punten++; } } // rangschik for (int i = 0; i < t.length; i++) for (int j = 1; j < t.length; j++) if ((t[j-1].punten < t[j].punten) || (t[j-1].punten == t[j].punten) && (t[j-1].gewonnen < t[j].gewonnen)) { TeamScore temp = t[j-1]; t[j-1] = t[j]; t[j] = temp; } return t; } /** Druk de stand af in de vorm van HTML-tabelrijen. * @param p * Het outputmedium. In de huidige toepassing is dat * de outputstroom van een HTTP-response, maar het zou * evengoed het scherm van de computer kunnen zijn. * @param t * De samengevatte scores van de teams. */ public static void printStandHTML(PrintWriter p, TeamScore[] t) { p.println(""); p.println(""); p.println("
"); p.println("Club | "); p.println("Punten | "); p.println("Wedstrijden | "); p.println("Gewonnen | "); p.println("Doelsaldo | "); p.println("
---|---|---|---|---|
" + t[i].naam + " | "); p.println("" + t[i].punten + " | "); p.println("" + t[i].wedstrijden + " | "); p.println("" + t[i].gewonnen + " | "); p.println("" + (t[i].voor - t[i].tegen) + " |