OGNL

OGNL (Object Graph Navigation Language)은 
오브젝트 그래프 네비게이션 언어이다. 오브젝트들의 트리 구조 상에서 특정 오브젝트에 대한 조작을 할 때 사용한다.
보통은 단일 루트로 부터 파생되는 구조를 가지지만 스트럿츠 2 (XWork)에서는 여러개의 루트를 가질 수 있게 한다. 이러한 루트들을 모아서 바로 벨류 스텍(Value Stack)이라고 한다. 엑션에서 처리한 결과라던지 임시로 생성한 변수/객체를 저장하거나 읽어 오기 위해서 사용한다.

Ognl컨텍스트에 foo라는 오브젝트와 bar라는 오브젝트를 각각 "foo"라는 이름과 "bar"라는 이름으로 맵핑(저장)했다고 하자. foo를 루트 오브젝트라고 했다고 하면 아래와 같이 접근이 가능하다.

#foo.blah // foo.getBlah()를 호출한 결과

#bar.blah // bar.getBlah()를 호출한 결과

blah      // foo.getBlah()를 호출한 결과(foo가 루트이기 때문에)


컨텍스트에는 여러개의 객체를 맵핑할 수 있지만 대상이 루트가 아닌경우에는 #foo와 같이 네임스페이스를 지정해야 한다.

XWork는 여기서 어떻게 다른가?

XWork에서는 ValuStack전체가 루트가 된다. 객체를 먼저 지정한 후 프로퍼티를 get하는 것만이 아니고 XWork만의 OGNL 프로퍼티 접근자가 있다. 이를 사용해서 스텍의 모든 요소를 검색하게 된다. (톱다운방식)

예를 들어서 스텍에 animal과 Person객체가 들어 있다고 하자. 둘 다 name이라는 프로퍼티를 가지고 있고 Animal에는 species(종)이라는 프로퍼티를 추가로 가지고 있고 Person은 salary라는 프로퍼티를 가지고 있다. Animal에 스텍의 top에 들어 있고 Person은 그 바로 아래에 들어 있다. 사용예와 아래와 같다.

species    // animal.getSpecies()를 호출한 결과
salary     // person.getSalary()를 호출한 결과
name       // animal.getName() 을 호출한 결과(animal이 루트이기 때문에)

Person의 name을 취득하고 싶다면 아래와 같이 인덱스를 사용한다.

[0].name   // animal.getName()
[1].name   // person.getName()

스텍을 잘라서 사용하고 싶다면
ognl expressiondescription
[0].topwould get the top of the stack cut starting from element 0 in the stack (similar to top in this case)
[1].topwould get the top of the stack cut starting from element 1 in the stack

스테이틱 참조
struts.ognl.allowStaticMethodAccess 를 true로 서정해야 사용가능하다.
@some.package.ClassName@FOO_PROPERTY
@some.package.ClassName@someMethod()
풀 클래스명이 너무 길기 때문에

@vs@FOO_PROPERTY
@vs@someMethod()

@vs1@FOO_PROPERTY
@vs1@someMethod()

@vs2@BAR_PROPERTY
@vs2@someOtherMethod()

와 같이 약식으로 사용가능하다. vs는 벨류 스텍을 의미한다. vs: 톱, vs1두번째, vs3:세번째...

스트럿츠 2에서는 기본으로 벨류스텍에 저장해 주는 네임드 객체들이 있다.
namevalue
#parameters['foo'] or #parameters.foorequest parameter ['foo'] (request.getParameter())
#request['foo'] or #request.foorequest attribute ['foo'] (request.getAttribute())
#session['foo'] or #session.foosession attribute 'foo'
#application['foo'] or #application.fooServletContext attributes 'foo'
#attr['foo'] or #attr.fooAccess to PageContext if available, otherwise searches request/session/application respectively

참고 : http://struts.apache.org/2.x/docs/ognl-basics.html

2009년 3월 작성
허 련호(airless at funit.net)
Comments