Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Spring: Kontrollerin jako useampaan osaan

kayttaja-3842 [21.09.2016 18:23:55]

#

Terve kaikki,

Nyt olisi kysymys Spring osaajille.

Eli voikko Springissä jaotella toiminnallisuuksia ikään kuin moduuleihin. Eli sanotaan, että minulla on @Controlleri, jossa määritetään esim. etusivun käsittely @RequestMapping(value="/"). Etusivulla on taas erilaisia palikoita, toisessa listataan esim. käyttäjiä, toisessa näytetään kalenteri.

Voinko nytten kirjoittaa niin sanottuja sub-controllereita, jossa yhdessä tehdään listan käsittely ja koostaminen ja toisessa tehdään kalenterin käsittely? Sitten etusivu controlleri vain kutsuisi etusivu templatea ja näin ollen fragmentteille määritellyt sub-controllerit suoritettaisiin myös.

Springissähän on nuo @Component annotaatiot, joilla voisi määritellä komponentti luokkia ja kutsua näitä controllereissa. Itse olen vasta Springiin tutustumassa, joten mietin, oisko ko. toiminnolle jotain fiksumpaa tapaa, koska minusta esim. tuon kalenterin tekeminen Componentilla "TUNTUU" väärältä tavalta.

Kiitos.

Triton [21.09.2016 20:08:43]

#

Nyt puhut oikeastaan lähinnä Spring MVC -laajennuksesta, joka on rakennettu varsinaisen Spring frameworkin päälle. Haluatko siis rakentaa web-palvelusi käyttöliittymän portaalimaisesti eli yhdessä näkymässä on pienempiä osanäkymiä jne..? Spring MVC ei tue "sub-controllereita", vaan sinun tulee palauttaa aina kokonainen sivu käyttäjälle @RequestMappigillä mäpätyssä metodissa. Asian voit ratkaista niin, että a) koostaat eri lähteistä haetun datan Model-olioon, välität sen Thymeleaf tai Velocity -templatelle ja templatessa esität datan (nuo template enginet kyllä taitaa tukea myös useasta templatesta koostettavaa näkymän rakentamista) b) tai itse tekisin enemminkin niin, että toteuttasin Springillä REST-pohjaiset web servicet (ks. @RestController) ja itse frontti puolen toteuttaisin HTML5 + AngularJS:llä. Näin yksi REST-service voisi palauttaa kalenterin, toinen käyttäjälistan jne.. ja anglurilla haet ajaxilla datan ja rendaat templatet. Angular taas mahdollistaa varsin suoraan näkymän rakentamisen pienemmistä osanäkymistä.

Springin @Controller ja @Service -annotaatiot on tarkoitettu beanien lisäämiseen ioc-kontaineriin, joka osaa sitten sovelluksen käynnistyksen yhteydessä resolvata niiden väliset riippuvuudet eli jos sinulla on komponentti A, joka riippuvainen komponentti B:stä (eli ottaa sen esim. konstruktorissa vastaan), niin Spring osaa luoda sinulle nuo komponentit valmiiksi tuohon säiliöön (eli ensin loisi B:n ja sitten A:n luonnin yhteydessä antaisi sille viitteen tuohon B:hen) ja voit niitä pyydellä sieltä @Autowired-annotaatiolla eli ns. autowirettää. Nuo beanit voivat esiintyä sovelluksen eri abstraktiotasoilla, mutta yleensä ne muodostavat sovelluksen palvelukerroksen (application services), jotka sitten välittää kontrollerista tulleet pyynnöt domain-olioille, persistoi ja hoitaa transaktion hallinnan jne... Sitten juuri kontrollerissa voidaan tietoa lukea näistä serviceistä tai välittää sitä niille. Kontrollereiden ydin on lähinnä endpointtina "muuhuun maailmaan".

groovyb [22.09.2016 11:51:43]

#

Itse törmäsin vastaavanlaiseen tilanteeseen eräässä projektissa C# MVC puolella. C#:ssa luokan pystyy pilkkomaan partial classeiksi, ja sai siten jaettua toiminnallisuuksia eri tiedostoihin (eikä tullut yhtä mammuttifilua). Mutta yleisesti, MVC ideologia ei sisällä ajatusta Subcontrollerista. Toki kannattaa miettiä josko voit pilkkoa logiikkaa myöskin viewmodeleihin ja helper luokkiin, kaikkien metodien ei suinkaan tarvitse olla controllerin sisällä. Ainoastaan luokat, jotka ovat tavalla tai toisella kytkettyinä näkymiin joko vastaanottaen sieltä dataa, tai palauttaen näkymiä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta