● OGNL(Object Graph Navigation Language)
: 스트럿츠2에서는 OGNL 표현식을 사용하여 밸류스택에 저장된 여러 액션 객체의 정보를 얻어온다. 밸류 스택은 XWork와 스트럿츠 2의 동적 컨텍스트 기반의 핵심 부분으로, 쉽게 말해서 객체의 스택이라 생각하면 된다.
스트럿츠2에서는 액션이 실행될 때마다 액션을 스택 상에 저장하여 밸류스택이 구축된다. 액션이 실행되는 동안 밸류 스택에 쌓인 여러 개의 액션 객체의 정보를 스트럿츠 2의 태그 라이브러리는 OGNL 표현식으로 얻어온다.
아이디: <input type="text" name="userID" value="${userID}"/>
<s:textfield label="아이디" name="userID" value="%{userID}"/>
--> 스트럿츠 2에서는 "%{...}" 내에 기술된 니용을 OGNL 표현식으로 평가한다.
[Login.java]
public class Login extends ActionSupport
{
private String userID;
public String setUserID(String userID)
{
this.userID = userID;
}
public String getUserID()
{
return userID;
}
}
[Login2.jsp]
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:textfield label="아이디" name="userID" value="%{userID}"/>
--> 아이디를 입력하고 submit 버튼을 클릭하면 파라미터 인터셉터에 의해서 <s:textfield />의 name 속성값과 일치되는 프로퍼티를 찾아서 입력한 값을 세팅한다. 이때 setter인 setUserID() 메서드가 호출된다. 입력된 아이디 값이 밸류 스택의 Login 액션 객체의 userID에 저장된다.
--> "%{userID}" 은 OGNL 표현식으로 평가된다. "%{}" 안에 기술된 userID는 빈의 프로퍼티로 인식하여 이름이 userID인 프로퍼티를 밸류스택에서 찾아온다. "%{...}" 내의 userID란 표현식은 이름이 userID인 프로퍼티의 getter 메서드인 getUserID() 메서드를 찾아서 호출한다.
<s:textfield label="아이디" name="userID" value="siksco"/>
--> 스트럿츠 2 태그의 name 속성은 액션의 어떤 프로퍼티와 매핑하는지를 말한다. 또한 태그의 value 속성은 name 속성에 지정한 액션의 프로퍼티와 동일한 타임으로 자동적으로 설정된다 그러므로 태그의 value 속성은 문자열이 아닌 객체로 인식한다.
만일 텍스트 상자에 초기값으로 siksco가 출력되도록 하기위해 위와 같이 표현할경우, 기본적으로 OGNL 표현식으로 평가되기 때문에 getSiksco() 메서드로 프로퍼티를 찾으려 하기에 원하는 결과를 얻지 못한다.
<s:textfield label="아이디" name="userID" value="%{"siksco"}"/>
--> 만일 표현식 내에서 문자열로 인식하도록 하려면 다음과 같이 단일 따옴표로 묶어야 한다.
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="username"/>
<s:property value="message"/>
--> OGNL 표현식은 <s:property/> 태그에서도 사용된다. <s:property /> 태그는 스트럿츠 내부에서 사용한 밸류스택에 저장된 액션 객체의 프로퍼티를 OGNL을 이용하여 값을 얻어온다. OGNL은 빈의 프로퍼티를 프로퍼티 이름으로 액세스한다. 예를 들어 value속성 값에 사용한 username이란 표현식은 이름이 username인 프로퍼티의 getter 메서드인 getUsername() 메서드를 찾아서 호출한다.