-
EL(Expression Language)Servlet 2019. 3. 6. 08:01
EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어진 언어이다.
그러나 EL은 값이 없는 변수에 대해 좀더 관대하고 데이터 형 변환을 자동으로 해준다.
이러한 특징들은 질의 문자열을 처리하는데 주요하게 작용한다.
질의 문자열은 서버로 전달 될때 항상문자열로 보내는데요.
질의 문자열은 서버로 전달될 때 항상 문자열로 보내는데
서버 프로그램 내에서 int boolean으로 사용해야 할 때가 있다.
이럴때 EL을 사용하며 값이 없거나 형변환에 신경 쓸 필요없이 사용할 수있다.
EL 개요
EL 구문
- ${ } 내에 표현식으로 표현한다.
- 지정된 문자 , 연산자 , 변수를 사용하여 표현식을 작성한다.
- 서버에서 지원하는 서블릿 스펙에 따라 EL의 사용 방법이 다를 수 있다.
1234567891011121314<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body>Literals : ${"Literals"}<br> Operators : ${5>3};<br> Implicit Objects : ${header["host"]}</body></html>cs 결과
Literals : Literals
Operators : true;
Implicit Objects : localhost:8081EL 표현식
EL 문자
EL의 표현식에서 문자로 사용가능한 타입은 논리, 숫자, 문자열 , null 데이터 타입이다.EL 연산자
- 산술 연산자 : +,-,*,/,%,mod- 논리 연산자 : && , || , ! , and , or , not- 비교 연산자 : == , !=,<.>,<=,>=,eq,ne,lt,get,le,ge- empty 연산자 : 값이 null이나 공백문자인지를 판단하는 연산자${empty ""} => true${empty null} =>true내장 객체
JSP에서 내장객체를 지원 했다. 변수의 선언과 초기화 작업이 자동으로 이루어지는 개체로
개발자는 내장객체를 사용할때 참조변수의 이름을 기억하고 있다가 참조 변수로 바로 접근하여 사용할 수 있다.
EL에도 JSP처럼 내장 객체를 지원하므로 필요한 객체는 내장객체 참조 변수 이름으로 곧바로 사용할 수 있다.
EL에서 지원하고 잇는 내장객체는 다음과 같다.
내장 객체
설명
pageContext
JSP 내장객체 pageContext와 같다.
pageScope
pageContext에 등록된 데이터의 이름과 값을 저장하고 있는 map객체
requestScope
HttpServletRequest에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
sessionScope
HttpSession에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
applicationScope
ServletContext에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
param
Query String의 이름과 값을 저장하고 있는 map 객체
paramValues
같은 이름으로 전달되는 질의 문자열의 이름과 값들을 저장하고 잇는 map객체
headerValues
요청정보 헤더의 정보들을 이름과 값들을 저장하고 있는 map객체
header
요청정보 헤더의 정보들을 이름과 값들을 저장하고 있는 map객체
cookie
요청을 보낸 클라이언트의 쿠기 이름과 값을 저장하고 있는 map객체
initParam
웹 애플리케이션에 지정한 초기 파라미터의 이름과 값을 저장하고 있는 map 객체
param
EL의 내장 객체 중에서 Pram은 웹브라우저에서 전송된 질의 문자열에 대하여 작을 쉽게 할수 있개 한다.12345678910111213<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body>${param.id} / ${param.pwd}<br>${param["id"]} / ${param["pwd"]}</body></html>cs http://localhost:8081/edu/ex14.jsp?id=guest&pwd=12344 로 요청
결과
guest / 12344
guest / 12344전에 작성했던 코드
123456789101112131415<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><%String p = request.getParameter("p");%><jsp:forward page="<%=p%>"/></body></html>cs 동일하게 동작하도록 페이지를 EL을 이용해서 작성하면 다음과 같다.
123456789101112<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><jsp:forward page="${param.p}"/></body></html>cs XML기반의 JSP태그를 사용할때 장점중 하나가 <jsp:forward page="${param.p}"/>에서 보는 것 처럼
태그의 속성의 값을 지정할 때 EL을 사용할 수 있다는 것이다.
JSP의 스크립트 기반 태그에서는 속성에 값을 지정할 때 정적인 데이터만 줄 수 있지만,
XML 기반의 JSP 태그는 속성에 값을 지정할 때<%=%> ${ } 을 사용하여 동적으로 줄 수 있습니다.
example20.jsp을 웹 브라우저에서 요청 할때 p 변수에 이동하는 경로를 값으로 지정하여 요청한다.
그러면 그 페이지로 forward 된다.
header
EL의 내장 객체 header 역시 map 객체이다 . map객체는 key와 value 쌍으로 데이터를 저장하고있는 객체로서 header는 요청 정보의 헤더에 있는 name과 value 정보를 가지고 잇는 내장 객체이다.12345678910111213141516171819<%@page import="java.util.Enumeration"%><%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><%Enumeration<String> list = request.getHeaderNames();while(list.hasMoreElements()){String key = list.nextElement();out.print("<br>"+key+":"+request.getHeader(key));}%></body></html>cs Enumeration<String> list = request.getHeaderNames();
request.getHeaderNames( ) 메소드는 요청정보의 헤더에서 헤더 정보의 이름들만 추출하여 반환하는 메소드이다.
while문으로 선택자를 이동시키며 키값과 그 키값에 맞는 헤더 정보를 출력한다.
결과
host:localhost:8081
connection:keep-alive
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding:gzip, deflate, br
accept-language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6
cookie:count=6; subject=java정보추출
JSP태그로 작업할 수 잇는 기능은 모두 EL로도 표현할 수 있다. EL로 구현 했을 때 최대 장점은 코드의 간소화에 있다.그 중에서도 EL을 효율적으로 사용할 수있는 부분은 여러 페이지에서 사용하기 위해HttpServletRequest, HttpSession , ServletContext 객체에 등록한 데이터를 접근할 때 간단한 코드로 처리 할 수 있다.예제를 통해 상태정보 유지를 위해 각 객체에 등록된 정보들을 EL로 접근하여 사용하는 방법을 알아 본다.request 정보 추출
HttpServletRequest 객체를 통해 정보를 유지시켜 사용할 수 있는 페이지들은동일한 요청 단위에 실행된 페이지끼리만 가능하다.즉 forward 또는 include를 통해 실행된 페이지 사이에만 공유 할 수있다.입력 데이터를 가지고 있을 객체1234567891011121314151617181920212223242526272829303132333435363738package com.edu.beans;public class BookBean {private String title;private String author;private String publisher;public BookBean() {}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getPublisher() {return publisher;}public void setPublisher(String publisher) {this.publisher = publisher;}}cs 책에 관한 정보를 입력받을 입력 페이지를 작성한다.입력받은 <input> 태그의 name 속성과 <form>태그의 action 속성값을 주의 깊게 보자1234567891011121314151617181920<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="example22.jsp" method="post">책 제목 : <input type="text" name="title"><br>책 저자 : <input type="text" name="author"><br>출판사 : <input type="text"name="publisher"><br><input type="submit" value="등록"></form></body></html>cs 전달받아 데이터를 처리하는 페이지
123456789101112131415161718<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><jsp:useBean id="book" class="com.edu.beans.BookBean"/><jsp:setProperty property="*" name="book"/><%request.setAttribute("book",book);%><jsp:forward page="bookOutput.jsp"/></body></html>cs 입력받은 데이터를 출력하는 페이지
1234567891011121314<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body>책 제목 : ${book.title }<br>책 저자 : ${book.author }<br>출판사 : ${book.publisher}</body></html>cs Session 정보 추출
클라이언트 단위로 정보를 유지 하고자 할때는 HttpSession 객체에 정보를 등록하여 유지 시킨다.이번 예제에서는 HttpSession 객체에 정보를 등록한 후 추출한다.123456789101112131415161718<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><jsp:useBean id="book" class="com.edu.beans.BookBean"/><jsp:setProperty property="*" name="book"/><%session.setAttribute("book",book);%><jsp:forward page="bookOutput.jsp"/></body></html>cs application 정보 추출
123456789101112131415161718<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><jsp:useBean id="book" class="com.edu.beans.BookBean"/><jsp:setProperty property="*" name="book"/><%application.setAttribute("book",book);%><jsp:forward page="bookOutput.jsp"/></body></html>cs