10 표현 언어(Expression Language)

알재·2023년 7월 7일
0

JSP & Servlet

목록 보기
10/16

10.1 표현 언어란?

표현 언어는 변수의 값을 출력할 때 사용하는 스크립트 언어이다.

  • JSP 내장 객체의 영역에 담긴 속성을 사용할 수 있다.
  • 산술 연산, 비교 연산, 논리 연산이 가능.
  • 자바 클래스에 정의된 메서드를 호출.
  • 표현 언어만의 객체를 통해 JSP와 동일한 기능을 수행.

10.1.1 기본 사용법

${ 속성 }

JSP 스크립트 선언부,표현식,스크립틀릿에서는 사용할수 없다.

10.1.2 객체 표현 방식

${ param.name }
${ param.["name"] }
${ param.['name'] }
${ header.["user-agent"] }   가능
${ header.user-agent }       에러
${ King.['한글'] }            가능
${ King.한글 }                에러

10.2 EL의 내장 객체

10.2.1 4가지 영역에 속성값 저장하고 읽어오기

  • pageScope : pageContext 내장 객체와 같이 page 영역에 저장된 속성값을 읽어옴.
  • requestScope : request 내장 객체와 같이 request 영역에 저장된 속성값을 읽어옴.
  • sessionScope : session 내장 객체와 같이 session 영역에 저장된 속성값을 읽어옴.
  • applicationScope : application 내장 객체와 같이 application 영역에 저장된 속성값을 읽어옴.
ImplicitObjMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
pageContext.setAttribute("scopeValue", "페이지 영역");
request.setAttribute("scopeValue", "리퀘스트 영역");
session.setAttribute("scopeValue", "세션 영역");
application.setAttribute("scopeValue","애플리케이션 영역");
%>     
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 내장 객체</title></head>
<body>
    <h2>ImplicitObjMain 페이지</h2>
    <h3>각 영역에 저장된 속성 읽기</h3>
    <ul>
        <li>페이지 영역 : ${ pageScope.scopeValue }</li>
        <li>리퀘스트 영역 : ${ requestScope.scopeValue }</li>
        <li>세션 영역 : ${ sessionScope.scopeValue }</li>
        <li>애플리케이션 영역 : ${ applicationScope.scopeValue }</li>
    </ul>

    <h3>영역 지정 없이 속성 읽기</h3>
    <ul>
        <li>${ scopeValue }</li> 
    </ul>
    
    <%--<jsp:forward page="ImplicitForwardResult.jsp" />--%>
</body>
</html>


ImplicitForwardResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 내장 객체</title></head>
<body>
    <h2>ImplicitForwardResult 페이지</h2>
    <h3>각 영역에 저장된 속성 읽기</h3>
    <ul>
        <li>페이지 영역 : ${ pageScope.scopeValue }</li>
        <li>리퀘스트 영역 : ${ requestScope.scopeValue }</li>
        <li>세션 영역 : ${ sessionScope.scopeValue }</li>
        <li>애플리케이션 영역 : ${ applicationScope.scopeValue }</li>
    </ul>
    <h3>영역 지정 없이 속성 읽기</h3>
    <ul>
        <li>${ scopeValue }</li>
    </ul>
</body>
</html>


10.2.2 폼값 처리하기

  • param : request.getParameter()와 동일하다.
  • paramValues : request.getParameterValues()와 동일하게 문자열 배열로 값을 받아온다.
FormSubmit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 폼값 처리</title></head>
<body>
    <h2>폼값 전송하기</h2>
    <form name="frm" method="post" action="FormResult.jsp">
        이름 : <input type="text" name="name" /><br />
        성별 : <input type="radio" name="gender" value="Man" />남자
               <input type="radio" name="gender" value="Woman" />여자<br />
        학력 :
            <select name="grade">
                <option value="ele">초딩</option>
                <option value="mid">중딩</option>
                <option value="high">고딩</option>
                <option value="uni">대딩</option>
            </select><br />
        관심 사항 : 
            <input type="checkbox" name="inter" value="pol" />정치
            <input type="checkbox" name="inter" value="eco" />경제
            <input type="checkbox" name="inter" value="ent" />연예
            <input type="checkbox" name="inter" value="spo" />운동<br />
        <input type="submit" value="전송하기" />
    </form>
