1. OGNL 등장의 의의
mvc에서는 데이터가 다양한 레벨을 오가며 흐른다는 점은 부인할 수 없는 사실입니다. 그리고 이러한 종류의 순환도 몇 가지 어려움에 직면하게 됩니다. 이러한 어려움은 다양한 세계에서 데이터가 다르게 표현되기 때문에 발생합니다.
a. 데이터 유형이 어떻든 간에 데이터는 페이지에 평평하게 표시됩니다. 데이터 구조가 복잡하거나 데이터 유형이 얼마나 풍부한지는 표시할 때 모두 동일하게 취급되어 문자열이 되어 페이지에 표시됩니다.
b. Java 세계에서는 데이터를 풍부한 데이터 구조와 데이터 유형으로 표현할 수 있으며, 원하는 클래스를 정의하고 클래스 간에 상속할 수 있습니다. 우리는 일반적으로 이 모델을 복잡한 개체 트리라고 부릅니다. 이때 페이지와 Java 세계 간에 데이터가 전송되면 일치하지 않는 것으로 나타납니다. 따라서 이는 해결해야 할 몇 가지 문제로 이어집니다.
c. 데이터가 뷰 계층에서 컨트롤러 계층으로 전달될 때 특정 규칙에 따라 단순하고 분산된 데이터 수집을 설정할 수 있는지 확인해야 합니다. Java 세계의 객체 트리로 이동합니다. 동시에 문자열 유형을 Java의 다양한 유형으로 지능적으로 변환할 수 있습니다.
d. 데이터가 Controller 계층에서 View 계층으로 전달될 때 View 계층이 특정 단순 유형을 사용할 수 있는지 확인해야 합니다. 규칙 개체 트리에 액세스합니다. 동시에 개체 트리의 데이터 표시 형식은 어느 정도 제어됩니다.
이 문제를 좀 더 깊이 생각해 보면, 다양한 표현 형태로 인한 데이터 흐름 불일치 문제를 해결하는 것이 사실 우리에게 낯설지 않다는 것을 알게 됩니다. Java 세계와 데이터베이스 세계에서도 동일한 문제가 발생합니다. 객체 모델과 관계형 모델 간의 불일치에 직면하여 우리가 채택한 솔루션은 Hibernate, iBatis 등과 같은 ORM 프레임워크를 사용하는 것입니다. 이제 웹 계층에서도 불일치가 발생하므로 문제를 해결하는 데 도움이 되는 몇 가지 도구를 사용해야 합니다. 데이터가 View 계층에서 Controller 계층으로 전달될 때 불일치를 해결하기 위해 Struts2는 XWork의 완벽한 솔루션을 채택합니다. 그리고 이를 바탕으로 데이터 흐름의 불일치를 완벽하게 해결할 수 있는 완벽한 메커니즘이 구축되었습니다. OGNL 솔루션 탄생
2. OGNL 프로젝트 실전
OGNL은 Object-Graph Navigation Language의 약자로 간단하고 일관된 표현식 구문을 사용하는 강력한 표현 언어입니다. 를 사용하면 객체의 모든 속성에 액세스하고, 객체의 메서드를 호출하고,
전체 객체의 구조 다이어그램을 탐색하고, 필드 유형 변환과 같은 기능을 구현할 수 있습니다.
a. OGNL을 사용하면 매우 간단한 표현식으로 객체 레이어에 액세스할 수 있습니다. [OGNL은 맵에 대한 키 값 검색을 지원합니다.]
예를 들어 사용자 속성이 목록인 경우
예를 들어 사용자 속성은 맵입니다.
**/
프로젝션은 관계형 데이터베이스의 필드 작업과 유사하게 세트에 있는 각 요소의 동일한 속성을 선택하여 새로운 세트를 형성하는 것입니다. 프로젝션 작업 구문은 collection.{XXX}입니다. 여기서 XXX는 이 컬렉션에 있는 각 요소의 공용 속성입니다.
**/
? 조건을 만족하는 모든 요소를 선택합니다
^ 조건을 만족하는 첫 번째 요소를 선택합니다
$ 조건을 만족하는 마지막 요소를 선택합니다
/**group.userList.{? #txxx.xxx != null}은 그룹에서 이름이 비어 있지 않은 사용자 목록을 가져옵니다.
**/
i. OGNL은 일반적으로 Struts 2 기호와 함께 사용되며 주로 #, % 및 $ 세 기호를 사용합니다. 사용 방법은 다음과 같습니다.
/**OGNL 컨텍스트 및 Action 컨텍스트에 액세스합니다. #ActionContext.getContext()와 동일합니다. 다음 표에는 ActionContext에 몇 가지 유용한 속성이 있습니다.
parameters 현재 HTTP 요청 매개변수를 포함하는 Map #parameters.id[0]는 request.getParameterValues("id").get(0);
현재 HttpServletRequest의 속성을 포함하는 request Map #request와 동일합니다. .userName은 현재 HttpSession 속성의 맵을 포함하는 request.getAttribute("userName")session과 동일합니다. #session.userName은 다음을 포함하는 session.getAttribute("userName") 애플리케이션의 맵과 동일합니다. 현재 적용된 ServletContext의 속성입니다. #application.userName은 application.getAttribute("userName")
attr은 요청 > 애플리케이션 순서 #attr에서 해당 속성(속성)에 액세스하는 데 사용됩니다. userName은 위의 세 가지와 동일합니다.
는 책과 같은
컬렉션을 필터링하고 프로젝션하는 데 사용됩니다.{?#this.price<100}; 🎜> # {'foo1':'bar1', 'foo2':'bar2'}와 같은 맵을 구성합니다.
%" 기호는 플래그의 속성이 문자열 유형인 경우 OGNL 표현식을 평가하는 데 사용됩니다.
"$"에는 국제화에 사용되는 두 가지 주요 용도가 있습니다. 리소스 파일에서 참조 Struts 2 및 i18n에서 구성 파일
/**