:OGNL&ValueStack 입문

더 읽 기
전송 주소:http://www.iteye.com/topic/223612
일례
아래 의 수 요 를 보십시오.다음 과 같은 사용자 대상 모델 이 있다 고 가정 하 십시오.
자바 코드 
public interface User {  
    public String getName();  
    public Date getRegisterDate();  
    public Customer getCustomer();  
}  
public interface Customer {  
    public String getId();  
    public String getName();  
    public boolean isVip();  
}  
public interface EntCustomer extends Customer {  
    public String getTrustId(); //           
}  

주어진 사용자 jack 에 대해 이 사용자 가 속 한 고객 은 기업 고객 입 니 다.그러면 우 리 는 어떻게 이 사용자 의 이름 을 얻 습 니까?어떻게 사용자 가 속 한 고객 의 이름 을 가 져 옵 니까?어떻게 이 사용자 가 속 한 고객 이 VIP 고객 인지 아 닌 지 를 판단 합 니까?어떻게 jack 소속 기업 의 조직 기구 코드 번 호 를 찾 습 니까?
*자바 코드 를 사용 하면 다음 과 같은 API 로 필요 한 정 보 를 호출 할 수 있 습 니 다.
자바 코드 
jack.getName();  
jack.getCustomer().getName();  
jack.getCustomer().isVip();  
((EntCustomer)jack.getCustomer()).getTrustId();  

*그러나 우 리 는 지금 OGNL 에 대해 이야기 하고 있 기 때문에 OGNL 을 사용 하면 다음 과 같은 방식 으로 우리 가 필요 로 하 는 정 보 를 얻 을 수 있 습 니 다.
자바 코드 
jack.name  
jack.customer.name  
jack.vip  
jack.customer.trustId  

이 를 통 해 OGNL 의 표현 방식 과 자바 의 표현 방식 은 다음 과 같은 몇 가지 차이 가 있 음 을 알 수 있다.
**대상 유형 에 관심 을 가 질 필요 가 없고 유형 전환 이 필요 하지 않 습 니 다.
**표현 방식 이 더 짧 고 직관 적
OGNL 표현 식 의 가장 큰 장점 은*간단*과*직관*입 니 다.그렇게 생각 하지 않 습 니까?만약 당신 이 위의 표현 식 이 아직 간단 하고 직관 적 이지 않다 고 생각한다 면,우 리 는 다시 보 겠 습 니 다.
자바 코드 
name 
이것 도 OGNL 표현 식 입 니 다.즉,이름 을 짓 는 것 입 니 다!쉬 워 요?적어도 직관 은 충분 하 겠 지:)
기본 개념
우 리 는 앞에서 OGNL 의 가장 간단 한 예 를 보 았 다.사실 OGNL 은 매우 간단 하 다.만약 에 위의 그 예 의 용법 을 이해 할 수 있다 면 우 리 는 OGNL 의 80%의 용법 을 파악 할 수 있 을 것 이다.
위의 예 는 간단 하지만 OGNL 의 두 가지 가장 기본 적 인 개념 을 포함 하고 있 습 니 다.*표현 식(expression)*과*문맥(context)*,우 리 는 먼저*표현 식*을 봅 니 다.
표현 식
OGNL 은 표현 식!그것 은 우리 로 하여 금 위의 예 와 같이 간결 하고 직관 적 인 문법 으로 우리 의 생각 을 표현 하 게 할 수 있다.간결 하고 직관 적 인 것 이 표현 식 의 가장 큰 장점 입 니 다!표현 식 은 항상 하나의 결과 가 있다 는 것 을 알 고 있 습 니 다.즉,표현 식 은 항상 하나의 결 과 를 구 합 니 다.이 결 과 는 문자열(예 를 들 어 이름,조직 기구 코드 번호 등)이나 불 값(예 를 들 어 VIP 고객 여부 등)일 수 있 습 니 다.이 결 과 를 어떻게 사용 해 야 하 는 지 에 대해 서 는 우리 가 결정 하 는 것 입 니 다.
h3.상하 문(context)
표현 식 의 개념 은 이해 하기 쉽다 고 믿 지만 문맥(context)이 무엇 입 니까?쉽게 말 하면 문맥 은 환경 이 고 표현 식 의 값 을 구 하 는 환경 입 니 다!아직도 이해 가 안 돼 요?우 리 는 예 를 하나 보 자.
아니면 위의 마지막 예:
자바 코드 
name 
세심 한 당신 은 이 표현 식 에서 누구의 이름 을 가 져 가 야 하 는 지 물 어 볼 수 있 습 니까?오케이,좋아!이것 이 바로 환경 이다.'누구'는 환경 속 에 존재 한다.즉,문맥 속 에 존재 한다.서로 다른 환경/상하 문 에 대해 같은 표현 식 은 서로 다른 결 과 를 얻 을 수 있 습 니 다!환경/문맥 의 실질 은 무엇 일 까?이름 이 있 는 대상 집합 입 니 다.
인용 하 다.
사고:환경 이나 문맥 이라는 개념 을 표현 하 는 가장 좋 은 데이터 구 조 는 무엇 입 니까?
h3.OGNL 상하 문 개념 상세 설명
앞에서 말 했 듯 이 문맥 은 하나의 이름-대상 이 맞 는 집합 입 니 다.아래 그림 에서 보 듯 이 간단 한 문맥 입 니 다.
자바 코드 
user ---> User(name:"jack", ...) 
request ---> HttpServletRequest(header: ...) 
그러면 위의 환경 에서 우 리 는 다음 과 같은 OGNL 표현 식 을 사용 할 수 있 습 니 다.
자바 코드 
#user.name //         
#user.age //        
#user.birthday //        
#user.customer.name //             
#request.parameters //        

