Ville Sälliluoma ASP.NET MVC Tietojenkäsittelyn koulutusohjelma 2011
SISÄLLYSLUETTELO 1 JOHDANTO... 3 2 ASP.NET PERUSTEET... 4 2.1.NET Framework... 4 2.2 Historiikki... 4 3 MVC-MALLI... 6 3.1 Yleistä MVC-mallista..6 3.2 Rakenne..... 7 4 ASP.NET MVC-TEKNIIKKA... 8 4.1 Komponentit... 9 4.2 Suunnittelumallit... 9 4.3 ASP.NET MVC -kerrokset... 10 4.4 ASP.NET MVC:n etuja... 12 4.5 ASP.NET MVC:n heikkouksia... 12 5 RAMONES-NIMIGENERAATTORI... 13 6 LOPUKSI..15 LÄHTEET... 16 LIITE 1: Ramones-nimigeneraattorin lähdekoodi
3 1 JOHDANTO Web-järjestelmät kehittyvät erittäin nopeaa tahtia. Tänä päivänä web-sivustoja käytetään useammilla selaimilla ja eri laitteilla kuin koskaan. Esimerkiksi sosiaalisen median valtava suosio luo omat vaatimuksensa eri verkkoteknologioille. Järjestelmien pitää pystyä entistä rikkaampaan vuorovaikutukseen hyvin suosituilla sivustoilla kuten esimerkiksi Facebook, jolla on miljoonia käyttäjiä päivittäin. Web-ohjelmointitekniikoiden pitää pystyä vastaamaan näihin vaatimuksiin. Uusia tekniikoita lanseerataan nopeasti, ja mukana on kokonaan uusia ohjelmistoteknisiä näkökulmia. Aina ei kuitenkaan kannata keksiä pyörää uudelleen. Vanhakin suunnittelumalli voi olla yhä elinvoimainen, vaikka web-ympäristöt monipuolistuvat. Microsoftin suosittu ASP.NET-alusta sai vuonna 2009 uuden jäsenen ASP.NET MVC:n. MVC-arkkitehtuurin alkuperäisen mallin kehitti norjalainen Tryggve Reenskaug vuonna 1979, vuosia ennen kuin suunnittelumalleista oltiin edes kuultu. Mielenkiintoista on, että yhden miehen abstrakti malli 30 vuoden takaa on toteutettu useilla eri webohjelmointitekniikoilla. Lisäksi se nauttii valtavaa suosiota web-ohjelmoinnin parissa. Tässä työssä tutkitaan ASP.NET MVC -tekniikkaa ja sen mielenkiintoista alkuperää. Lisäksi tutkimuksen tavoitteena on tehdä käytännön sovellus tällä tekniikalla. Aluksi lähdetään liikkeelle ASP.NET:n perusteista ja historiasta. Kolmannessa luvussa esitetään alkuperäinen MVC-malli. Nämä taustatiedot ovat välttämättömiä, että voimme ymmärtää ASP.NET MVC- tekniikan idean. Neljännessä luvussa paneudutaan täysin ASP.NET MVC -tekniikkaan, muun muassa sen komponentteihin, vaikuttaneisiin suunnittelumalleihin sekä tekniikan etuihin ja heikkouksiin. Tässä työssä ASP.NET MVC -tekniikan vertailukohtana on toinen ASP.NET -alustan tekniikka: Web Forms. Viidennessä luvussa toteutetaan sovellus ASP.NET MVC -tekniikalla ja viimeisessä luvussa esitetään koontia asiasta.
4 2 ASP.NET PERUSTEET ASP.NET on Microsoftin kehittämä web-tuotantoalusta, jolla voidaan toteuttaa dynaamisia web-palveluja. Ohjelmointi tapahtuu nykyaikaisilla olio-ohjelmointikielillä (C# ja Visual Basic.NET). ASP.NET on osa.net Frameworkia. Päätavoite on tuottaa web-suunnittelupalveluja nopeasti ja tehokkaasti. Alkuperäinen lähtökohta oli, että web-kehittäjien ei tarvitse juurikaan tuntea perinteisiä webtekniikoita kuten HTML ja JavaScript. Toteuttaminen on yksinkertaista valmiiden drag- -and-drop -kontrollien avulla. (Conery, Gunthrie, Haack & Hanselman 2009, 167; Esposito 2010, 16.) ASP.NET on merkittävästi kehittynyt historiansa aikana. Nykyinen ASP.NET sisältää useita laajennettuja alueita, jotka eivät olleet mukana alussa. Esimerkiksi siinä on pohja Ajax-kehitykselle ja valmiit kontrollit ovat mukautettu tukemaan paremmin CSS- ja XHTML-tekniikoiden vaatimuksia. (Esposito 2010, 16.) 2.1.NET Framework.NET Framework on Microsoftin kehittämä ohjelmistotuotantoalusta. Sillä voidaan tuottaa eri tyyppisiä sovelluksia, kuten esimerkiksi konsolisovelluksia, web-sovelluksia ja työpöytäsovelluksia..net Framework käsittää hyvin laajan luokkakokoelman, jota voidaan hyödyntää ohjelmoinnissa. ASP.NET Framework on web-sovellusten tuottamiseen tarkoitettu.net Frameworkin osa. Se sisältää useita tarkoitukseen sopivia luokkia. Nykyinen ASP.NET Framework muodostuu kahdesta web-sovellusten luontiin tarkoitetusta tekniikasta: ASP.NET Web Formista ja ASP.NET MVC:stä. (Walther 2010, 14-15.) 2.2 Historiikki Monille web ei oikeastaan ollut merkittävä ennen kuin ensimmäiset graafiset selaimet tulivat markkinoille 1990-luvun alussa. Pian sen jälkeen ilmestyivät ensimmäiset
5 dynaamiset web-sivut, jotka käyttivät esimerkiksi Perl-ohjelmointikieltä ja Common Gateway Interface (CGI)-tekniikkaa. CGI:n ongelmana oli, että web-palvelimen piti käynnistää jokaiselle web-pyynnölle oma erillinen instanssi sovelluksesta. Tämä kuormitti varsinkin suosittuja sivustoja. Kun web laajeni ja HTML-standardit mahdollistivat rikkaamman vuorovaikutuksen, lanseerattiin uusia tekniikoita. Microsoftin vastaus tähän oli Active Server Pages (ASP) vuonna 1996. (MacDonald 2007, 6; Conery ym. 2009, 167.) ASP.NET Web Forms julkaistiin vuonna 2002. Julkaisu oli suuri edistysaskel, koska ASP.NET oli sillanrakentaja Windows-ohjelmoinnin ja web-järjestelmien ohjelmoinnin välillä. Käyttöliittymä muodostui valmiista kontrolleista, jotka keskustelevat palvelinpuolen kanssa. Kontrollit renderöityvät automaattisesti HTML:ksi ja käyttävät palvelinpuolen tapahtumia vuorovaikutuksessa palvelinpuolen tapahtumienkäsittelijän kanssa. Web-ohjelmoijien ei tarvinnut enää työstää itsenäisiä HTTP-pyyntöjä (request) ja vastauksia (response) kuten aiemmissa teknologioissa. Tämä tarkoittaa tilallista webohjelmointia. (Sanderson 2009, 3-4.) ASP.NET MVC 1.0 julkaistiin vuonna 2009. Sen ei ole tarkoitus olla Web Formsin seuraaja, vaan vaihtoehto sille. ASP.NET MVC -tekniikassa on palattu tilattomaan webohjelmointiin. Käyttöliittymä tapahtuu HTML-, CSS- ja JavaScript-tekniikoiden kanssa. (Esposito 2010, 32-33; Walther 2010, 15.) Taulukossa 1. on esitetty ASP.NET versiohistoriaa. Taulukko 1. ASP.NET-tekniikat ja julkaisuvuosi (Walther 2010, 15). Julkaisuvuosi Tekniikka 2002 ASP.NET 1.0 2003 ASP.NET 1.1 2005 ASP.NET 2.0 2007 ASP.NET Ajax 2008 ASP.NET 3.5 2009 ASP.NET MVC 1.0 2010 ASP.NET 4.0 ja ASP.NET MVC 2.0
6 3 MVC-MALLI 3.1 Yleistä MVC-mallista MVC (Model-View-Controller) on ohjelmistoarkkitehtuuriratkaisu, joka perustuu norjalaisen Trygve Reenskaugin vuonna 1979 kehittämään malliin (Bellinaso, Berardi & Katawazi 2009, 7). MVC-arkkitehtuurin perusajatus on erottaa käyttöliittymä sovelluslogiikasta ja -datasta. Tällä pyritään helpottamaan käyttöliittymän muokkausta ja järjestelmän siirtoa toiselle graafiselle alustalle. Lähtökohtana on, että käyttöliittymä ilmaisee sovelluksen tilaa ja näyttää sen tarvittaessa erilaisissa näkymissä. (Koskimies & Mikkonen 2005, 142.) Reenskaug (haettu 5.4.2011.) kuvailee MVC-mallia seuraavasti: Ensisijainen tarkoitus MVC:llä on toimia siltana käyttäjän mentaalisen mallin ja digitaalisen mallin välillä. Ideaali MVC-ratkaisu tukee käyttäjän illuusiota nähdä ja manipuloida kohdealueen tietoa suoraan. Rakenne on hyvin käytännöllinen, jos käyttäjän tarvitsee nähdä sama mallialkio samanaikaisesti eri viitekehyksessä ja/tai eri näkökulmasta (Kuva 1). Kuva 1. Käyttäjän mentaalinen malli vs. tietokoneen malli. (Reenskaug 1979a). Nykypäivänäkin MVC nauttii valtavaa suosiota web-sovellusten arkkitehtuurina, koska nykyaikaiset web-sovellukset edellyttävät useiden tekniikoiden (esimerkiksi HTML, tietokannat ja suoritettava koodi) yhdistelemistä. Monet näistä tekniikoista sopivat
7 luonnostaan MVC:n konsepteihin. MVC-arkkitehtuuria voidaan toteuttaa monilla nykypäivän ohjelmointikielillä, kuten esimerkiksi Java, PHP, JavaScript, Perl, Python, Ruby ja.net. Marraskuussa 2002 W3C (Internet-tekniikoiden stardardointiyhteisö) valitsi MVC-arkkitehtuurin osaksi XForms-spesifikaatiota, joka integroidaan XHTML 2.0 - standardiin. (Bellinaso ym. 2009, 7; Sanderson 2009, 7.) Ohjelmistotuotannossa arkkitehtuuri-termi voidaan nähdä ylempänä toteutusfilosofiana tai rakenneosien konkreettisina vuorovaikutussuhteina. Arkkitehtuuri määrittelee yhdenmukaisia toteutusperiaatteita, joiden on tarkoitus pysyä muuttumattomina koko ohjelmiston elinkaaren ajan. (Haikala & Märijärvi 2006, 316-317.) MVC-arkkitehtuuri edustaa enemmän toteutusfilosofiaa, koska alkuperäisessä mallissa ei ollut konkreettista toteutusesimerkkiä, ja MVC-mallia käytetään ohjelmistotuotannossa usealla eri tavalla teknisessä mielessä, mutta perusajatus kuitenkin on yhteinen. 3.2 Rakenne MVC muodostuu kolmesta osasta: Model (malli), View (näkymä) ja Controller (ohjain). MVC-arkkitehtuuria voidaan kuvailla eri näkökulmista filosofisen luonteensa takia. Tässä kuvaillaan rakennetta Reenskaugin esimerkeillä sekä omillani niin, että kuka tahansa perustiedot omaava web-sovellusten kehittäjä voi hahmottaa, mistä on kysymys. Model (malli) edustaa tietoa. Malli voi olla yksittäinen objekti tai niiden rakennelma. Malli edustaa tuotannossa olevan sovelluksenkehittäjän näkemää maailmaa. (Reenskaug 1979b.) Esimerkiksi HTML-merkintäkieli tuotantoympäristössään on malli. View (näkymä) on mallin visuaalinen esitys. Se korostaa sekä hillitsee mallin ominaisuuksia toimien näin esitys suodattimena. Näkymä on kiinnitetty malliin, saa siltä tarvittavat tiedot esityksestä ja näkymä voi muuttaa mallia. (Reenskaug 1979b.) Esimerkiksi CSS määrittelee HTML:n muodostaman ulkoasun. Ne ovat suhteessa toisiinsa, mutta riippumattomasti. Controller (ohjain) on linkki käyttäjän ja järjestelmän välillä. Ohjain ottaa käyttäjältä vastaan syötteitä, jotka vaikuttavat malliin. Ohjain käsittelee syötetyn datan ja luo uuden
8 näkymän. (Reenskaug 1979b.) Esimerkiksi Internet-selain yhdistää CSS:n ja HTML:n esitykseksi, joka tulostuu selaimen ikkunaan. Selain ottaa käyttäjän syötteet vastaan HTML:n tarjoamina elementteinä, kuten input ja select. MVC-sovelluksen käyttö noudattaa sykliä, jossa käyttäjä tekee toiminnon, sovellus vastaa toimintoon muuttamalla mallia (model) ja tuo uuden näkymän (view) käyttäjälle. Käyttäjä on vuorovaikutuksessa sovelluksen kanssa, esimerkiksi useiden edestakaisten http-pyyntöjen (request) ja vastausten (response) kautta. (Sanderson 2009, 7.) 4 ASP.NET MVC-TEKNIIKKA Web Forms -tekniikan luonne oli lähellä Windows Forms tuotantoa, toisin sanoen helpompaa drag-and-drop -suunnittelijoille. Tällä oli hyviä puolia uusille suunnittelijoille. Suurena haittana oli kuitenkin se, että ei ollut tarpeeksi mahdollisuuksia vaikuttaa esitettävään HTML-tuotokseen. Tämän takia kokeneempia suunnittelijoita siirtyi muiden web-sovellusalustojen pariin, kuten esimerkiksi PHP ja Ruby on Rails. Nämä alustat tarjosivat halutun vastineen sekä MVC-ohjelmointimallin. Tämä johti siihen, että Microsoft julkisti syksyllä 2007, että suunnitteilla on ASP.NET - ytimeen perustuva ohjelmointialusta, joka kilpailee muiden suosittujen MVC-alustojen kanssa. Näin syntyi ASP.NET MVC. (Bellinaso ym. 2009, 11.) MVC-suunnittelumalli avustaa tekemään sovelluksia, jotka ovat eroteltu eri osakokonaisuuksiksi. MVC-suunnittelumalli määrittää, miten eri ohjelmointilogiikat sijoittuvat sovelluksessa. Käyttöliittymälogiikka kuuluu näkymään, syötelogiikka kuuluu ohjaimeen ja toimintalogiikka kuuluu malliin. Tämä jaottelu auttaa hallitsemaan monimutkaisia sovelluksia, koska on mahdollista keskittyä yhteen osa-alueeseen kerralla. Käyttöliittymän erottaminen sovelluslogiikasta ei ollut täysin mahdollista Web Forms-tekniikassa, koska palvelinpuolen kontrollit saattoivat tuoda sovelluslogiikkaa käyttöliittymään. (Bellinaso ym. 2009, 64; Microsoft 2011.)
9 4.1 Komponentit ASP.NET MVC-arkkitehtuurissa sovellus on eroteltu MVC-mallin mukaisesti kolmeen komponenttiin: malli (model), näkymä (view) ja ohjain (controller). Malli sisältää kaiken toiminta-, validointi- ja tiedonsaantilogiikan, joita sovellus tarvitsee. Malli-oliot käyttävät tietokantaa. Esimerkiksi Tuote-olio saattaa hakea tietoa tietokannasta, käsitellä sitä ja kirjoittaa päivitetyn tiedon Tuotteet-tauluun SQLpalvelimelle. Pienissä sovelluksissa malli on usein käsitteellinen. Jos sovellus vain lukee dataa ja lähettää sen näkymälle, sovelluksella ei ole fyysistä malli-kerrosta ja assosioituja luokkia. Tässä tapauksessa data ottaa Malli-olion roolin. (Microsoft 2011; Walther 2010, 120.) Näkymät ovat komponentteja, jotka näyttävät sovelluksen käyttöliittymän. Tyypillisesti käyttöliittymä luodaan mallin datan pohjalta, kuten esimerkiksi Tuote-taulun muokkausnäyttö, joka esittää kontrolleja, kuten drop-down list, checkbox ja textbox. (Microsoft 2011.) Ohjain on komponentti, joka käsittelee käyttäjän syötteet, työskentelee mallin kanssa ja valitsee käyttöliittymän esittävän näkymän esitettäväksi. MVC-sovelluksessa näkymä ainoastaan esittää informaation. Ohjain käsittelee ja vastaa käyttäjän syötteisiin ja toimenpiteisiin. Esimerkiksi ohjain käsittelee merkkijonoja ja välittää ne mallikomponenttiin, joka tekee tietokantakyselyjä kyseisillä arvoilla. (Microsoft 2011.) 4.2 Suunnittelumallit ASP.NET MVC:n toimintakoneisto on ottanut vaikutteita Front Controller ja Model2 suunnittelumalleista. Model2 on Sun Microsystemsin kehittämä todella suosittu MVCvariaatio web-sovellusten tekemiseen JSP-ympäristössä (Java Server Pages). (Esposito 2010, 91.) Front Controller käyttää keskitettyä komponenttia, joka käsittelee kaikki tulevat palvelinpyynnöt. ASP.NET MVC:ssä tämä komponentti on MVC HTTP handler. Tämä
10 yhteinen luokka sisältää logiikan, joka jäsentää URL:n ja päättää, mikä ohjain (controller) käsittelee pyyntöä (request) ja mikä näkymä (view) tuottaa HTML:n. Ohjain on tavallinen luokka, joka sisältää julkisia metodeja (public method). (Esposito 2010, 27.) Alla oleva sekvenssikaavio havainnollistaa Front Controller ja Model2 toimintaa (Kuvio 1). Kuvio 1. MVC HTTP handler selvittää käytettävän ohjaimen ja herättää sen metodin. Ohjaimen metodi hankkii tietoa, ja selvittää käytettävän näkymän. Lopuksi näkymä generoi tuotoksen, mikä tulee selaimelle. (Esposito 2010, 28.) 4.3 ASP.NET MVC -kerrokset ASP.NET MVC on kerrosarkkitehtuuri, joka voidaan jakaa viiteen tasoon (Kuva 2): 1. tiedonsaantitaso (Data Access Layer) - Tämä koodi käsittelee tietokantatasolla olevaa raakadataa ja edustaa mallia. 2. toimintalogiikkataso (Business Logic Layer)
11 - Tämä koodi lisää toimintasäännöt ja domain-kohtaiset objektit. Edustaa mallia. 3. sovelluslogiikkataso (Application Logic Layer) - Koodi huolehtii käyttöliittymätason ja toimintalogiikkatason vuorovaikutuksesta. Edustaa ohjainta. 4. käyttöliittymätaso (Presentation Layer) - Koodi määrittelee, mitä käyttäjä näkee näytöltä. Edustaa näkymää. 5. tietokantataso (Data Layer) - Yleensä relaatiotietokanta, voi myös olla esimerkiksi XML- tai tekstitiedosto. (Bellinaso ym. 2009, 64-65.) Kuva 2. ASP.NET MVC:n tasot ja, mitä MVC-komponenttia ne edustavat (Bellinaso ym. 2009, 64.) Kerrosarkkitehtuuri tarkoittaa ohjelmiston rakennetta, joka koostuu loogisesti yhtenäisistä eri käsitetasoilla olevista kerroksista siten, että ylempi kerros käyttää alemman kerroksen palveluja. Käsitetasot voidaan nähdä skaalassa laite/ihminen: laitepäässä olevat tasot ovat matalammassa tasossa kuin ihmistä lähellä olevat tasot. Alemmat kerrokset tarjoavat laitetta tai käyttöjärjestelmää lähellä olevia toimintoja,
12 ylemmät kerrokset taas esimerkiksi graafisen käyttöliittymän palveluita. (Koskimies & Mikkonen 2005, 126; Koskimies 2000, 212.) 4.4 ASP.NET MVC:n etuja ASP.NET MVC-arkkitehtuurilla on hyvät lähtökohdat tehdä helposti yksikkötestausta, koska jokainen osa voidaan testata muista riippumattomasti (Sanderson 2009, 8). ASP.NET MVC myös mahdollistaa HTML:n täydellisen hallinnan ja vapaan skriptien sekä CSS:n käytön (Esposito 2010, 32). ASP.NET MVC ei käytä ViewState- ja PostBack-toimintoja. Nämä olivat osittain iso ongelma Web Forms tekniikassa. ViewState- ja PostBack-toiminnot olivat oleellisia tilallisen ohjelmoinnin mahdollistamiseksi. ViewState on kontrollin tilan tallennustapa, johon säilötään esimerkiksi data ja valinnat. Kun pyyntö (request) tulee palvelimelle, se ei muista edellistä pyyntöä. Jotta tilallisuus voi toteutua, tarvitsee pystyä ilmaisemaan aiemman pyynnön tila. Web Forms -tekniikassa tämä oli toteutettu piilotetuilla <input/>-kentillä, jotka saattoivat kasvaa huomattavan suuriksi, jopa sadoiksi kilotavuiksi, ja siirtyä edestakaisin jokaisella palvelupyynnöllä. Tämä näkyi sivustojen käyttöviiveenä. PostBack-toiminto renderöi jokaisen merkityn tapahtuman JavaScriptiksi. Tämän takia oli vähäinen mahdollisuus kontrolloida, miten selain kommunikoi palvelimen kanssa. (Bellinaso ym. 2009, 11; Sanderson 2009, 4.) 4.5 ASP.NET MVC:n heikkouksia Web Forms -tekniikka mahdollisti tapahtumakohtaisen ohjelmoinnin. Jokaiselle kontrollille on assosioitu palvelinpuolelle luokka sekä tapahtumankäsittelijä. Esimerkiksi Button-elementeillä on Click-tapahtuma. Kyseisellä toteutuksella on hintana se, että joudutaan käyttämään ViewState-tekniikkaa. (Conery ym. 2009, 173.) ASP.NET MVC ei mahdollista tapahtumakohtaista ohjelmointia, mikä saattaa olla hankala ajatus Web Forms -kehittäjille (Bellinaso ym. 2009, 12). Pitää tietää enemmän HTML-, CSS- ja JavaSript-tekniikoista kuin Web Forms - tekniikan parissa. Jotta voidaan puhua HTML:n täydellisestä hallinnasta, täytyy
13 jokainen elementti kirjoittaa toisensa jälkeen käsin. Tämän voi myös nähdä askeleena taaksepäin, kun puhutaan käytettävyydestä ja tuottavuudesta. (Esposito 2010, 33.) 5 RAMONES-NIMIGENERAATTORI Käytännön sovelluksena tässä työssä toteutetaan Ramones-nimigeneraattori ASP.NET MVC -tekniikalla, hyödyntäen kaikkia kolmea MVC-komponenttia. Sovelluksen idea on, että käyttäjältä kysytään etunimeä ja sukunimeä, joista etunimi tulostetaan annetussa muodossa, ja sukunimeksi tulostetaan syötteestä huolimatta aina Ramone. Sovellus on hyvin yksinkertainen, eikä se sisällä esimerkiksi validointi-toimintoja. Ulkoasu on myös hyvin mitäänsanomaton. Tarkoitus on vain esitellä ASP.NET MVC -toimintaa niin, että MVC-ajattelu otetaan mahdollisimman hyvin huomioon. Sovellus on toteutettu käyttäen Microsoft Visual Studio 2010 Ultimate Edition - ohjelmointityökalua. Ohjelmoinnin tukena on käytetty Steven Sandersonin kirjaa Pro ASP.NET MVC Framework (Sanderson 2009). Sovelluksen kokonainen lähdekoodi kommentteineen löytyy liiteluettelosta (Liite 1). Kun sovellus suoritetaan, ohjain-luokka tuo näytölle NimiForm-näkymän, joka toimii tämän sovelluksen käyttöliittymänä (Kuva 3). Tekstikentissä kysytään etunimeä ja sukunimeä. Kun Lähetä-nappia painetaan, tieto siirtyy tekstikentistä ohjaimelle. Tässä näkymässä luodaan kaksi <input type="text" />-kenttää ASP.NET MVC:n sisäänrakennetuilla HTML-metodeilla (Kuva 4).
14 Kuva 3. Sovelluksen käyttöliittymä. Kuva 4. <p>-elementtien sisältö generoituu <input type= text />-muotoon. Ohjain reagoi annettuihin syötteisiin lähettämällä ne mallille. HTTP-pyyntö sisältää mallin instanssin. Tämä operaatio on nimeltään Model Binding. (Kuva 5). Kuva 5. Ohjaimen koodia. Tässä sovelluksessa ei tarvitsisi käyttää malli-komponenttia ollenkaan. Käytän sitä pelkästään MVC-mallin fyysisen olemuksen aikaansaamiseksi. Malli (Kuva 6) lukee syötteet ja asettaa niihin samat arvot, millä ne NimiForm-näkymästä alun perin lähetettiin. Malli lähettää ne takaisin ohjaimelle. Kuva 6. Mallin koodia.
15 Ohjain lähettää syötteet Vastaus-näkymälle (Kuva 7). Vastaus-näkymä tulostetaan näytölle (Kuva 8). Kuva 7. Vastaus-näkymän koodia. Sukunimeksi on kovakoodattu Ramone. Kuva 8. Vastausnäkymä, johon sovelluksen suoritus loppuu. 6 LOPUKSI Innostukseni ohjelmointiin lähti C#-ohjelmointikielen opiskelusta. Olio-pohjainen ajattelu tuntui sopivalta minulle. Aiemmin olin hiukan tutustunut C-kieleen, joka on proseduraalinen kieli. Omaksuttuani C#-kielen oli luontevaa siirtyä ASP.NET Web Formsin pariin. Valmiit kontrollit sekä tapahtumakohtainen ohjelmointi tuntuivat erittäin tehokkaalta Web-sivujen rakentamiseksi. Nykyään kokemusta on kertynyt muun muassa JavaScript, PHP, C++-kielistä. Hallitsen mielestäni erittäin hyvin HTML ja CSS-tekniikat, joten niiden mahdollisimman tehokas käyttö Web-toteutuksissa on minulle lähes vaatimus. ASP.NET MVC vaikuttaa hyvin varteenotettavalta tekniikalta vaatimusteni täyttämiseksi. MVC-malli on mielestäni looginen ja helposti omaksuttava, ainakin ASP.NET MVCympäristössä. Minulla on niin vähän käyttökokemusta ASP.NET MVC-ympäristöstä, että en osaa ottaa kantaa sen tehokkuudesta esimerkiksi Web Formsiin verrattuna. Tapahtumakohtaisen ohjelmoinnin puute häiritsi ainakin minua.
16 Mielestäni ASP.NET MVC on hyvin tervetullut tekniikka. Ennen kaikkea se on vaihtoehtoinen ohjelmointiparadigma Web Formsille. LÄHTEET Bellinaso, M., Berardi, N. & Katawazi, A. 2009. ASP.NET MVC 1.0 Website Programming: Problem Design Solution. Indianapolis. Wiley Publishing, Inc. Conery, R., Gunthrie, S., Haack, P. & Hanselman, S. 2009 Professional ASP.NET MVC 1.0. Indianapolis. Wiley Publishing, Inc. Esposito, D. 2010. Programming Microsoft ASP.NET MVC. Microsoft Press. Haikala, I. & Märijärvi, J. 2006. Ohjelmistotuotanto. 11. painos. Jyväskylä. Talentum. Koskimies, K. 2000. Oliokirja. Jyväskylä. Satku Kauppakaari. Koskimies, K & Mikkonen, T. 2005. Ohjelmistoarkkitehtuuri. Jyväskylä. Talentum. MacDonald, M. 2007. Beginning ASP.NET 3.5 in C# 2008. 2. painos. Apress. Microsoft 2011. Getting started with ASP.NET MVC 3. Viitattu 10.4.2011. Saatavissa: http://www.asp.net/mvc. Reenskaug, T. 1979a. MVC XEROX PARC 1978-79. Viitattu 6.4.2011. Saatavissa: http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html. Reenskaug, T. 1979b. Models Views Controllers. Viitattu 6.4.2011. Saatavissa: http://heim.ifi.uio.no/~trygver/1979/mvc-2/1979-12-mvc.pdf.. Sanderson, S. 2009. Pro ASP.NET MVC Framework. Apress. Walther, S. 2010. ASP.NET MVC Framework Unleashed. Sams.
17 LIITE 1 Näkymät //NimiForm <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>nimiform</title> </head> <form action="/home/nimiform" method="post" > <h1>ramones-nimigeneraattori</h1> <p>etunimi: <%= Html.TextBox("Etunimi") %></p> <p>sukunimi: <%= Html.TextBox("Sukunimi")%></p> <input type="submit" value="lähetä" /> </form> </html> //Vastaus <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<RamonesNameGenerator.Models.RamonesModel>" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
18 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>vastaus</title> </head> <body> <div> <h1>ramones nimesi on: <%= Html.Encode(Model.Etunimi) %> <%=Html.Encode(Model.Sukunimi = "Ramone") %>!</h1> </div> </body> </html> Ohjain //HomeController using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using RamonesNameGenerator.Models; //Lisättiin Models. namespace RamonesNameGenerator.Controllers { [HandleError] public class HomeController : Controller { public ViewResult NimiForm() //Tulostetaan NimiForm-näkymä näytölle. { return View(); } [AcceptVerbs(HttpVerbs.Post)] //Käsitellään NimiFormin-syötteet, lähetetään ne mallin kautta Vastaus-näkymälle public ViewResult NimiForm(RamonesModel ramonesvastaus) { return View("Vastaus", ramonesvastaus); } } } Malli //RamonesModel using System; using System.Collections.Generic;
19 using System.Linq; using System.Web; namespace RamonesNameGenerator.Models { public class RamonesModel { public string Etunimi { get; set; } public string Sukunimi { get; set; } } } Reititystiedot //Global.asax.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace RamonesNameGenerator { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?linkid=9394801 public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.ignoreroute("{resource}.axd/{*pathinfo}"); routes.maproute( //Vakioreittiä muutettiin. "RamoneReitti", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "NimiForm", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); } RegisterRoutes(RouteTable.Routes);
20 } }