Url Mappings
Url Mappings
현재까지는 URL이 grails Convention 에 따라서 결정되었지만,
grails-app/conf/UrlMappings.groovy 에서 제어할 수 있다.
UrlMappings 클래스는 코드의 블럭을 할당할 수 있는 mappings이라는 프로퍼티 하나만 가진다
Mapping to Controllers and Actions
url에 컨트롤러, 액션을 매핑할 수 있다
UrlMappings.groovy에 아래 내용을 추가한다. (mapping 프로퍼티 안에 추가)
"/myBook"(controller:"book", action:"view")
확인주소 : http://localhost:8080/mygrails/myBook/
myBook 이라는 url은 BookController의 view Action으로 연결된다.
action을 생략할 경우 BookController의 기본 Action으로 연결된다.
실행 후 아래와 같이 확인할 수 있다.
/book/view로 접근했었던 내용이 /myBook 으로 접근 가능하게 되었다
메소드에 넘기는 블력 안에 컨트롤러와 액션을 명시하는 방법도 있다
UrlMappings.groovy에 추가했었던
"/myBook"(controller:"book", action:"view")
내용을 지우고 아래 내용을 추가한다
"/myBook" { controller = "book" action = "view" }
확인 해보면 내용은 같다.
어떤 방법을 사용하든 같다.
Embedded Variables
Simple Variables(간단한 변수)
고정된 문자열로 url을 구성을 하였으나, 변수를 사용할 수도 있다.
UrlMappings.groovy 에 아래의 내용을 추가한다.
"/myBook2/$id"(controller : "book", action : "view2")
BookController 에 아래의 내용을 추가한다.
def view2 = { render params.id }
/myBook2/id 형태의 url로 접근하면 화면에 id가 렌더링 되는 걸 볼 수 있다.
/myBook2/ 형태의 url은 404이다.
확인주소 : http://localhost:8080/mygrails/myBook2/kshmeme
좀더 복잡한 매핑도 정의할 수 있다
확인주소 : http://localhost:8080/mygrails/book/2014/04/02/1
UrlMappings.groovy 에 아래의 내용을 추가한다.
"/book/$year/$month/$day/$id"(controller:"book", action:"view3")
BookController 에 아래의 내용을 추가한다.
def view3 = { def year = params.year def month = params.month def day = params.day def id = params.id def text = "year : " + year + "<br />" text = text+ "month : " + month + "<br />" text = text+ "day : " + day + "<br />" text = text+ "id : " + id + "<br />" render text }
아래와 같이 나오는 걸 확인할 수 있다.
Dynamic Controller and Action Names(동적 컨트롤러와 액션 이름)
변수는 동적으로 컨트롤러와 액션의 이름을 매핑 하는데에서 사용 가능하다.
아래는 Grails의 기본적으로 설정되어있는 매핑 규칙이다.
컨트롤러이름/액션이름/아이디 의 주소 규칙을 가지고 있다.
"/$controller/$action?/$id?"{ constraints { // apply constraints here } }
Optional Variables(필수가 아닌 변수)
기본적으로 설정되어있는 매핑 규칙은
토큰(/ / 사이에 있는 문자열) 끝에 ? 를 붙여 생략이 가능 하도록 했다
기본 매핑은 토큰 끝에 ? 를 붙여 생략이 가능 하도록 했다
UrlMappings.groovy 에 추가했었던
"/book/$year/$month/$day/$id"(controller:"book", action:"view3") 의 내용을 아래와 같이 변경한다.
"/book/$year/$month/$day?/$id?"(controller:"book", action:"view3")
day와 id 는 생략 가능하여 연/월 만 받을 수도있다
아래와 같이 여러 가지 경우에 처리를 할 수 있다.
http://localhost:8080/mygrails/book/2014/04/
http://localhost:8080/mygrails/book/2014/04/01
http://localhost:8080/mygrails/book/2014/04/01/kshmeme
Arbitrary Variables(임의 변수)
URL이 매핑될 때 임의의 파라미터를 넘기도록 할 수 있다
매핑시 넘겨지는 블럭에 임의의 파라미터들을 설정하면 된다.
UrlMappings.groovy에 아래와 같이 추가하면 paramtest Action에서 params.id 또는 params.year에 접근 할 수 있다.
"/book/paramtest"{ controller = "book" action = "paramtest" id="kshmeme" year="2014" }
Dynamically Resolved Variables(동적으로 변수 이름 결정하기)
변수의 이름을 런타임에 결정해야 할 때도 있다.
변수이름에 블럭을 할당함으로써 가능하다.
UrlMappings.groovy 에 아래의 내용을 추가한다.
"/book/view5"{ controller = "book" action = "view5" userid = {params.id} isLogin = { session.user != null } // must be logged in }
BookController 에 아래의 내용을 추가한다.
def view5 = { params.userid render params.userid + " login " + params.isLogin }
아래와 같이 확인할 수 있다
Mapping to Views
view를 컨트롤러나 액션 없이 연결할 수 있다.
UrlMappings.groovy 에 기본적으로 설정되어있다
static mappings = { "/"(view:"/index") // // 루트 URL이 매핑된다. }
Mapping to Response Codes
HTTP응답 코드에 따라 컨트롤러, 액션, 뷰에 매핑할 수 있다.
UrlMappings.groovy 에 기본적으로 설정되어있다.
(경우에 따라서는 404, 403 등 코드별로 각각 설정할 수 있다)
"500"(view:'/error')
Mapping to HTTP methods
HTTP 메소드(GET, POST, PUT, DELETE)에 따라 URL이 다르게 매핑되도록 설정할 수 있다
RESTful 같은 방식에 유용하게 사용할 수 있다.
확인주소 : http://localhost:8080/mygrails/book/methodTest
UrlMappings.groovy에 아래 내용을 추가한다
"/book/view6"{ controller = "book" action= [ GET:"view6_1", PUT:"view6_2", DELETE:"view6_3", POST:"view6_4" ] }
BookController에 아래 내용을 추가한다.
def view6_1 = { render "GET Method" } def view6_2 = { render "PUT Method" } def view6_3 = { render "DELETE Method" } def view6_4 = { render "POST Method" } def methodTest = {}
views/book 디렉터리에 methodTest.gsp를 추가한다.
methodTest.gsp의 내용을 아래와 같이 변경한다.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("#ajaxTest").click(function(){ ajaxSubmitTest(); }); }) function ajaxSubmitTest(){ $.ajax({ url: '/mygrails/book/view6', type: 'PUT', data: { // _method: 'PUT' }, success : function(data){ alert(data); } }); } </script> <div class="body"> <input type="button" value="ajax" id="ajaxTest" /> </div>
실행후 ajax 버튼을 클릭하면 javascript에서 ajax 호출시
type 에 따른 Action이 실행되는 것을 확인할 수 있다.(현재는 PUT)
type을 POST로 변경 후 실행 하면 아래처럼 POST으로 연결된 Action(view6_4)이 실행된다