</body>
</html>
FormResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 폼값 처리</title></head>
<body>
    <h3>EL로 폼값 받기</h3>
    <ul>
        <li>이름 : ${ param.name }</li>
        <li>성별 : ${ param.gender }</li>
        <li>학력 : ${ param.grade }</li>
        <li>관심사항 : ${ paramValues.inter[0] } 
            ${ paramValues.inter[1] }
            ${ paramValues.inter[2] }
            ${ paramValues.inter[3] }</li> 
    </ul>
</body>
</html>


10.2.3 객체 전달하기

폼으로는 객체 전송이 불가능하기에 영역을 사용한다.

ObjectParams.jsp

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 객체 매개변수</title></head>
<body>
    <%
    request.setAttribute("personObj", new Person("홍길동", 33));
    request.setAttribute("stringObj", "나는 문자열");
    request.setAttribute("integerObj", new Integer(99));
    %>
    <jsp:forward page="ObjectResult.jsp">
        <jsp:param value="10" name="firstNum" />
        <jsp:param value="20" name="secondNum" />
    </jsp:forward>
</body>
</html>
ObjectResult.jsp

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 객체 매개변수</title></head>
<body>  
    <h2>영역을 통해 전달된 객체 읽기</h2>
    <ul>
        <li>Person 객체 => 이름 : ${ personObj.name }, 나이 : ${ personObj.age }</li>
        <li>String 객체 => ${ requestScope.stringObj }</li>
        <li>Integer 객체 => ${ integerObj }</li> 
    </ul>
    <h2>매개변수로 전달된 값 읽기</h2>
    <ul>
        <li>${ param.firstNum + param['secondNum'] }</li>  
        <li>${ param.firstNum } + ${param["secondNum"] }</li> 
    </ul>
</body>
</html>


10.2.4 쿠키,HTTP 헤더, 컨텍스트 초기화 매개변수 출력하기

  • cookie : 쿠키를 읽을 때 사용.
  • header : request.getHeader()와 동일하다.
  • headerValues : request.getHeaders()와 동일하다.
  • initParam : web.xml에 설정한 컨텍스트 초기화 매개변수를 읽을 때 사용.
  • pageContext : JSP의 pageContext 내장 객체와 동일하다.
OtherImplicitObj.jsp

<%@ page import="utils.CookieManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
CookieManager.makeCookie(response, "ELCookie", "EL좋아요", 10);
%>    
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 그 외 내장 객체</title></head>
<body>
    <h3>쿠키값 읽기</h3>
    <li>ELCookie값 : ${ cookie.ELCookie.value }</li>
    
    <h3>HTTP 헤더 읽기</h3>
    <ul>
        <li>host : ${ header.host }</li>
        <li>user-agent : ${ header['user-agent'] }</li>
        <li>cookie : ${ header.cookie }</li>
    </ul>
    
    <h3>컨텍스트 초기화 매개변수 읽기</h3>
    <li>OracleDriver : ${ initParam.OracleDriver }</li>

    <h3>컨텍스트 루트 경로 읽기</h3>
    <li>${ pageContext.request.contextPath }</li>
</body>
</html>


10.3 컬렉션 사용하기

CollectionUse.jsp

<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 컬렉션</title></head>
<body>
<h2>List 컬렉션</h2>
<%
List<Object> aList = new ArrayList<Object>();
aList.add("청해진");
aList.add(new Person("장보고", 28));
pageContext.setAttribute("Ocean", aList);
%>
<ul>
    <li>0번째 요소 : ${ Ocean[0] }</li>
    <li>1번째 요소 : ${ Ocean[1].name }, ${ Ocean[1].age }</li>
    <li>2번째 요소 : ${ Ocean[2] }<!--출력되지 않음--></li>
