JSP/서블릿 흝어 보기

EL(Expression Language)

EL(Expression language)란?

EL은 Expression language의 약자로 JSP 2.0 스펙에 추가된 개념이다. 원래는 JSTL 1.0 규약에 소개된 내용으로 자바 코드를 대신해 실행시간에 태그의 속성 값을 지정하는 역활을 했었습니다. 초기의 EL은 JSTL의 액션 태그에서만 작동하는 문제가 있었는데, JSP 2.0 부터는 JSP 컨테이너가 EL 표현식을 해석할 수 있게 도어 표준 액션 태그, 커스텀 태그, 템플릿 데이터와 같이 자바코드를 사용해야 했던 모든 곳에 EL을 사용할 수 있습니다.

EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어진 언어입니다. 그러나 EL은 값이 없는 변수(null)에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해줍니다. 이러한 특징들은 질의 문자열을 처리하는 데 주요하게 작용합니다. 질의 문자열은 서버로 전달될 때 항상 문자열로 보내는데요. 서버 프로그램 내에서는 int, boolean으로 사용해야 할 때가 있습니다. 이럴 때 EL을 사용하면 값이 없거나 형 변환 등에 전혀 신경 쓸 필요 없이 사용할 수 있습니다.

EL 구문

EL구문은 ${....}내에 표현식으로 표현합니다.

EL 표현식

문자

  • ${true}
  • ${false}
  • ${123}
  • ${3.14}
  • ${"JAVA"}
  • ${'java'}

EL연산자

  • 산술연산자: +, -, *, /, %, mode
  • 논리연산자: &&, ||, !, 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  QueryString의 이름과 값을 저장하고 있는 map객체
paramValues  같은 이름으로 전달된 질의 문자열의 이름과 값들을 저정하고 있는 map 객체
header  요청정보 헤더의 정보를 이름과 값으로 저장하고 있는 map객체
headerValues  요청정보 헤더의 정보들을 이름과 값들을 저장하고 있는 map객체
cookie  요청을 보낸 클라이언트의 쿠기 이름과 값을 저장하고 있는 map객체
initParam  웹 애플리케이션에 저장한 초기 파라미터의 이름과 값을 저장하고 있는 map 객체

위의 EL 내장 객체 중에서 param와 header를 살펴보자.

  1. param
    <%@ 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"]} <br/>
    </body>
    </html>


    EL 내장 객체는 대부분 map 객체이며, 값을 추출할 때 두 가지 형식으로 지정할 수 있습니다.
    예) ${param.id} or $[param["id"]}​

  2. header
    아래 예제를 통해 header의 정보들을 나열해보고 EL표현식을 이용해 헤더에 저장된 호스트 정보를 출력해보자.

    <%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*"
        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));
    	}
    
    %>
    <hr>
    ${header}
    <hr>
    호스트: ${header["host"]} / ${header.host}
    </body>
    </html>

 

정보추출

이번에는 상태정보 유지를 위해 각 객체에 등록된 정보들을 EL로 접근하여 사용하는 방법을 알아보자

memberBean.java

package job.study.beans;

public class MemberBean {
    
	private String userId;	
	private String passwd;
	private String email;
	private String hp_1;
	private String hp_2;
	private String emailAgree; //라디오
	private String[] interest; //체크박스
	private String introduce;
	
	public MemberBean() {
		// TODO Auto-generated constructor stub
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getHp_1() {
		return hp_1;
	}

	public void setHp_1(String hp_1) {
		this.hp_1 = hp_1;
	}

	public String getHp_2() {
		return hp_2;
	}

	public void setHp_2(String hp_2) {
		this.hp_2 = hp_2;
	}

	public String getEmailAgree() {
		return emailAgree;
	}

	public void setEmailAgree(String emailAgree) {
		this.emailAgree = emailAgree;
	}

	public String[] getInterest() {
		return interest;
	}

	public void setInterest(String[] interest) {
		this.interest = interest;
	}

	public String getIntroduce() {
		return introduce;
	}

	public void setIntroduce(String introduce) {
		this.introduce = introduce;
	}
	

}

memberInput.jsp

<%@ 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>
<h3>회원 가입하기</h3>
<form method="post" action="example22.jsp">
    <p>아이디</p>
	<input type="text" name="userId" placeholder="이름을 입력해 주세요">

	<p>패스워드</p>
	<input type="password" name="passwd" placeholder="패스워드를 입력해 주세요">

	<p>이메일</p>
	<input type="text" name="email" placeholder="이메일을 입력해 주세요">

	
	<p>이메일 수신여부</p>
	<input type="radio" name="emailAgree" value="yes">예
	<input type="radio" name="emailAgree" value="no" checked>아니오
		
	<p>관심사항</p>
	<input type="checkbox" name="interest" value="IT">IT/인터넷
	<input type="checkbox" name="interest" value="movie">영화
	<input type="checkbox" name="interest" value="music">음악
	<input type="checkbox" name="interest" value="book">책
	<input type="checkbox" name="interest" value="food">음식
	
	<p>핸드폰</p>	
	<select name="hp_1">
        <option value="010">010</option>
        <option value="011">011</option>
        <option value="016">016</option>
        <option value="017">017</option>
     </select>
     <input type="text" name="hp_2" placeholder="핸드폰 번호를 입력해주세요">
	
	<p>자기소개</p>
	<textarea name="introduce" placeholder="자기소개를 입력해주세요" cols="30" rows="4"></textarea>
	<br/>
	
	<input type="submit" value="전송">
	
</form>
</body>
</html>

example22.jsp

<%@ 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="member" class="job.study.beans.MemberBean" />
	<jsp:setProperty property="*" name="member" />
	<%
		//동일한 요청에 의해 실행되는 페이지 간에 정보를 유지하기 위해 HttServletRequest 객체에 등록 합니다.
		request.setAttribute("member", member);
		
		//클라이언트 단위로 정보를 유지하고자 할 때 HttpSession 객체에 등록합니다.
		//session.setAttribute("member", member);
		
		//웹 애플리케이션 단위로 정보를 유지하고자 할 때 ServletContext객체에 등록합니다.
		//application.setAttribute("member", member); 
	%>
	<jsp:forward page="memberOutput.jsp" />
</body>
</html>

memberOutput.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원입력 정보</title>
</head>
<body>

<p>아이디 : ${member.userId}</p>
<p>패스워드 : ${member.passwd}</p>
<p>이메일 : ${member.email}</p>
<p>이메일 수신여부 :${member.emailAgree}</p>
<p>관심사항:</p>
<p><%=String.join(", ",request.getParameterValues("interest"))%></p>    
<p>핸드폰 : ${member.hp_1}-${member.hp_2}</p>	
<p>자기소개</p>
${member.introduce}
	

</body>
</html> 

실행결과

EL 구문으로 ${member} 처럼 표현한 경우 getAttribute 메소드가 실행되는 순서는 다음과 같다.

request→ session application

메소드가 실행되는 순서는 request 객체에서 먼저 실행하고 만일 request 객체에 "book"이 등록되어 있지 않다면 session에서 실행하고 session에도 없다면 세번째로 application 객체에서 실행한다.

getAttribute 메소드를 실행한 후 추출된 정보가 있으면 다음처럼 추출된 정보를 원래 등록된 객체의 타입으로 캐스팅 합니다.

${member.userId} === ((MemberBean)request.getAttribute("member")).getUserId();

 

댓글

댓글 본문
  1. DongHyun Kim
    감사합니다.!
    대화보기
    • 백삼십두번째다람쥐
      자네 멋져요