EL(Expression Language)이란?
JSP 버전 2.0부터 적용된 기술로 JavaBean 요소에 저장된 데이터에 쉽게 접근가능하도록 고안된 언어
기존 스크립팅 요소를 %{ 표현식 } 으로 대체
servlet단에서 넘겨받은 요청/ 응답을
스크립팅 요소로 출력하기 vs EL 구문 활용하기
[vo]
public class Person {
private String name;
private int age;
private String address;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
[servlet controller]
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// requestScope에 담기
request.setAttribute("classRoom", "c강의장");
request.setAttribute("student", new Person("로봇", 20, "지구별"));
// sessionScope에 담기
HttpSession session = request.getSession();
session.setAttribute("academy", "학원");
session.setAttribute("lecture", new Person("로보트", 20, "ai"));
// 항상 키값은 중복 x, key값 중복시 덮어쓰기됨
// 테스트: requestScope sessionScope에 동일한 키값으로 데이터 담아보기
request.setAttribute("scope", "request");
session.setAttribute("scope", "session");
//applicationScope에 담기
ServletContext application = request.getServletContext();
application.setAttribute("scope", "application");
// 응답 뷰 지정
// 포워딩 방식(파일 경로제시)
RequestDispatcher view = request.getRequestDispatcher("views/1_EL/01_el.jsp");
view.forward(request, response);
// sendRedirect (contextPath 로부터 재요청을 보낼경우 사용)
}
[jsp view]
1. 스크립팅 요소로 값 뽑기
<%
// requestScope에 담긴 값 뽑기
String classRoom = (String)request.getAttribute("classRoom");
Person student = (Person)request.getAttribute("student");
// session에 담긴 값 뽑기
String academy = (String)session.getAttribute("academy");
Person lecture = (Person)session.getAttribute("lecture");
// 내장객체라서 request, session은 임포트 없이 쓸 수 잇는 것임!
%>
<p>
학원명 : <%= academy %><br>
강의장: <%= classRoom %><br>
강사정보: <%= lecture.getName() %>, <%= lecture.getAge() %>, <%= lecture.getAddress() %><br>
</p>
수강생 정보 <br>
<ul>
<li>이름: <%= student.getName() %></li>
<li>나이: <%= student.getAge() %></li>
<li>주소: <%= student.getAddress() %></li>
</ul>
* 존재하지 않는(null)인 값을 출력식에서 출력하면 : 500 error (nullPointerExcepiton ) 발생
2. EL 표현식 사용하기
EL은 getXXXX(getAttribute, getter메소드)을 통해 값을 추출할 필요 없이
key값만 제시하여 값에 접근 가능
scope제시시 해당 scope에 해당하는 밸류값을 가져올 수 있음
기본적으로 EL은 jsp내장객체를 구분하지 않고 자동적으로 모든 내장객체에서 키값을 검색한 후 존재하는 경우 값을 가져옴 (검색순서: page -> request -> session-> application)
학원명: ${ academy }
강의장: ${ classRoom }
강사정보: ${ lecture.name }, ${lecture.age }, ${lecture.address }
수강생 정보
<ul>
<li>${student.name }</li>
<li>${student.age }</li>
<li>${student.address }</li>
</ul>
* 여기서 질 문: vo에서 클래스를 정의할 때 접근제한자를 private으로 만들었기 때문에 직접접근이 안되어야 하는데EL에서는 getter메소드 없이 필드에 직접접근 하고있다..!
EL 표현식 내에서 [데이터타입.필드명]을 통해 private으로 설정된 필드에 직접접근하는 것처럼 보이지만 실제 EL 내부에서는 자바빈의 getter메소드를 찾아서 호출하는 구조임
즉, vo에 getter가 없으면 EL에서도 [키값.필드명]으로 값 뽑는 것이 불가능
* 존재하지 않는(null)인 값을 출력식에서 출력하면 : 아무것도 나오지 않음
(nullPointer 이젠 안녕...~)
EL로 Data를 가져오는 순서
EL사용시 각 내장객체들에 저장된 키값이 중복되는 경우
EL구문은 공유범위가 가장 작은 scope에서부터 해당 키값을 검색함
page- >request->session->application순으로 키값을 찾음
따라서
controller단 servlet에서 setAttribute메소드에
동일한 key 값으로 pageScope/request/session/application 객체를 각각 담은 후,
view단 jsp에서 ${ key } 출력시 가장 범위가 작은 page의 value 값이 출력됨
특정"scope" key에 담긴 value를 뽑고 싶다면
-> 직접 Scope영역을 지정해서 접근하기
pageScope에 담긴 값: ${ scope } 또는 ${ pageScope.scope }<br>
requestScope에 담긴 값: ${ requestScope.scope }<br>
sessionScope에 담긴 값: ${ sessionScope.scope }<br>
applicationScope에 담긴 값: ${ applicationScope.scope }<br>
Quiz: ${ sessionScope.classRoom }<br>
아무것도 안나온다. session의 classRoom 키 -밸류로 담은 값이 없어서
Reference
https://docs.oracle.com/javaee/6/tutorial/doc/bnahq.html
'기타' 카테고리의 다른 글
cloudfare(front-end) + aws lamda(back-end)로 web배포 (0) | 2023.07.26 |
---|---|
JSP Action Tag : JSP 표준 액션태그 (0) | 2022.12.14 |
자바빈(Java Bean)이란? / 생성 및 사용법 / 자바빈을 사용하는 이유 (0) | 2022.12.14 |
[JDBC] JDBC Template (0) | 2022.10.13 |
[JDBC] JDBC 실행 중 Statement와 PreparedStatement 차이 (0) | 2022.10.13 |