EL표현식
EL표현식이란?
- jsp파일에 다양한 언어가(html, javascript, java 등) 섞이면서 코드해석이 불편해졌다.
$ { expr }
- 형식으로 사용하고, expr은 자바의 변수가 아니다!
EL에서 사용하는 연산자
- 키워드 연산자(div, mod, ne, eq …) 를 지원한다.
- 개발자도구에서는 EL코드를 확인 할 수 없다. (값만 보임)
- 서버에서 해석하기 때문에 해석 못하면 500에러가 나타남
연산자 | 종류 |
---|---|
산술연산자 | +, -, *, div, %, mod |
비교연산자 | ==, eq, !=, ne, <, lt, <=, le, >, gt, >=, ge |
논리연산자 | &&, and, ||, or, !, not |
empty 연산자 | empty 값이 null이면 true 비어있는 문자열이면 true(‘‘도 empty) 배열이나 콜렉션일 경우 길이가 0이면 true |
삼항연산자 | (조건식)? 값1 : 값2 조건식이 참이면 값1, 거짓으면 값2선택 |
EL에서 객체 찾기 1
- ${ id(객체이름) } 일때 EL의 내장객체 이름과 같은지 확인 후, 있으면 실행하도록 한다.
param
- request.getParameter(“id”)를 대체한다.
- url이 ?id=aaa&name=bbb 일때 객체에 접근하는 방법
<h2>jsp 표현식</h2>
id : <%= request.getParameter("id") %><br>
name : <%= request.getParameter("name") %><br>
<h2>jsp EL표현식</h2>
el-id : ${ param.id }<br>
el-name : ${ param.name }<br>
- param객체 뒤에 찾고자하는 name을 붙인다.
paramValues
- request.getParameterValues(“id”)를 대체한다.
- url이 ?id=aaa&name=bbb&hobby=music&hobby=movie 일때 객체에 접근하기
<h2>jsp 표현식</h2>
<% String[] hb = request.getParameterValues("hobby"); %>
hobby : <%= hb[0] %>, <%= hb[1] %><br>
<h2>jsp EL표현식</h2>
el-hobby : ${ paramValues.hobby[0] }, ${ paramValues.hobby[1] }
- 여러개의 값을 받을 경우 paramValues로 받아서 인덱스를 입력한다.
- jsp 기존 표현식과 차이점은 값이 안들어왔을 때 에러가 발생하지 않고 비워둔다는 점(empty). (장점)
EL에서 객체 찾기 2
- EL에서 객체 찾는 순서
- EL이 가진 객체 이름 조회 (동일한 것)
- 없으면 공유영역 4가지를 조회
- 객체가 등록되어 있지 않다면 empty상태
- 객체 등록 : JSP문법으로 등록한다. (공유영역명.getAttribute, removeAttribute, setAttribute(“이름”))
공유 영역
- jsp와 변수를 공유하기 위한 4가지 영역
- 같은 공유영역이지만 EL에서 부르는 명칭과 jsp에서 부르는 명칭이 다르다.
EL | JSP | 영역설명 |
---|---|---|
pageScope | pageContext | 하나의 파일에서 등록시킨 객체를 동일 파일 내에서만 접근할 수 있는 영역 |
requestScope | request | 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 한 번 응답 후 사라짐.) |
sessionScope | session | 하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 여러 번 응답해도 계속 기억.) |
applicationScope | application | 여러 사용자가 요청하고 응답해도 기억하는 영역 (호스트 이름을 기억하는 용도로 주로 쓰임) |
- jsp변수를 공유영역에 올려야 EL에서 객체를 찾을 수 있다.
- 우선순위 : pageContext -> request -> session -> application
EL에서 공유영역의 객체에 접근하기
${ 객체.이름 }
- 객체 자리에 올 수 있는 타입 : 자바빈즈클래스, 맵객체
- 자바빈즈클래스?
- 패키지로 선언
- 클래스는 public 선언
- 매개변수 없는 생성자 선언
- 멤버변수는 private 선언
- 멤버변수에 대한 setter, getter 메소드 존재
- 디폴트 생성자 선언
package kr.ac.kopo.board;
public class BoardVO {
private int no;
private String title;
private String writer;
private String regDate;
public BoardVO(int no, String title, String writer, String regDate) {
super();
this.no = no;
this.title = title;
this.writer = writer;
this.regDate = regDate;
}
public BoardVO() {
super();
// TODO Auto-generated constructor stub
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
@Override
public String toString() {
return "BoardVO [no=" + no + ", title=" + title + ", writer=" + writer + ", regDate=" + regDate + "]";
}
}
- 객체 타입이 자바빈즈인 경우
<%
BoardVO b = new BoardVO();
pageContext.setAttribute("board", b);
%>
${ board.no }
- BoardVO객체의 멤버변수 no에 접근할 수 있음.
- ${board.aaa}는 없으므로 500에러가 나게됨!