Struts2 강좌 - 2. Struts2 태그라이브러리 사용방법 (OGNL 과 기본지식)
Software Development/Frameworks 2009. 8. 16. 23:411. Action, Interceptor, ValueStack 과 Struts Tag 와의 관계
Tag 의 Value 에 들어가는 문자열은, 무조건 객체를 지칭하는 표현식이다 그냥 value="abc" 하면, ValueStack 의 루트객체(액션컨텍스트)의 getAbc() 가 Call 된다.!
%{} 표현식
<s:textfield label="%{getText('label.postalCode')}" name="postalCode"/> 처럼 %{함수} 를 통하여, Action 의 함수를 직접 Call 할 수 있다.
getText() 는, ActionSupport 를 상속받으면 쓸 수 있으며, Resource Bundle 에서 문자열을 가져오는 기능을 한다.
2. 태그의 Value 속성은 객체다
<s:textfield name="city" value="SEOUL"/> 되어 있으면, "SEOUL" 이라는 문자열이 값이 되는게 아니고, OGNL 로 인식하여, Action 의 getSeoul() 이라는 함수로 프로퍼티를 가져오려 한다.
문자열로 쓰려면, <s:textfield name="city" value="%{'SEOUL'}"/> 과 같이 써야 한다. 아니면 value="'SEOUL'" 로 쓸수도 있으나, 앞의 방법을 따르라~
모든 value="" 안의 값은 기본적으로 Struts2 에서는 OGNL 로 인식하므로, <s:if test="age > 19"/>...</s:if> 처럼 사용하면 된다. 위의 경우에는, <s:if test="%{age > 19}"/>...</s:if> 도, boolean 식으로 표현해도 똑같아 진다.
3. 표현식 언어의 표기법
JSTL 표준
표준 Request Context 에 저장된 자바 빈 객체 참조 법
<p>사용자 이름: ${user.username}</p>
ValueStack 에 저장된 프로퍼티 참조법
<s:textfield name="username"/>
ValueStack 에 저장된 프로퍼티 참조법 2
<s:url id="ko" action="hello">
Tag 의 Value 에 들어가는 문자열은, 무조건 객체를 지칭하는 표현식이다 그냥 value="abc" 하면, ValueStack 의 루트객체(액션컨텍스트)의 getAbc() 가 Call 된다.!
%{} 표현식
<s:textfield label="%{getText('label.postalCode')}" name="postalCode"/> 처럼 %{함수} 를 통하여, Action 의 함수를 직접 Call 할 수 있다.
getText() 는, ActionSupport 를 상속받으면 쓸 수 있으며, Resource Bundle 에서 문자열을 가져오는 기능을 한다.
2. 태그의 Value 속성은 객체다
<s:textfield name="city" value="SEOUL"/> 되어 있으면, "SEOUL" 이라는 문자열이 값이 되는게 아니고, OGNL 로 인식하여, Action 의 getSeoul() 이라는 함수로 프로퍼티를 가져오려 한다.
문자열로 쓰려면, <s:textfield name="city" value="%{'SEOUL'}"/> 과 같이 써야 한다. 아니면 value="'SEOUL'" 로 쓸수도 있으나, 앞의 방법을 따르라~
모든 value="" 안의 값은 기본적으로 Struts2 에서는 OGNL 로 인식하므로, <s:if test="age > 19"/>...</s:if> 처럼 사용하면 된다. 위의 경우에는, <s:if test="%{age > 19}"/>...</s:if> 도, boolean 식으로 표현해도 똑같아 진다.
3. 표현식 언어의 표기법
JSTL 표준
표준 Request Context 에 저장된 자바 빈 객체 참조 법
<p>사용자 이름: ${user.username}</p>
ValueStack 에 저장된 프로퍼티 참조법
<s:textfield name="username"/>
ValueStack 에 저장된 프로퍼티 참조법 2
<s:url id="ko" action="hello">
<s:param name="request_locale">ko</s:param>
</s:url>
<s: a href="%{ko}">Korea</s:a>
Session 컨텍스트에 있는 프로퍼티 참조법
<s:property value="#session.user.username" />
정적인 Map 을 사용하는 방법
<s:select name="checkedName" list="#{'username' : '이름1', 'username' : '이름2'}"/>
4. OGNL 기본
OGNL 은, 컨텍스트를 Map 형태로 관리한다. Map 에는
- application
- session
- value stack (루트)
- request
- parameters
- attr (page -> request -> session -> application 순으로 검색)
의 컨텍스트들이 존재하며, 루트를 제외한 다른 컨텍스트는, #컨텍스트키.프로퍼티 방법으로 접근하고, 루트 컨텍스트(Value Stack 에 있는 Bean)의 프로퍼티는 #없이, 프로퍼티 이름으로만 접근한다.
액션은 Value Stack 에 저장되므로, Action 의 abc 라는 프로퍼티는
<s:property value="abc"/>
로 가져올 수 있고,
세션컨텍스트에 username 이라는 프로퍼티는,
<s:property value="#session.username"/> 으로 가져올 수 있다.
<s:property value="#session['myKey']"/>
<s:property value="#request['myKey']"/>
와 같이 쓸 수 있다는 말이다.
[Action 클래스에서 컨텍스트 가져오기]
Action 클래스에서는 ActionContext.getContext().getSession().put("myKey", myObject);
와 같이 Context 를 접근할 수 있다.
5. OGNL 사용 예
myObject 가 루트 객체로 설정되어있다고 가정할 때,
#myObject.property : myObject.getProperty() 호출됨
#yourObject.property : youtObject.getProperty() 호출됨
property : myObject.getProperty() 호출됨
[Value Stack 의 상황에 따른 접근]
현재 Value Stack 에 다음과 같은구조로 객체가 들어가 있을 때
animal (name, species) <-- stack 의 top [0]
person (name, salary)
아래와 같이 접근할 수 있다.
species --> animal.getSpecies() 호출
salary --> person.getSalary() 호출
name --> animal.getName() 호출
만약, stack 의 특정 번째 top 의 객체의 프로퍼티 가져오려면,
0.name : animal.name() 호출
1.name : person.name() 호출
과 같이 한다.
[static 프로퍼티 / 메소드 참조]
OGNL 은 static 프로퍼티와 메소드를 호출하는 방법을 제공한다.
@example.ClassName@myStaticProperty
@example.ClassName@myStaticMethod()
와 같이 사용한다.
[파라미터, 요청(request), 세션, 어플리케이션 컨텍스트 참조 방법]
#parameters['key'] 또는 #parameters.key
request.getParameter("key") 호출
#request['key'] 또는 #request.key
request.getAttribute("key") 호출
#session['key'] 또는 #session.key
session.getAttribute("key") 호출
#application['key'] 또는 #application.key
key 값으로 저장된 ServletContext 의 속성값 참조
#attr['key'] 또는 #attr.key
Page, Request, Session, Application 순으로 속성 값 검색하여 일치하는 키 값 출력
<s: a href="%{ko}">Korea</s:a>
Session 컨텍스트에 있는 프로퍼티 참조법
<s:property value="#session.user.username" />
정적인 Map 을 사용하는 방법
<s:select name="checkedName" list="#{'username' : '이름1', 'username' : '이름2'}"/>
4. OGNL 기본
OGNL 은, 컨텍스트를 Map 형태로 관리한다. Map 에는
- application
- session
- value stack (루트)
- request
- parameters
- attr (page -> request -> session -> application 순으로 검색)
의 컨텍스트들이 존재하며, 루트를 제외한 다른 컨텍스트는, #컨텍스트키.프로퍼티 방법으로 접근하고, 루트 컨텍스트(Value Stack 에 있는 Bean)의 프로퍼티는 #없이, 프로퍼티 이름으로만 접근한다.
액션은 Value Stack 에 저장되므로, Action 의 abc 라는 프로퍼티는
<s:property value="abc"/>
로 가져올 수 있고,
세션컨텍스트에 username 이라는 프로퍼티는,
<s:property value="#session.username"/> 으로 가져올 수 있다.
<s:property value="#session['myKey']"/>
<s:property value="#request['myKey']"/>
와 같이 쓸 수 있다는 말이다.
[Action 클래스에서 컨텍스트 가져오기]
Action 클래스에서는 ActionContext.getContext().getSession().put("myKey", myObject);
와 같이 Context 를 접근할 수 있다.
5. OGNL 사용 예
myObject 가 루트 객체로 설정되어있다고 가정할 때,
#myObject.property : myObject.getProperty() 호출됨
#yourObject.property : youtObject.getProperty() 호출됨
property : myObject.getProperty() 호출됨
[Value Stack 의 상황에 따른 접근]
현재 Value Stack 에 다음과 같은구조로 객체가 들어가 있을 때
animal (name, species) <-- stack 의 top [0]
person (name, salary)
아래와 같이 접근할 수 있다.
species --> animal.getSpecies() 호출
salary --> person.getSalary() 호출
name --> animal.getName() 호출
만약, stack 의 특정 번째 top 의 객체의 프로퍼티 가져오려면,
0.name : animal.name() 호출
1.name : person.name() 호출
과 같이 한다.
[static 프로퍼티 / 메소드 참조]
OGNL 은 static 프로퍼티와 메소드를 호출하는 방법을 제공한다.
@example.ClassName@myStaticProperty
@example.ClassName@myStaticMethod()
와 같이 사용한다.
[파라미터, 요청(request), 세션, 어플리케이션 컨텍스트 참조 방법]
#parameters['key'] 또는 #parameters.key
request.getParameter("key") 호출
#request['key'] 또는 #request.key
request.getAttribute("key") 호출
#session['key'] 또는 #session.key
session.getAttribute("key") 호출
#application['key'] 또는 #application.key
key 값으로 저장된 ServletContext 의 속성값 참조
#attr['key'] 또는 #attr.key
Page, Request, Session, Application 순으로 속성 값 검색하여 일치하는 키 값 출력
반응형
'Software Development > Frameworks' 카테고리의 다른 글
Struts2 강좌 - 1. Struts2 개념 잡기 (0) | 2009.08.13 |
---|---|
AppFuse 설치 중 equinox 어쩌고 에러 날 때 (0) | 2009.08.07 |