본문 바로가기

카테고리 없음

JSP_3. JSP 내장객체 종류와 EL(Expression Language)

 

▶ JSP 내장객체

▶ JSP를 이루는 구성인자

▶ EL(Expression Language)

 


▶ JSP 내장객체

1. ServletContext (application scope)
    한 애플리케이션당 1개만 존재하는 객체
    이 영역에 데이터를 담으면 애플리케이션 전역에서 사용가능
    => 공유범위가 가장 크다
				
2. HttpSession(session scope)
    한 브라우저당 1개만 존재하는 객체
    이 영역에 데이터를 담으면 jsp/ervlet단 등 모두 사용가능
    값이 한번 담기면 서버가 멈추거나 브라우저가 종료되기 전까지 사용가능하다.
    => 공유범위가 제한적임
			
3. HttpServletRequest(request scope)
    요청 및 응답시 생성되는 객체
    이 영역에 데이터를 담으면 해당 request객체를 포워딩받는 응답 jsp에서 사용가능
    => 공유범위가 해당 요청에 대한 응답jsp까지 

4. PageContext(page scope)
    현재 jsp페이지에서만 사용가능
    => 공유범위가 가장 작음

  -> 위 객체들에 값을 담을때 setAttribute('키', 데이터)
                     꺼낼때 getAttribute('키')
                     지울때 removeAttribute('키')

 

// requestScope에 데이터 담기
request.setAttribute("classRoom", "C강의장");
request.setAttribute("student", new Person("홍길동", 27, "남자"));

// sessionScope에 담기
HttpSession session = request.getSession();
session.setAttribute("academy", "ABC정보교육원");
session.setAttribute("teacher", new Person("김갑수", 40, "남자"));

// 동일한 키값으로 데이터추가
request.setAttribute("scope", "request scope");
session.setAttribute("scope", "session scope");

// application scope에 담기
ServletContext application = request.getServletContext();
application.setAttribute("scope", "application");

request.getRequestDispatcher("views/1_EL/01_el.jsp").forward(request, response);

 

▶  JSP를 이루는 구성인자

1. JSP스크립팅원소 : JSP페이지에서 자바코드를 직접 기술할 수 있게 하는 기술
    ex) 스클립틀릿, 선언문, 표현식 등..

2. 지시어 : JSP페이지 정보에 대한 내용을 표현한다거나 다른 페이지를 포함할 때 사용
    ex) page지시어, include지시어, taglib지시어(라이브러리 추가시 사용)

3. JSP 액션태그 : XML기술을 이용해서 기존의 JSP문법을 확장하는 기술을 제공하는 태그
    - 표준액션태그(Standard Action Tag) : JSP페이지에서 바로 사용가능.
    - 커스텀액션태그(Custom Action Tag) : JSP에서 바로 사용불가능
                커스텀액션태그는 모든 태그명 안에 jsp:외의 다른 접두어가 붙는다.
                제공되고 있는 대표적인 라이브러리는(JSTL)

 

▶ EL(Expression Language)

- JSP 2.0버전에 추가됨
- 기존에 사용했던 표현식 <%= name %> 와 같이 
  jsp상에서 표현하고자 하는 값을 \${name}의 형식으로 표현해서 작성하는 것

 

1. EL 기본 구문에 대해 배우기

1. 기존 방식대로 스크립트릿과 표현식을 이용해서 각 영역에 담겨있는 값을 뽑아서 화면에 출력하기..
	
<%
    // request scope에 담긴 값을 뽑기
    String classRoom = (String)request.getAttribute("classRoom");

    // session scope에 담긴 값 뽑기
    String academy = (String)session.getAttribute("academy");
%>

학원명 : <%= academy %> 
강의장 : <%= classRoom %>

 

 

2. EL을 이용해서 쉽게 Scope에 담겨있는 값을 뽑아서 화면에 출력하기..
	
EL은 getAttribute("키")를 통해 값을 빼올 필요없이 "키"값만 제시하면 바로 접근가능하다. 
내부적으로 해당 scope영역에 키값의 밸류값을 가져올 수 있다.
기본적으로 EL은 JSP내장 객체를 구분하지 않고 모든 내장객체에 기값을 검색해서 존재하는 경우 값을 가져온다.


학원명 : ${academy} 
강의장 : ${classRoom } 
강사정보 : ${teacher.name }, ${teacher.age }, ${teacher.gender }


<!-- 
    teacher에 접근했을때의 밸류값은 Person객체임.
    Person객체의 각 필드에 담긴 값을 출력하고자 한다면
    객체명.필드명 으로 접근하면 됨.
-->

 

 

3. EL사용시 내장객체들이 동일한 키값을 사용하는 경우
	
scope 값 : ${scope } <br>

<!-- 
     ${scope }  =>  request scope

    EL은 공유범위가 제일 작은 Scope부터 키값을 검색한다.
    page -> request -> session -> application

    모든 영역에서 값을 찾지 못할 경우 아무것도 출력되지 않는다.
 -->

 

 

4. 직접 Scope영역을 지정해서 접근하기
<%
    // page scope에 데이터 담기
    pageContext.setAttribute("scope", "page");
%>

pageScope에 담긴 값 : ${scope} 또는 ${pageScope.scope} 
requestScope에 담긴 값 : ${requestScope.scope}
sessionScope에 담긴 값 : ${sessionScope.scope}
applicationScope에 담긴 값 : ${applicationScope.scope}

 

 

 

2. EL의 연산자에 대해 배우기

 

 

1. 산술연산

* 기존방식 
10 + 3 = <%= (int)request.getAttribute("big") + (int)request.getAttribute("small") %>


* EL방식
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 : <%= (int)request.getAttribute("big") > (int)request.getAttribute("small") %>


* EL방식
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. 동등비교 연산자

* 기존방식 
sOne과 sTwo가 일치합니까? <%= request.getAttribute("sOne").equals(request.getAttribute("sTwo")) %>
10과 3이 일치합니까? <%= (int)request.getAttribute("big") == (int)request.getAttribute("small") %>


* EL연산 
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 }  

sOne에 담긴 값이 "안녕"과 일치합니까? ${sOne eq "안녕" } 또는 ${sOne eq '안녕' } 
<!--  EL에서 문자열 리터럴 제시시 홀따옴표던 쌍따옴표던 상관없음 -->

 

 

4. 객체가 null인지 혹은 list가 비어있는지 체크하는 연산

* EL연산 
pTwo가 null입니까? ${pTwo == null } 또는 ${pTwo eq null } 또는 ${empty pTwo }
pOne가 null입니까? ${pOne == null } 또는 ${pOne eq null } 또는 ${empty pOne } 
pOne이 null이 아닙니까? ${!empty pOne } 

lOne이 비어있습니까?  ${empty lOne } 
lTwo이 비어있습니까?  ${empty lTwo }

 

5. 논리연산자

* EL연산 
AND 연산 : ${true && true } 또는 ${true && false } 또는 ${true and true }
 OR 연산 : ${true || false } 또는 ${true or false }

 

 

 

<!-- 연습문제 -->
* EL연산에서 배운 "키워드"만 가지고 작성해보기 

1. big이 small보다 크고 lOne이 텅 비어있습니까? 
2. big과 small의 곱은 4의 배수입니까? 	
3. lTwo가 텅 비어있지 않거나 또는 sOne에 담긴 값이 "안녕하세요"와 일치합니까?


<!-- 정답 -->
1. ${big gt small && empty lOne} 
2. ${big * small mod 4 eq 0 } 
3. ${!empty lTwo or sOne eq "안녕하세요"}