Struts2

Hagi 2010. 2. 4. 11:23

1.  OGNL을 다루기 위한 최상위 객체로 맵을 사용(컨텍스트 맵 또는 컨텍스트라 부름)

 

2. OGNL은 컨텍스트 안에 루트 객체를 갖음

 

3. 컨텍스트의 다른 객체를 참조할 때 '#' 기호를 사용

 

4. 컨텍스트맵 ( application, seesion, value stack, request, parameters, attr)

    Struts2는 액션 컨텍스트를 OGNL 컨텍스트가 되도록 설정하고, value stack을 OGNL 루트 객체가 되도록 설정한다. 밸류 스택은 여러 객체의 집합이지만 OGNL 루트 객체는 단일 객체를 사용하는 차이점이 있다. OGNL 컨텍스트에는 밸류 스택 외에도 다른 객체를 저장한다.

* 액션은 항상 밸류 스택에 저장된다. 밸류 스택은 루트 객체이고, 액션은 밸류 스택 상에 있기 때문에 액션의 프로퍼티는 '#' 기호 없이 참조할 수 있다. 그러나 액션 컨텍스트 상의 다른 객체를 참조하려면 '#' 기호를 반드시 사용해야 한다.

예) <s:property value="#session.myKey" /> 또는 <s:property value="#session['myKey']" />

     => 액션에서 저장시 : ActionContext.getContext().getSession().put("myKey", myObject);

     <s:property value-="postalCode" />

 

5. Collections 객체를 사용할 때 OGNL의 표현식

 ㄱ. {e1,e2,e3} 형식 : <s:select name="name" list={'name1','name2','name3'}" value="%{'name2'}" />     리스트

 ㄴ. #{key1:value1, key2:value2} 형식 : <s:select name='name' list="#{'key1':'value1', 'key2':'value2'}" /> 맵

 ㄷ. 컬렉션에 하나의 요소의 존재 여부를 결정하는 법

     <s:if test="'name1' in {'name1','name2'}">

name1이 컬렉션 안에 존재합니다.

     </s:if>

     <s:else>

name1이 컬렉션 안에 존재하지 않습니다.

     </s:else>

        * not in 도 가능

  ㄹ.  컬렉션에 하나의 요소의 존재 여부를 결정하는 방법

     ? : 선택 조건과 일치하는 모든 요소

     ^ : 선택 조건과 일치하는 요소 중 첫 번째 요소

     $ : 선택 조건과 일치하는 요소 중 마지막 요소

      예) person.relatives.{? #this.gender == 'female'}  

 

 

 

 참고 : p101 ~p105, 스트러츠2 프로그래밍, 에이콘