</ul>
<h2>Map 컬렉션</h2>
<%
Map<String, String> map = new HashMap<String, String>();
map.put("한글", "훈민정음");
map.put("Eng", "English");
pageContext.setAttribute("King", map);
%>
<ul>
    <li>영문 Key : ${ King["Eng"] }, ${ King['Eng'] }, ${ King.Eng }</li>
    <li>한글 Key : ${ King["한글"] }, ${ King['한글'] }, \${King.한글 }<!--에러--></li>
</ul>
</body>
</html>

\${King.한글 }    "\"를 사용하면 주석처리를 할 수 있다


10.4 EL의 연산자들

할당 연산자

&{ numberVar = 10 }     할당과 동시에 출력
&{ numberVar = 10;'' }  할당만 되고 출력은 안됨

산술 연산자

  • +,-,*
  • / 또는 div
  • % 또는 mod

비교 연산자

  • gt 또는 > : Greater Than
  • ge 또는 >= : Greater than or Equal
  • lt 또는 < : Less Than
  • le 또는 <= : Less than or Equal
  • eq 또는 ==
  • ne 또는 !=

논리 연산자

  • && 또는 and
  • || 또는 or
  • ! 또는 not

Operator1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 예시에서 사용할 변수 선언
int num1 = 3;
pageContext.setAttribute("num2", 4);
pageContext.setAttribute("num3", "5");  
pageContext.setAttribute("num4", "8");  
%>    
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 연산자</title></head>
<body>
    <h3>변수 선언 및 할당</h3> 
    스크립틀릿에서 선언한 변수 : ${ num1 } <br />
    page 영역에 저장된 변수 : ${ num2 } <br />
    변수 할당 및 즉시 출력 : ${ num1 = 7 } <br />
    변수 할당 및 별도 출력 : ${ num2 = 8;'' } => ${ num2 } <br />
    num1 = ${ num1 }, num2 = ${ num2 }, num3 = ${ num3 }, num4 = ${ num4 }
    
    <h3>산술 연산자</h3>
    num1 + num2 : ${ num1 + num2 } <br />
    num1 - num2 : ${ num1 - num2 } <br />
    num1 * num2 : ${ num1 * num2 } <br />
    num3 / num4 : ${ num3 / num4 } <br />
    num3 div num4 : ${ num3 div num4 } <br />
    num3 % num4 : ${ num3 % num4 } <br />
    num3 mod num4 : ${ num3 mod num4 }
   
    <h3>+ 연산자는 덧셈만 가능</h3>  
    num1 + "34" : ${ num1 + "34" } <br /> 
    num2 + "이십" : \${num2 + "이십" }<!-- 에러 발생(주석 처리) --> <br />
    "삼십" + "사십" : \${"삼십" + "사십" }<!-- 에러 발생(주석 처리) -->
    
    <h3>비교 연산자</h3>
    num4 > num3 : ${ num4 gt num3 } <br />
    num1 < num3 : ${ num1 lt num3 } <br />
    num2 >= num4 : ${ num2 ge num4 } <br />
    num1 == num4 : ${ num1 eq num4 } 

    <h3>논리 연산자</h3>
    num3 <= num4 && num3 == num4 : ${ num3 le num4 and num3 eq num4 } <br />
    num3 >= num4 || num3 != num4 : ${ num3 ge num4 or num3 ne num4 }
</body>
</html>


empty 연산자

  • null
  • 빈 문자열
  • 길이가 0인 배열
  • size가 0인 컬렉션

삼항 연산자

${ 조건문 ? "true일 때 " : "false일 때" }

null일 때 연산

Operator2.jsp

<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 예시에서 사용할 변수 선언
pageContext.setAttribute("num1", 9);
pageContext.setAttribute("num2", "10");

