기존에 사용했던 JSP 표현식(출력식)
<%=name %>
위와 같은 표현식을 EL을 사용하여 더 쉽게 표현하여 작성한다.
- JSP 스크립팅 원소 : JSP 페이지에서 자바코드를 직접 기술할 수 있게 하는 기술
ex) 선언문, 스크립틀릿, 표현식
- 지시어 : JSP 페이지 정보에 대한 내용을 표현하거나 또다른 페이지를 포함할 때 사용
ex) page 지시어, include 지시어, taglib 지시어(라이브러리 추가)
- JSP Action Tag : XML 기술을 이용하여 기존의 JSP 문법을 확장하는 기술을 제공하는 태그
- 표준 액션 태그 : JSP 페이지 내에서 지원하는 기능 표준 액션태그는 모든 태그명 앞에 jsp: 라는 접두어가 붙는다
- 커스텀 액션 태그 : JSP 페이지 내에서 바로 사용 불가능(연동 필요)
모든 커스텀 태그는 태그명 앞에 jsp: 외의 다른 접두어가 붙는다(여러가지 접두어가 있음)
제공되고 있는 대표적인 유용한 라이브러리(JSTL)
서블렛에서 데이터 준비한 코드
// request scope에 값 담기
request.setAttribute("classRoom", "E강의장");
request.setAttribute("student", new Person("학생이름", 22, "남자") );
// session scope에 담기
HttpSession session = request.getSession();
session.setAttribute("academy", "KH정보교육원");
session.setAttribute("teacher", new Person("선생이름", 24, "남자") );
Person클래스의 필드를 확인하고 student와 teacher에 사용된다.
private String name;
private int age;
private String gender;
jsp 파일에서 데이터를 꺼내는 방식의 차이를 확인한다.
// request scope에 담긴 값 꺼내기
String classRoom = (String)request.getAttribute("classRoom");
Person student = (Person)request.getAttribute("student");
// session scope에 담긴 값 꺼내기
String academy = (String)session.getAttribute("academy");
Person teacher = (Person)session.getAttribute("teacher");
학원명 : <%=academy %>
강의장 : <%=classRoom %>
강사 정보 : <%=teacher.getName() %>, <%=teacher.getAge() %>, <%=teacher.getGender() %>
수강생 정보 : <%=student.getName() %>, <%=student.getAge() %>, <%=student.getGender() %>
기존 방식에 비해 EL방식은 어떤 차이가 있는지 알아본다.
EL은 getXXX를 통해 값을 꺼내지 않고 key값만 제시하면 바로 접근한다.
내부적으로 해당 scope영역에 있는 key값의 value를 꺼내올 수 있다.
기본적으로 EL은 jsp 내장 객체를 구분하지 않고
자동적으로 모든 내장객체의 key값을 검색하여 존재할 경우 값을 꺼낸다.
학원명 : ${academy}
강의장 : ${classRoom}
강사 정보 : ${teacher.name}, ${teacher.age}, ${teacher.gender}
수강생 정보 : ${student.name}, ${student.age}, ${student.gender}
값을 얻고자 하는 객체의 필드명(teacher.name)으로 접근하면
내부적으로 getter메소드가 실행되어 해당하는 값을 꺼낼 수 있다.
getter메소드 필수이다.
Person클래스에 height 필드는 없다.
${teacher.height}
위와 같이 없는 값을 출력하려하면 다음과 같은 에러가 뜬다.
[height] 특성이 [com.kh.model.vo.Person] 유형에 없습니다.
속성을 읽을 수 없다는 에러가 뜬다.
scope확인을 위해 서블렛에서 데이터를 준비한 것을 확인한다.
// request영역과 session 영역에 동일한 키값으로 값을 넣어보자
request.setAttribute("scope", "request영역");
session.setAttribute("scope", "session영역");
// application scope에 값 담기
ServletContext app = request.getServletContext();
app.setAttribute("scope", "application영역");
scope 값을 꺼냈을 때 어떤 영역의 scope가 출력되는지 확인한다.
스코프 : ${scope}
스코프 : request영역
가장 가까운 영역인 request영역의 값이 출력되는 것을 확인한다.
${nothing}일 때는 오류가 나지 않고 출력도 되지 않는다.
pageScope에 담긴 값 : ${scope} 또는 ${pageScope.scope}
requestScope에 담긴 값 : ${requestScope.scope}
sessionScope에 담긴 값 : ${sessionScope.scope}
applicationScope에 담긴 값 : ${applicationScope.scope}
다른 영역의 데이터 꺼내기 :: $ {applicationScope.classRoom} : ${applicationScope.classRoom}
다른 영역의 데이터 꺼내기 :: $ {requestScope.classRoom} : ${requestScope.classRoom}
pageScope에 담긴 값 : page scope 영역 또는 page scope 영역
requestScope에 담긴 값 : request영역
sessionScope에 담긴 값 : session영역
applicationScope에 담긴 값 : application영역
다른 영역의 데이터 꺼내기 :: $ {applicationScope.classRoom} :
다른 영역의 데이터 꺼내기 :: $ {requestScope.classRoom} : E강의장
각 영역에 담긴 값에 출력되는 것을 확인할 수 있다.
또한 다른 영역의 데이터를 꺼낼 때 해당 값이 없다면 출력이 되지 않는다.