▶ 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 "안녕하세요"}