![]() |
|
|
|||||||
| Webbrelaterade artiklar Här skriver du artiklar om asp, asp.net, java, c#, html, webbsäkerhet |
![]() |
|
|
Trådverktyg | Betygsätt tråden | Visningsalternativ |
|
|
#1 |
|
Medlem
Registrerad: 2000-03-12
Ort: Göteborg
Inlägg: 5 832
Lösningar: 179 |
[Java] Play! Framework - en introduktion
Jag har nyligen upptäckt ett intressant ramverk för Java, som heter Play! Framework. Jag har egentligen bara hunnit känna på det men är redan imponerad över hur enkelt det är att använda och hur snabbt man utvecklar med det. Det är inte lika stort och flexibelt som t.ex. Spring, men om man vill ha något relativt enkelt gjort på en kort utvecklingstid kan Play! vara värt att titta närmare på.
Play! är ett MVC-ramverk som använder JPA och Hibernate under huven – och som utvecklare behöver man inte bry sig alls om konfigurationen för JPA och Hibernate! Det är väldigt smidigt gjort, man får Model-superklasser att ärva från för att en smidig integration mot datakällan. Vidare har Play! ett utmärkt gränssnitt för unit testning, med antingen JUnit eller Selenium, där man kommer åt testen via webläsaren. Det är dock ingenting jag fokuserar på i den här texten. Jag kommer visa ett kortare exempel där jag bygger upp en filmsajt för listningar av filmer och skådespelare. De redskap som jag kommer använda är Play! Framework och eclipse för att hantera min kod. Upplägget ser ut som följer:
1. Installation och hur man skapar ett projekt Ladda ned ramverket och packa upp det på valfri plats, ingen automatisk installation sker. Allt vi behöver finns i zip-arkivet. Efter att du packat upp Play! behöver vi peka miljövariabeln PATH till platsen där Play! hittas. I mitt fall, jag sitter i GNU/Linux, sparade jag Play! i min hemmapp home/bjorn/play så för att mitt system ska kunna hitta Play! lägger jag till följande rader i min ~/.bash_profile: Kod:
PATH=$HOME/play:$PATH export PATH Då var installationen klar! Dags att sätta upp ett första projekt. Placera dig i den mapp där du vill att ditt nya projekt ska husera, i mitt fall blev det /home/bjorn/projects. Jag väljer att döpa det här projektet till moviedb och ska också finnas i en mapp som heter moviedb, så för att skapa projektet och mappen kör jag helt enkelt kommandot: Kod:
play new moviedb Nu har vi skapat projektet moviedb i mappen med samma namn, och Play! har nu skapat ett skelett med kataloger och filer i projektmappen. Redan nu kan vi köra projektet genom: Kod:
play run moviedb För att vi ska kunna använda eclipse som IDE till vårat nya Play! projekt på ett smidigt sätt, kan vi låta Play! göra om vårat projekt till ett eclipse-projekt genom kommandot: Kod:
play eclipsify moviedb I mappen app finns de filer vi kommer att arbeta med, nämligen våra kontroller, modeller och vyer. Vi kommer också att titta lite i conf för den lilla konfiguration vi behöver göra. Tillsvidare använder vi standardkonfigurationen av Play!. 2. Modeller och datakälla Som jag tidigare sa sköter Play! all mappning med JPA och Hibernate åt oss, utan att vi behöver bry oss om konfigurationsinställningar och liknande. Däremot måste vi tala om för Play! vilken typ av datakälla vi vill använda. Under utvecklingstiden kan vi använda HSQLDB, en "in-memory"-databas från Hibernate. Så fort vi stänger vårat projekt töms alltså databasen på information. I eclipse öppnar vi upp filen conf/application.conf. För att få Play! att använda HSQLDB som datakälla är det enda vi behöver göra att avmarkera rad 75, under Database configuration, så det står db=mem. Min första modell blir klassen som representerar en skådespelare. De egenskaper vi lagrar för våra skådespelare är enbart namn. Vanligtvis sätter man upp sina modeller med inkapsling och privata instansvariabler för att lagra värden, men Play! arbetar lite annorlunda. Här har vi istället publika instansvariabler som Play! senare kapslar in åt oss. Varje modell måste också ha annoteringen @Entity för att JPA ska hantera det som en entitet/modell, liksom en konstruktor med de nödvändiga parametrarna för instansen. Skapa filen Actor.java under models-paketet i eclipse. I sin helhet ser klassen ut så här: java:
Den andra modellen blir klassen som representerar en film. De egenskaper våra filmer behöver är en titel för varje film, en handling och en samling med skådespelare. Eftersom att en film kan ha flera skådespelare och en skådespelare kan medverka i flera filmer, blir relationen mellan dom många-till-många. Det måste märkas ut med annoteringar för att JPA ska förstå sambandet mellan våra entiteter. Skapa filen Movie.java under models-paketet i eclipse. I sin helhet ser klassen ut så här: java:
Vi ska ha ytterligare en modell i vårt projekt, för att visa ett en-till-många-förhållande, nämligen s.k. arbetstitlar för en film. En film kan alltså ha flera arbetstitlar, innan den slutgiltiga titeln sätts. Modellen ser ut som följer: java:
Nu måste vi ju dock uppdatera vår Movie-modell så att den innehåller alla sina arbetstitlar. Lägg till följande efter listan med skådespelare: java:
Vi behöver också initiera listan i konstruktorn, på samma sätt som vi gör med listan över skådespelare - men vi behöver inte ta emot en lista med arbetstitlar som parameter: java:
Då ska våra modeller vara klara! Redan nu kan man köra projektet, för att se så att man inte har gjort något galet – Play! spottar direkt ur sig felmeddelanden. Kör play run moviedb från terminalen och peka webläsaren till http://localhost:9000 – förhoppningsvis ska du få upp samma välkomstskärm som första gången du körde projektet. Om du får ett felmeddelande är det väldigt välbeskrivande, med radnummer på var felet inträffade och i vilken fil tillsammans med några rader kod från där problemet hittades. 3. Första titt på vyer I mappen views hittar vi våra vyer, sorterade i mappar med samma namn som kontrollern som anropar dom. Än så länge har vi inte rört våra kontrollers, och det finns bara två mapper – en för standardkontrollern Application och en för felhanteringen med mappen errors. I dessa mappar finns sidmallar i form av HTML-filer, mest kända som "template"-mallar. Direkt under mappen views finns en fil som heter main.html, som innehåller dokumentens huvud och fot – och som man använder som standardmall. In i denna mall injiceras sedan varje anrops (även kallad action) template-mall. Om man har programmerat något i Groovy känner man igen en del från template-mallarnas syntax. Om man öppnar main.html (i eclipse högerklickar man och väljer "Open With > Text editor") så ser man var det injiceras data – nämligen vid alla #{...}/@{...}/${...}-taggar. Det magiska i filen händer vid #{doLayout /}, där action-templaten injiceras. Vi kommer snart att se mer på hur vi hanterar data i våra vyer. 4. Kontrollers En kontroller (fr. eng. Controller) agerar mellanlager mellan entiteter/datakälla och vyer. De bestämmer vilken data som ska skickas till vyn, helt enkelt. Själva kontrollern är en klass, och dess metoder kallas för action-metoder – det är dessa som anropas när besökaren efterfrågar en sida. Varje action-metod svarar mot en vy med samma namn. T.ex. vyn views/listing/actors.html anropas när metoden actors() i kontrollern controllers/Listing.java anropas. Play! har som sagt en standardkontroller färdig åt oss, Application.java, men det är väl lika bra att göra en egen på en gång?! Det vi vill göra på vår webplats är att lista filmer och tillhandahålla information kring dem, samt att lista skådespelare och information om dessa. Det låter väl ganska vettigt att då skapa en Listing-kontroller? Vi börjar med ett skelett: java:
Om en besökare efterfrågar roten (/) på vår webplats, vill vi lista alla de filmer vi har i vår databas. Eftersom att ingen action har efterfrågats då, sätter vi upp en ingångs-action (eng. default action) kallad index(). I den här metoden vill vi då hämta alla våra filmer och skicka vidare till vyn, så att vyn kan presentera dom på lämpligt sätt. Alla action-metoder deklareras som statiska, för att Play! ska kunna anropa dom. Play! använder Javas Reflection API för att hitta i våra klasser, och anropar de nödvändiga metoderna. Play!s modeller tillhandahåller metoder enligt Active Record-pattern, vilket gör det enkelt för oss att skapa/läsa/uppdatera/ta bort objekt i/till datakällan – känt under akronymen CRUD (create/read/update/delete). Man använder Hibernates egna SQL-dialekt HSQL för att göra urval, sortering eller gruppering på resultatet. Action-metoden index() i kontrollern Listing: java:
Vi vill ju också kunna lista alla våra skådespelare, så vi skapar en till action-metod som vi kallar för actors(): java:
Hur visar vi dom nu då? 5. Vyer för vår kontroller Då har vi två vyer att skapa, en som listar filmer och en som listar skådespelare. Först och främst editerar vi main.html så att den passar oss: HTML:
Då börjar vi med vyn för action-metoden index() - börja med att skapa katalogen Listing under views, och filen index.html i den nyligen skapade katalogen, med följande innehåll: HTML:
Vi skapar en liknande template för våra skådespelare, skapa filen actors.html i samma mapp: HTML:
6. URL-mappning och rutter För att vi nu ska kunna besöka vår filmdatabas behöver vi ändra om lite bland URL-mappningen för Play!. Fortfarande anropas nämligen Application.java som standard-kontroller om vi kör vårat projekt, och så kan vi ju inte ha det! Öppna upp filen conf/routes och titta på hur sökvägar definieras. Kod:
# Home page
GET / Application.index
# Map static resources from the /app/public folder to the /public path
GET /public/ staticDir:public
# Catch all
* /{controller}/{action} {controller}.{action}
Kod:
GET / Listing.index Kod:
GET /actors Listing.actors GET /actors/ Listing.actors 7. Knyt ihop säcken Vi gör det enkelt för oss och skapar ett formulär under listningen av filmer, där man kan lägga till en film och dess skådespelare. Editera views/Listing/index.html: HTML:
Play! har i sitt template-språk färdig funktionalitet för att skapa fomulär. @-tecknet visar att det gäller en pekning till en kontroller och action-metod, annars byggs formuläret som vanligt. Som man säkert förstår behövs nu ytterligare en metod i Listing-kontrollern, nämligen addData(). Vi får in datat från formuläret till parameterlistan för metoden, i den ordning vi la till den i formuläret: java:
Nu kan vi skapa filmer, skådespelare och arbetstitlar! Filmerna listas under http://localhost:9000/ och alla skådespelare hittar man under http://localhost:9000/actors. 8. Avslutning Play! Framework är väldigt enkelt och snabbt att jobba med, och jag har såklart bara skrapat lite på ytan i det här exemplet. I exempelkoden som finns för nedladdning är koden något mer genomarbetad och lite mer funktionalitet finns inlagt. Det finns flera moduler som kan vara av intresse att titta på, som jag inte går igenom, som t.ex. admingränssnittet som Play! åstadkommer lekande lätt! Hoppas att läsaren har fått ut något vettigt ur det tunna materiel jag skrivit ned, och att törsten av att lära sig mer om ramverket har infunnit sig. Happy coding! Björn Wikström Play! Framework: http://playframework.org/ En mer genomgående introduktion hittas på http://www.playframework.org/documentation/1.0.2.1/home
__________________
"Knock off the hippie shit, strap on a helmet and start shooting. This is Malibu, baby! I want you to storm that beach like it's fuckin' Normandy!" Senast redigerad av SPiN, 2011-04-20 klockan 16:37 |
|
|
|
|
|
#2 |
|
Medlem
Registrerad: 2001-05-07
Inlägg: 1 880
Lösningar: 18 |
Tack för en bra artikel. Play verkar vara ett intressant ramverk. Jag har precis börjat leka lite med det. Kanske kommer att använda det på nån liten sajt, men måste lära mig mer först.
Jag har inte helt förstått arkitekturen. Play verkar ju inte använda sig av Java Servlets. Som jag har förstått det så skapar Java Servlets-containrar en ny tråd per besökare, vilket kan ta upp en del minne. Play verkar använda Netty istället. Betyder det att Play är mer event-driven och inte skapar en ny tråd per besökare? Det är nu nästan ett år sen artikeln skrevs, har du eller kanske nån annan använt Play Framework för nåt skarp projekt? Hur upplevde ni det? |
|
|
|
|
|
#3 |
|
Medlem
Registrerad: 2000-03-12
Ort: Göteborg
Inlägg: 5 832
Lösningar: 179 |
Tack.
Helt riktigt, Play! använder inte J2EEs Servlet API. Då skulle det nämligen inte vara möjligt med "code hotswapping", och du skulle få publicera om dina projektfiler till en servlet container efter varje koduppdatering. I längden blir det ganska tradigt under utvecklingstiden, när man ibland vill göra snabba kodförändringar. Jag tror inte att minnesanvändningen var någon anledning till att strunta i Servlet APIet. Att förbigå Servlet API innebär också att Play! blir helt stateless, och lätt kan lastbalanseras. Däremot har en utvecklare skrivit en Servlet-wrapper, som i stort sett enbart binder in Play!-projektet i en/flera servlets. Jag har inte lyckats få in Play! på jobbet, så än så länge är det bara i små hobbyprojekt som inte gått live jag använt Play!. Tyvärr.
__________________
"Knock off the hippie shit, strap on a helmet and start shooting. This is Malibu, baby! I want you to storm that beach like it's fuckin' Normandy!" |
|
|
|
|
|
#4 |
|
Forumtekniker
Registrerad: 2001-06-13
Ort: Stockholm
Inlägg: 3 385
Lösningar: 197 |
Nu har ju även scala-versionen blivit riktigt intressant:
http://scala.playframework.org/
__________________
Yes, I Blag! |
|
|
|
|
|
#5 |
|
Medlem
Registrerad: 2000-03-12
Ort: Göteborg
Inlägg: 5 832
Lösningar: 179 |
Ja, den skulle jag gärna vilja känna lite mer på! När tid finnes...
__________________
"Knock off the hippie shit, strap on a helmet and start shooting. This is Malibu, baby! I want you to storm that beach like it's fuckin' Normandy!" |
|
|
|
|
|
#6 |
|
Medlem
Registrerad: 2000-07-29
Ort: Fredriksdal, Helsingborg
Inlägg: 9 902
Lösningar: 143 |
Tack för ett intressant uppslag. Jag försökte att ta hem dokumentationen igår. Nu ser jag att de andra länkarna fungerar men ditt eget är väl borttaget.
Snygg beskrivning , och lättförståelig säger Lasp
__________________
Livet är kort och Nu! Läs mera! !?
|
|
|
|
|
|
#7 |
|
Medlem
Registrerad: 2000-03-12
Ort: Göteborg
Inlägg: 5 832
Lösningar: 179 |
Tack, och helt riktigt -- jag har lyckats plocka bort exempelfiler och PDF-versionen från min server. Jag hittar dom inte på någon disk heller, men någonstans ligger dom tror jag... Trodde att jag lyckats plocka bort alla länkar, men det var en kvar såg jag nyss
__________________
"Knock off the hippie shit, strap on a helmet and start shooting. This is Malibu, baby! I want you to storm that beach like it's fuckin' Normandy!" |
|
|
|
![]() |
| Trådverktyg | |
| Visningsalternativ | Betygsätt tråden |
|
|