9
Tags:
grails
hjemmeside
groovy
Skrevet af
Bruger #5097
@ 30.03.2011
Gennemgang af controllerVi kikker nu på vores controller. Denne indeholder koder til hver actions (eksempelvis def
list = {...). Bemærk at en action har præcis det samme navn som dets view-fil. Dette er endnu en konvension.
Hele koden ser således ud:
- package venneside
-
- class VenController {
-
- static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
-
- def index = {
- redirect(action: "list", params: params)
- }
-
- def list = {
- params.max = Math.min(params.max ? params.int('max') : 10, 100)
- [venInstanceList: Ven.list(params), venInstanceTotal: Ven.count()]
- }
-
- def create = {
- def venInstance = new Ven()
- venInstance.properties = params
- return [venInstance: venInstance]
- }
-
- def save = {
- def venInstance = new Ven(params)
- if (venInstance.save(flush: true)) {
- flash.message = "${message(code: 'default.created.message', args: [message(code: 'ven.label', default: 'Ven'), venInstance.id])}"
- redirect(action: "show", id: venInstance.id)
- }
- else {
- render(view: "create", model: [venInstance: venInstance])
- }
- }
-
- def show = {
- def venInstance = Ven.get(params.id)
- if (!venInstance) {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- else {
- [venInstance: venInstance]
- }
- }
-
- def edit = {
- def venInstance = Ven.get(params.id)
- if (!venInstance) {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- else {
- return [venInstance: venInstance]
- }
- }
-
- def update = {
- def venInstance = Ven.get(params.id)
- if (venInstance) {
- if (params.version) {
- def version = params.version.toLong()
- if (venInstance.version > version) {
-
- venInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'ven.label', default: 'Ven')] as Object[], "Another user has updated this Ven while you were editing")
- render(view: "edit", model: [venInstance: venInstance])
- return
- }
- }
- venInstance.properties = params
- if (!venInstance.hasErrors() && venInstance.save(flush: true)) {
- flash.message = "${message(code: 'default.updated.message', args: [message(code: 'ven.label', default: 'Ven'), venInstance.id])}"
- redirect(action: "show", id: venInstance.id)
- }
- else {
- render(view: "edit", model: [venInstance: venInstance])
- }
- }
- else {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- }
-
- def delete = {
- def venInstance = Ven.get(params.id)
- if (venInstance) {
- try {
- venInstance.delete(flush: true)
- flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- catch (org.springframework.dao.DataIntegrityViolationException e) {
- flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "show", id: params.id)
- }
- }
- else {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- }
- }
Jeg vil nu gennemgå de forskellige actions:
List:- def list = {
- params.max = Math.min(params.max ? params.int('max') : 10, 100)
- [venInstanceList: Ven.list(params), venInstanceTotal: Ven.count()]
- }
Denne kode har til formål at give
list.gsp de informationer den har brug for. Her laver vi, i linje 2, et parameter med navnet max som giver en begrænsning på hvor mange instancer der kan vises per side i list.
Den næste linje (linje 3) returnerer instanser til vores gsp fil. I dette tilfælde laver vi en instans med navnet
venInstanceList som er en liste som overholder de parametre vi tidligere har givet. Derudover returneres instansen
venInstanceTotal som indeholder antallet af venner i Ven.
Create:- def create = {
- def venInstance = new Ven()
- venInstance.properties = params
- return [venInstance: venInstance]
- }
Create sørger for af give
create.gsp en tom instans, som den kan bruge til indsætte nyt data i. Bemærk at
venInstance har data typen def. Dette skyldes at Groovy selv finder ud af hvilken type du bruger, hvis du vælger dette. Vi kunne derfor lige så godt også skrive
Ven i stedet for def.
I næste linje giver vi instansen i egenskaber som findes i parameteret. Som udgangspunkt er det ingen. Til sidst returneres instansen.
Save:- def save = {
- def venInstance = new Ven(params)
- if (venInstance.save(flush: true)) {
- flash.message = "${message(code: 'default.created.message', args: [message(code: 'ven.label', default: 'Ven'), venInstance.id])}"
- redirect(action: "show", id: venInstance.id)
- }
- else {
- render(view: "create", model: [venInstance: venInstance])
- }
- }
Dette er en POST (læs mere:
http://en.wikipedia.org/wiki/POST_%28HTTP%29 ) metode, hvilket den er blevet defineret som tidligere i controlleren på følgende linje:
- static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
Denne action bliver kaldt når folk inde på save.gsp trykker ”opret”.
I første linje (linje 2) laver vi en ny instans af Ven med de parametre vi har fået fra formen. Vi prøver derefter at gemme instansen i linje 3. Dette gøres ved brug af venInstance.save(). Hvis den bliver oprettet laver vi en standart-besked som siger at den er oprettet (linje 4-5), og videresender en
show.gsp.
Hvis ikke instansen kunne gemmes renders create siden igen, men denne gang vises venInstance i formularen (linje 8).
Show:- def show = {
- def venInstance = Ven.get(params.id)
- if (!venInstance) {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- else {
- [venInstance: venInstance]
- }
- }
Denne bliver brugt af
show.gsp til at vise den instans med id'et som ligger i params.id. Blev den ikke blev fundet bliver man videresendt til list.gsp med en standart fejlmeddelsels. Ellers returnes instansen.
Edit:- def edit = {
- def venInstance = Ven.get(params.id)
- if (!venInstance) {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- else {
- return [venInstance: venInstance]
- }
- }
Henter en bestemt instans ned, så den kan blive ændret. Koden er fuldstændig som hos show.
Update:- def update = {
- def venInstance = Ven.get(params.id)
- if (venInstance) {
- if (params.version) {
- def version = params.version.toLong()
- if (venInstance.version > version) {
-
- venInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'ven.label', default: 'Ven')] as Object[], "Another user has updated this Ven while you were editing")
- render(view: "edit", model: [venInstance: venInstance])
- return
- }
- }
- venInstance.properties = params
- if (!venInstance.hasErrors() && venInstance.save(flush: true)) {
- flash.message = "${message(code: 'default.updated.message', args: [message(code: 'ven.label', default: 'Ven'), venInstance.id])}"
- redirect(action: "show", id: venInstance.id)
- }
- else {
- render(view: "edit", model: [venInstance: venInstance])
- }
- }
- else {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- }
Er en POST som bliver kaldt når man fra
edit.gsp trykker man ret knappen. I linje 2 henter vi den instans som vi ønsker at ændre. Dette gøres ud fra at vi kender id (alle instanser har et unikt id).
I 3 linje tjekker vi derefter om den eksisterer, hvis ikke laver vi (se linjerne fra 22) en fejlmeddelelse og videresender til actionen list.
I linje 4-6 henter vi det versionsnummer som vores rettelser har. Alle instanser har nemlig et version nummer i stigende rækkefølge. I linje linje 6 tjekker vi om vores rettelser har et nyere nummer. Hvis ikke, betyder det at der er blevet rettet i instansen i et andet vindue imens, vi har rettet i det. Derfor giver der i sådan et tilfælde en fejlmeddelelse (linje 7-10).
Hvis der ikke har været nogen problemer ind til videre, vil vi i linje 13 indsætte rettelserne i instansen, og gemmer den i linje 14.
hasErrors() vil jeg i denne ikke artikel ikke beskæftige mig med, og vil derfor bare bede folk accepterer det står i koden.
Delete:- def delete = {
- def venInstance = Ven.get(params.id)
- if (venInstance) {
- try {
- venInstance.delete(flush: true)
- flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- catch (org.springframework.dao.DataIntegrityViolationException e) {
- flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "show", id: params.id)
- }
- }
- else {
- flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'ven.label', default: 'Ven'), params.id])}"
- redirect(action: "list")
- }
- }
- }
Denne action er endnu en POST, som benyttes til at slette instancen med et id fra parameteret af. Ligesom i java, bliver vi her nød til at benytte try-catch til at opfange eventuelle exceptions.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (4)
Hvorfor bruge grails istedet for rails?
Hej Asker. Tja... Det er lidt et religions-spørgsmål. Altså sådan lidt smag og behag. De kan begge det samme. Grails er kraftigt inspireret af Ruby On Rails, så også opbygningen virker ens i begge miljøer.
Jeg tror det væsentligste argument for at vælge Grails frem for Ruby er hvis du allerede kender til Java, eller evt. sprog der ligner såsom C, C++ og PHP. Kender du til dem vil du føler dig rigtig godt hjemme i Grails.
De fleste med kendskaber til Ruby skal nok vende sig til deres (efter min mening) lidt anderledes syntax. Så derfor er Grails nok et godt valg for mange...
Hej, Jeg syntes at det var en god introduktion til Grails, og det har virkelig vækket min nysgerrighed til dette framework. Jeg håber at der kommer en efterfølger, som går lidt mere i dybden med frameworket, og gerne en der hjælper begynderen som mig igang med at lave en hjemmeside ved hjælp af grails.
Hey Martin. Tak for rosen. Jeg tænker også stærkt over tanken om en to'er. Vil måske lave en om ikke så længe
Du skal være
logget ind for at skrive en kommentar.