위 표현 식 의'\#user'와'\#request'의 용법 을 주의 하 십시오.'\#'은 환경/문맥 에 접근 하 는 대상 을 표시 합 니 다.
이 제 는 환경 속 의 대상 을 편리 하 게 방문 할 수 있 습 니 다.그렇다면 게 으 르 면(기억 하 세 요:프로그래머 집단 에서 게 으 름 은 좋 은 뜻 입 니 다!)사용자 의 이름,나이,생일 등 다른 속성 을 모두 사용 하려 면'\#user'를 사용 하 는 것 이 너무 번 거 롭 지 않 습 니까?OK.ONGL 의 디자이너 는 이 문 제 를 고려 했 습 니 다.저 희 는 user 를 환경 속 의 특권 대상 으로 지정 할 수 있 습 니 다.이 대상 을 방문 할 때\#user 의 방식 을 사용 하지 않 아 도 됩 니 다.다음 과 같은 코드 와 위의 완전 등가 입 니 다.물론 전 제 는 user 를 특권 대상 으로 미리 지정 하 는 것 입 니 다.
자바 코드 
name //         
age //        
birthday //        
customer.name //             
#request.parameters //        

우리 가 위 에서 말 한'특권 대상'은 OGNL 에서'루트 대상'(root)이 라 고 부른다.
소결
다시 말하자면 OGNL 표현 식 을 이해 하 는 관건 은 문맥 의 개념 을 이해 하 는 것 이다.OGNL 의 문맥 개념 에'뿌리 대상'이라는 개념 이 도입 되 었 기 때문에 초보 자 들 은 여기 서 방향 을 잃 는 경우 가 많다.
인용 하 다.
OGNL 의 중국 어 는 모두 대상 그림 내 비게 이 션 언어 라 고 한다.즉,OGNL 은 하나의 언어 로 자바 가 하나의 언어 인 것 과 같다.당신 은 OGNL 의 작가 가 너무 과장 되 었 다 고 생각 하고 감히 표현 식 을 언어 라 고 거짓말 할 수 있 습 니까?아니오,OGNL 의 문법 은 확실히 매우 간결 합 니 다.OGNL 의 코드(표현 식 을 말 하지 않 았 습 니 다.코드 는 문법 과 일치 하 는 단어 이기 때문에)는 줄 을 바 꾸 지 않 습 니 다.이것 은 우리 가 OGNL 의 코드 를 길 게 쓸 수 없다 는 것 을 의미 합 니 다.그러나 이것 은 OGNL 의 표 현 력 이 약 하 다 는 것 을 의미 하지 않 습 니 다.사실 OGNL 의 문법 디자인 은 매우 간결 하지만 그 기능 은 상당히 강하 다.관심 이 있다 면 OGNL 참고 수첩 의 집합 과 lambda 장 을 깊이 읽 을 수 있다.
가만,일이 아직 이렇게 끝나 지 않 았 어!struts 2 는 OGNL 의 문맥 개념 에 대해 새로운 의 미 를 정의 하고 내 가 천천히 말 하 는 것 을 들 어 라!
h3.struts 2 의 OGNL 컨 텍스트
struts 2 는 OGNL 컨 텍스트 의 개념 을 한층 더 확대 했다.struts 2 에서 OGNL 컨 텍스트 는 보통 다음 과 같다.
자바 코드 
|  
                     |--request  
                     |  
                     |--application  
                     |  
       context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]  
                     |  
                     |--session  
                     |  
                     |--attr  
                     |  
                     |--parameters  

"\#requet"를 사용 하여 HttpServletRequest 대상 을 방문 할 수 있 습 니 다."\#session"은 HttpSession 대상 을 방문 할 수 있 지만,"루트 대상"이 무엇 인지 주의 하 십시오.ValueStack 입 니 다!
그럼 ValueStack 은 뭐 예요?창고.대상 의 스 택 입 니 다.즉,struts 2 에서 뿌리 대상 은 우리 의 일반적인 대상 이 아니 라 한 조 의 대상 이다.우 리 는 새로운 대상 을 값 스 택 에 푸 시 할 수도 있 고 값 스 택 의 스 택 꼭대기 대상 을 팝 업 할 수도 있 습 니 다.위의 그림 에서 보 듯 이 user 대상 push 를 값 스 택 에 넣는다 고 가정 하면 다음 표현 식 은 이전에 우리 가 본 표현 식 과 똑 같은 결 과 를 가 집 니 다.
자바 코드 
name //         
age //        
birthday //        
customer.name //             
#request.parameters //        

즉,우리 가 name 이라는 표현 식 을 사용 할 때 ONGL 은"루트 대상"의 name 속성 을 가 져 오지 만,현재 루트 대상 은 ValueStack 입 니 다!그러면 ValueStack 을 방문 하 는 name 속성 은 무엇 을 의미 합 니까?이 는 ValueStack 은 스 택 꼭대기 요소 에 name 속성 이 있 는 지 확인 하고 있 으 면 이 속성 값 을 되 돌려 줍 니 다.그렇지 않 으 면 스 택 꼭대기 에 있 는 요 소 를 꺼 내 스 택 밑 에 있 을 때 까지 계속 확인 합 니 다.
이상 이 OGNL 표현 식 의 핵심 개념 입 니 다.이해 하 셨 습 니까?다음 단 계 는 더 강력 한 기능 을 발굴 하기 위해 OGNL 의 문법 을 더 알 아야 합 니 다!

좋은 웹페이지 즐겨찾기