URL mapping w Grails

Dzisiaj będzie szybko aczkolwiek treściwie :) Podczas pisania aplikacji w Grails niejednokrotnie pojawia się potrzeba zmienienia mapowania URLi. Mapowanie takie definiujemy w pliku UrlMappings w katalogu conf naszej aplikacji. Plik taki ma początkowo następującą postać:

class UrlMappings {
    static mappings = {
        “/$controller/$action?/$id?”
        {
            constraints {
                // apply constraints here
            }
        }
}

Załóżmy jednak, że chcielibyśmy aby pod następującą ścieżką:

/site/id

Była dostępna strona która będzie rozpoznawana za pomocą parametru id.
Mapowanie takie możemy zdefiniować za pomocą następującego wpisu w pliku UrlMapping:

“/site/$id”
{
        controller = “main”
        action = “showPage”
        constraints {
              // apply constraints here
        }
}

Mapowanie to sprawi, że po wywołaniu adresu kończącego się na /site/home zostaniemy przekierowani do kontrolera o nazwie main (nazwa klasy to MainController) i zdefiniowanej w nim akcji showPage. Z poziomu akcji możemy pobrać identyfikator strony, uczynimy to w następujący sposób:

def showPage = {
        [pageInstance: Page.findByPageId(params.id)]
}

Jak widać w powyższym kodzie, parametr id zdefiniowany w mapowaniu URL’a będzie dostępny w params pod tą samą nazwą. W ten sposób pobierzemy stronę której parametr pageId jest równy home gdyż taka właśnie wartość odpowiada naszemu parametrowi id.
Dodatkowo w sekcji constraints możemy zdefiniować warunki dla których nasz URL będzie mapowany, np.:

“/site/$id”
{
        controller = “main”
        action = “showPage”
        constraints {
              id(matches:/[A-Z]{5}/)
        }
}

Dodanie id(matches:/[A-Z]{5}/) do bloku constraints spowoduje, iż jako parametr id podane będą mogły być wartości spełniające wyrażenie regularne, w tym wypadku identyfikator id musi się składać z pięciu liter z których dopuszczalne to A-Z.

Ostatnia ważna rzecz przy mapowaniu URLi to zdefiniowanie parametru będącego częścią URL’a jako parametru opcjonalnego:

“/site/$id?”
{
        controller = “main”
        action = “showPage”
        constraints {
             
        }
}

Zmieniliśmy tutaj ciąg znaków “/site/$id” na “/site/$id?, dodanie pytajnika oznacza, że parametr ten jest opcjonalny. Niezależnie od tego czy go podamy, czy też nie to zostaniemy przekierowani do akcji showPage w kontrolerze MainController.

  • Digg
  • del.icio.us
  • Google
  • description
  • Technorati
  • Wykop
December 5, 2008 | |

COMMENTS

 

Trackback URI | Comments RSS

Leave a Reply