pageContext.setAttribute("nullStr", null);
pageContext.setAttribute("emptyStr", "");
pageContext.setAttribute("lengthZero", new Integer[0]);
pageContext.setAttribute("sizeZero", new ArrayList());
%>    
<html>
<meta charset="UTF-8">
<head><title>표현 언어(EL) - 연산자</title></head>
<body>
    <h3>empty 연산자</h3>   
    empty nullStr : ${ empty nullStr } <br />
    empty emptyStr : ${ empty emptyStr } <br />
    empty lengthZero : ${ empty lengthZero } <br />
    empty sizeZero : ${ empty sizeZero }
    
    <h3>삼항 연산자</h3>
    num1 gt num2 ? "참" : "거짓" => ${ num1 gt num2 ? "num1이 크다" : "num2가 크다" }
    
    <h3>null 연산</h3>
    null + 10 : ${ null + 10 } <br />
    nullStr + 10 : ${ nullStr + 10 } <br />
    param.noVar > 10 : ${ param.noVar > 10 }
</body>
</html>


10.5 인스턴스 메서드 호출

10.5.1 호출할 메서드 준비

MyELClass.java

package el;

public class MyELClass {
    // 주민번호를 입력받아 성별을 반환합니다
    public String getGender(String jumin) {
        String returnStr = "";
        int beginIdx = jumin.indexOf("-") + 1;
        String genderStr = jumin.substring(beginIdx, beginIdx + 1);
        int genderInt = Integer.parseInt(genderStr);
        if (genderInt == 1 || genderInt == 3)
            returnStr = "남자";
        else if (genderInt == 2 || genderInt == 4) 
            returnStr = "여자";
        else
            returnStr = "주민번호 오류입니다.";
        return returnStr;
    }

    // 입력받은 문자열이 숫자인지 판별해줍니다.
    public static boolean isNumber(String value) {
        char[] chArr = value.toCharArray();
        for (int i = 0; i < chArr.length; i++) {
            if (!(chArr[i] >= '0' && chArr[i] <= '9')) {
                return false;
            }
        }
        return true;
    }

    // 입력받은 정수까지의 구구단을 HTML 테이블로 출력해줍니다.
    public static String showGugudan(int limitDan) {
        StringBuffer sb = new StringBuffer();
        try {
            sb.append("<table border='1'>");
            for (int i = 2; i <= limitDan; i++) {
                sb.append("<tr>");
                for (int j = 1; j <= 9; j++) {
                    sb.append("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
                }
                sb.append("</tr>");
            }
            sb.append("</table>");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
}

10.5.2 메서드 호출하기

ELCallMethod.jsp

<%@ page import="el.MyELClass"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="mytag" uri="/WEB-INF/MyTagLib.tld" %>
<%
MyELClass myClass = new MyELClass(); // 객체 생성
pageContext.setAttribute("myClass", myClass); // page 영역에 저장
%>  
<html>
<head><title>표현 언어(EL) - 메서드 호출</title></head>
<body>
    <h3>영역에 저장 후 메서드 호출하기</h3>
    001225-3000000 => ${ myClass.getGender("001225-3000000") } <br />
    001225-2000000 => ${ myClass.getGender("001225-2000000") }
</body> 
</html>


10.6 정적 메서드 호출

10.6.1 클래스명을 통한 정적 메서드 호출

ELCallMethod.jsp

    <h3>클래스명을 통해 정적 메서드 호출하기</h3>
    ${ MyELClass.showGugudan(7) }


10.6.2 TLD를 이용한 정적 메서드 호출

MyTagLib.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xml="http://www.w3.org/XML/1998/namespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
    <tlib-version>1.0</tlib-version>
    <short-name>mytag</short-name>
    <function>
        <name>isNumber</name>
        <function-class>el.MyELClass</function-class>
        <function-signature>boolean isNumber(java.lang.String)</function-signature>
    </function>
</taglib>
ELCallMethod.jsp

    <h3>TLD 파일 등록 후 정적 메서드 호출하기</h3>
    <ul>
        <li>mytag:isNumber("100") => ${ mytag:isNumber("100") }</li>
        <li>mytag:isNumber("이백") => ${ mytag:isNumber("이백") }</li>
    </ul> 

profile
저장소

0개의 댓글

관련 채용 정보