본문 바로가기

개발/Web

[Java] JSP - JSP 내장객체 / EL구문 (Expression Language)

< 값을 담을 수 있는 JSP 내장객체 >


1. ServletContext (application scope)

- 한 어플리케이션(웹사이트)당 단 1개 존재하는 객체
- 이 영역에 데이터를 담으면 어플리케이션 전역에서 사용 가능

=> 공유범위가 가장 큼

  
2. HttpSession (session scope)

- 한 브라우저당 1개 존재하는 객체
- 이 영역에 데이터를 담으면 jsp/servlet단에서 사용 가능
 - 값이 한 번 담기면 서버가 멈추거나, 브라우저가 닫히기 전까지는 사용 가능 (로그인 기능)
 => 공유범위가 다소 제한적
    

3. HttpSerlvetRequest (request scope)

- 요청 및 응답시에 매번 생성되는 객체
- 이 영역에 데이터를 담으면 해당 request객체를 포워딩받는 응답 jsp에서만 사용 가능(1회성)

=> 공유범위가 해당 요청에 대한 응답 jsp 단 하나뿐
   

4. PageContext (page scope)

- 현재 그 jsp페이지에서만 사용 가능
=> 공유범위가 가장 작음(해당 페이지에서만 쓰임)
    
=> 객체들에 값을 담을 때 .setAttribute("키", 밸류);
                     값을 뽑을 때 .setAttribute("키"); (Object 형태로)
                  지우고자 할 때 .removeAttribute("키");

 

 

< EL구문 (Expression Language) >

 

- 기존에 사용했던 표현식(출력식) <%= %>과 같이 JSP상에서 표현하고자 하는 값을

  ${ name }의 형식으로 표현해서 작성하는 것

- getXXXXX(getAttribute, getter메소드들)을 통해 값을 빼올 필요없이 키값만 제시하면 바로 값에 접근 가능

- 내부적으로 해당 Scope영역에 해당 키값에 해당하는 밸류값을 가져올 수 있음

- 기본적으로 EL은 JSP내장 객체 종류 (4가지)를 구분하지 않고 

  자동적으로 모든 내장객체에서 키값을 검색해서 존재하는 경우 값을 가져옴

- 객체의 필드에 담긴 값을 출력하고자 한다면 키값.필드명으로 접근

  (내부적으로 getter메소드를 찾아서 호출을 해서 값을 가져오는 구조)
- EL 구문은 공유범위가 가장 작은 Scope에서부터 해당 키값을 검색함
  (page → request → session → application 순으로 키값을 찾음)
- 모든 영역에서 해당 키에 대한 값을 못찾았을 경우, 아무것도 출력하지 않음

- 직접 Scope영역을 지정해서 접근 권장

 

 

< EL 연산 >

 

// request.setAttribute("big", 10);
// request.setAttribute("small", 3);

 

1. 산술 연산

10 + 3 = ${ big + small } 
10 - 3 = ${ big - small } 
10 * 3 = ${ big * small }
10 / 3 = ${ big / small } 또는 ${ big div small }
10 % 3 = ${ big % small } 또는 ${ big mod small }

 

2. 숫자간 대소 비교 연산

10 > 3 : ${ big > small } 또는 ${ big gt small }
10 < 3 : ${ big < small } 또는 ${ big lt small }
10 >= 3 : ${ big >= small } 또는 ${ big ge small }
10 <= 3 : ${ big <= small } 또는 ${ big le small }

 

3. 동등 비교 연산

10과 3이 일치합니까? : ${ big == small } 또는 ${ big eq small }
big에 담긴 값과 10이 일치합니까? : ${ big == 10 } 또는 ${ big eq 10 }
sOne과 sTwo가 일치합니까? : ${ sOne == sTwo } 또는 ${ sOne eq sTwo } 
<!-- EL에서의 문자열의 == 비교는 자바에서의 equals() 메소드와 같은 동작을 함 (내용물 비교) -->
sOne과 sTwo가 일치하지 않습니까? : ${ sOne != sTwo } 또는 ${ sOne ne sTwo }
<!-- ne : not equals -->
sOne에 담긴 값과 "안녕"이 일치합니까? : ${ sOne == '안녕' } 또는 ${ sOne eq "안녕" }
<!-- EL에서의 문자열 리터럴 제시 시 홑따옴표 / 쌍따옴표 상관 없음 -->

 

4. 객체가 null인지 또는 리스트가 비어있는지 체크하는 연산

* 기존 방식

- 객체가 null인지 알고싶을 경우 객체명 == null로 비교 : true 또는 false
- 리스트가 비어있는지 알고싶은 경우 리스트명.isEmpty() : true 또는 false (혹은 리스트명.size() == 0)

 

* EL 연산

객체가 null인지 알고싶을 경우 : ${ empty pTwo } 또는 ${ pTwo == null } 또는 ${ pTwo eq null } 
객체가 null이 아닌지 알고싶을 경우 : ${ !empty pOne } 또는 ${ pOne != null } 또는 ${ pOne ne null }
리스트가 비어있는지 알고싶은 경우 : ${ empty lOne }

 

5. 논리연산자

* 기존 방식

&&(AND), ||(OR)

 

* EL연산

AND 연산 : ${ true and true }
OR 연산 : ${ true or false }