Advanced Kittenry - Tietokantasovellusohjeet

Listaus- ja tietonäkymät

Viikon neljä aluksi otetaan kolmosviikon listaustesti, ja laajennetaan se täysipainoiseksi sivuksi muiden joukossa. Tehtävää on ainakin:

  • Sivupohjan ja näkymän käyttöönotto
  • Listattavat asiat kannattaa aina järjestää ORDER BY-käskyllä
  • Jos listattavia kohteita on paljon, voi olla järkevää toteuttaa joko haku tai sivutustoiminto
  • Sivulla tulee näyttää viesti, jos lista on täysin tyhjä.

Listojen läpikäynti

Aiemmin näkymien oheessa käsitellylle request-olion setAttribute-metodille voidaan servletin koodissa antaa käytännössä mitä tahansa olioita mukaanlukien erilaisia listoja:

Ote kissalistan servletistä

/* Kissa-luokka hakee kaikki kissat 
 * tietokannasta etsiKaikkiKissat-metodilla.
 * Nimen saa kissasta ulos getNimi()-metodilla.
 */
List<Kissa> katit = Kissa.etsiKaikkiKissat();
request.setAttribute("kissat", katit);  

Nämä listat ovat suoraan käytettävissä JSP-tiedostoissa. Attribuutiksi määritellyn kissalistan voi näyttää seuraavanlaisella silmukalla:

<c:forEach var="kissa" items="${kissat}">
  <div class="kissa">{kissa.nimi}</div>
</c:forEach>

Yllä oleva komento ${kissa.nimi} kutsuu käsiteltävän Kissa-olion getNimi-metodia, ja tulostaa sen palauttaman arvon.

Kannattaa huomata, että listojenkin läpikäyntiä varten pitää ottaa käyttöön JSTL-tägikirjasto laittamalla JSP-sivun alkuun:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Käyttäjän syöttämien merkkijonojen näyttäminen

Sivunäkymiä näytettäessä kannattaa varmistaa, etteivät käyttäjän syöttämät HTML-koodinpätkät, lainausmerkit yms. sotke sivujen rakennetta.

Tähän ongelmaan autttaa parhaiten JSTL-kirjaston out-tägi:

<c:out value="${kissa.nimi}"/>

Muut tietosivut

Listauksesta halutaan päästä usein katselemaan tarkemmin jonkin asian tietoja, siten että nämä yksityiskohtaisemmat tiedot ovat omalla sivullaan.

Nämä sivut toteutetaan omana kontrolleri/näkymä-parinaan, jotka ottavat GET-parametrina vastaan tiedon siitä mitä asiaa tarkkaanottaen halutaan sivulla näytettävän. Parametrissa välitetään tietokohteen pääavaimen arvo, eli yleensä jonkinsorttinen id-numero

Alla esimerkki linkistä tietosivulle. Usein linkit tietosivuille sijoitetaan listauksessa siihen, missä listatun asian nimi näkyy:

<a href="Kissa?id=${kissa.id}">${kissa.nimi}</a>

Parametri otetaan vastaan request-olion getParameter-metodilla. Koska haluamme id-numeron, pitää parametrina saatu merkkijono erikseen parsia:

String idParam = request.getParameter("id");
int id;
try {
  id = Integer.parseInt(idParam);
} catch(Exception e) {
  // Id-numero nolla ei käytännössä koskaan löydy kannasta, 
  // joten koodin suoritus päätyy
  // alla olevan if-lauseen else-haaraan
  id = 0;
}

Kun id-numero on parsittu pyydetään malliluokkaa etsimään numeroa vastaava rivi kannasta ja palauttamaan se oliona.

Malliluokkaan täytyy tätä varten rakentaa metodi, joka hakee pääavaimen perusteella olion kannasta, tai palauttaa arvon null, jos tietoa ei löytynyt.

Kissa kissa = Kissa.etsi(id);

if (kissa != null) {
  request.setAttribute("kissa", kissa);
  naytaJSP("kissa.jsp", request, response);
} else {
  request.setAttribute("kissa", null);
  request.setAttribute("virhe", "Kissaa ei löytynyt!");
  naytaJSP("kissa.jsp", request, response);
}

Kun olio on välitetty JSP-näkymälle, voidaan sen tiedot näyttää tai vaihtoehtoisesti näyttää pelkkä tyhjä virhesivu, jos haluttua oliota ei löytynyt.

Seuraavaksi:

Jos listalla näytettäviä kohteita on paljon, lisää listallesi sivutus tai hakutoiminto.

Tämän jälkeen voit toteuttaa lisäystoiminnon.