Osa 2

Polkumuuttujat

Polkuja käytetään resurssien tunnistamiseen ja yksilöintiin. Usein vastaan tulee tilanne, missä luodut resurssit ovat uniikkeja, emmekä tiedä niiden tietoja ennen sovelluksen käynnistymistä — emme voi siis määritellä eksaktia polkua, joka tunnistaisi vielä tuntemattoman resurssin.

Yksi vaihtoehto tällaisen tilanteen ratkaisemiseksi on kontrolleriluokassa olevan metodin määrittely siten, että metodi käsittelee aina tiettyyn polkuun tulevat pyynnöt, ja pyynnön mukana tulevalla parametrilla tunnistetaan resurssit. Esimerkiksi pyyntö polkuun /henkilot?id=3 näyttäisi tietokannasta sen henkilön tiedot, jonka id-sarakkeen arvo on 3.

Toinen vaihtoehto on ajatella polkua haettavan resurssin tunnistajana. Annotaatiolle @GetMapping määriteltävään polkuun voidaan määritellä polkumuuttuja aaltosulkujen avulla. Esimerkiksi polku "/{arvo}" ottaisi vastaan minkä tahansa juuripolun alle tulevan kyselyn ja tallentaisi arvon myöhempää käyttöä varten. Tällöin jos käyttäjä tekee pyynnön esimerkiksi osoitteeseen http://localhost:8080/kirja, tallentuu arvo "kirja" myöhempää käyttöä varten. Polkumuuttujiin pääsee käsiksi pyyntöä käsittelevälle metodille määriteltävän annotaation @PathVariable avulla.

Jatketaan aiemman henkilöesimerkin kanssa. Nyt yksittäisen henkilön hakeminen onnistuisi esimerkiksi seuraavalla tavalla.

@Controller
public class HenkiloController {

    @Autowired
    private HenkiloRepository henkiloRepository;

    @GetMapping("/")
    public String list(Model model) {
        model.addAttribute("list", henkiloRepository.findAll());
        return "henkilot"; // tässä oletetaan erillinen tiedosto henkilot.html
    }

    @PostMapping("/")
    public String create(@RequestParam String nimi) {
        henkiloRepository.save(new Henkilo(nimi));
        return "redirect:/";
    }

    @GetMapping("/{id}")
    public String getOne(Model model, @PathVariable Long id) {
        model.addAttribute("henkilo", henkiloRepository.getOne(id));
        return "henkilo";
    }
}

Yllä olevassa esimerkissä metodi getOne käsittelee pyyntöjä ennalta määrittelemättömään osoitteeseen /{id}. Tässä {id} tarkoittaa käytännössä sitä, että Spring ottaa polusta osan talteen ja asettaa sen pyynnön käsittelevän metodin id-nimiseen muuttujaan, jolle on määritelty @PathVariable-annotaatio. Kun metodia kutsutaan, se saa parametrinaan polkuun asetetun muuttujan, joka muunnetaan Long-tyyppiseksi. Metodissa haetaan tietokantataulusta Henkilo rivi pääavaimen id perusteella — palautettu arvo lisätään Modeliin, jonka jälkeen tietokannasta haettu tieto näytetään osana henkilo.html-tiedostoa.

Loading
Loading
Loading
Pääsit aliluvun loppuun! Jatka tästä seuraavaan osaan:

Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!