부스트코스 강의를 듣고 정리한 내용.
Expression Language
표현 언어(Expression Language(란 값을 표현하는데 사용되는 스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다.
표현 언어가 제공하는 기능
- JSP의 scope에 맞는 속성 사용
- 집합 객체에 대한 접근 방법 제공
- 수치 연산, 관계 연산, 논리 연산자 제공
- 자바 클래스 메소드 호출 기능 제공
- 표현 언어만의 기본 객체 제공
표현 언어의 표현 방법
문법
${expr }
표현언어는 JSP의 스크립트 요소 (스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, 표현식을 통해 보다 편리하게 값을 출력할 수 있다.
예제
<jsp:include page="/module/${skin.id}/header.jsp" flush="true" />
<b>${sessionScope.member.id}</b>님 환영합니다.
표현 언어의 기본 객체
예제
EL에 익숙해지면 자바 코드로만 짤 때보다 훨씬 간결하게 JSP 코드를 작성할 수 있음.
표현 언어의 데이터 타입
- boolean: true/false
- int: 0~9. 음수의 경우 앞에 ‘-‘
- real number: 0~9. 소수점 사용 가능 & 지수형으로 표현 가능
- string: ‘ 또는 “로 둘러싼 문자열. 만약 작은 따옴표를 사용해 표현할 경우 값에 포함된 작은 따옴표는 \과 함께 사용해야 함.
- null
객체 접근 규칙
${표현1.표현2}
- 표현 1이나 표현 2가 null이면 null 리턴
- 표현 1이 map일 경우 표현2를 key로 하는 value 리턴
- 표현 1이 list인 경우
- 표현 2가 정수이면 해당 정수번째 인덱스에 해당하는 값 리턴
- 정수가 아닐 경우 오류 발생
- 표현 1이 객체일 경우 표현 2에 해당하는 getter 메소드에 해당하는 메소드를 호출한 결과 리턴
표현 언어의 수치 연산자
- +: 덧셈
- -: 뺄셈
- *: 곱셈
- / 또는 div: 나눗셈
-
% 또는 mod: 나머지
- 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환 후 연산자 수행
${"10"+1}
->${10+1}
- 숫자로 변환할 수 없는 객체와 수치 연산자를 함께 사용하면 에러 발생
${"열"+1}
-> 에러
- 수치 연산자에서 사용되는 객체가 null이면 0으로 처리
${null+1}
->${0+1}
표현 언어의 비교 연산자
==
또는 eq!=
또는 ne<
또는 lt>
또는 gt<=
또는 le>=
또는 ge- 문자열 비교:
${str=='값'}
또는str.compareTo("값")==0
표현 언어의 논리 연산자
&&
또는 and||
또는 or!
또는 not
empty 연산자, 비교 선태 연산자
문법
empty 값
- 값이 null이면 true 리턴
- 값이 ““이면 true 리턴
- 값이 길이가 0인 배열이면 true 리턴
- 값이 빈 map이면 true 리턴
- 값이 빈 collection이면 true 리턴
- 이 외의 경우에는 false 리턴
연산자 우선순위
[]
()
-
(단일)not
!
empty
*
/
%
mod
+
-
<
>
<=
>=
lt
gt
le
ge
==
!=
eq
ne
&&
and
||
or
? :
표현 언어 비활성화: JSP에 명시하기
<%@ page isELIgnored = "true" %>
실습
각각의 scope에다가 값을 설정하고 그 값들을 EL 코드를 사용해 출력해보자.
el01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
pageContext.setAttribute("p1", "page scope value");
request.setAttribute("r1", "request scope value");
session.setAttribute("s1", "session scope value");
application.setAttribute("a1", "application scope value");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
pageContext.getAttribute("p1"): ${pageScope.p1}<br>
request.getAttribute("r1"): ${requestScope.r1}<br>
session.getAttribute("s1"): ${sessionScope.s1}<br>
application.getAttribute("a1"): ${applicationScope.a1}<br>
pageContext.getAttribute("p1"): ${p1}<br>
request.getAttribute("r1"): ${r1}<br>
session.getAttribute("s1"): ${s1}<br>
application.getAttribute("a1"): ${a1}<br>
</body>
</html>
사칙연산 및 논리연산 예제
el02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
request.setAttribute("k",10);
request.setAttribute("m", true);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
k: ${k }<br>
k + 5: ${k+5 }<br>
k - 5: ${k-5 }<br>
k * 5: ${k*5 }<br>
k / 5: ${k div 5 }<br>
k : ${k }<br>
m : ${m }<br>
k > 5 : ${ k > 5 } <br>
k < 5 : ${ k < 5 } <br>
k <= 10 : ${ k <= 10} <br>
k >= 10 : ${ k >= 10 } <br>
m : ${ m } <br>
!m : ${ !m } <br>
</body>
</html>
JSTL
JSTL(JSP Standard Tag Library)은 JSP 페이지에서 조건문 처리, 반복문 처리 등을 HTML 태그 형태로 작성할 수 있게 도와줌
JSP는 스크립트릿의 자바 코드와 HTML 태그가 섞여있는 형태. 개발의 편의성은 높았지만 HTML 태그와 자바 코드가 섞여있어서 프론트 개발자가 코드를 수정하기가 어려워 유지보수가 어렵다는 문제점이 있다.
이러한 문제를 해결하기 위해 등장한 것이 JSTL이다. JSTL은 태그 형식으로 로직을 수행할 수 있도록 도와주기 때문에 프론트 개발자가 더 편하게 쓸 수 있다.
JSTL을 사용하려면?
http://tomcat.apache.org/download-taglibs.cgi
위의 사이트에서 세 가지 jar 파일을 다운로드한 후 WEB-INF/lib/ 폴더에 복사
JSTL이 제공하는 태그의 종류
코어 태그
코어 태그: 변수 지원 태그 - set, remove
- 변수 설정: 지정한 scope에 변수 생성
<c:set var="varName" scope="session" value="someValue" /> <c:set var="varName" scope="request"> some Value </c:set>
- 변수 제거
<c:remove var="varName" scope="request" />
jstl01.jsp
- 이클립스는 파일들에 대한 정보를 저장하고 있기 때문에 파일을 새로 넣고 뺄 때는 파일탐색기에 갖다 붙이는게 아니라 이클립스 상에서 drag해줘야 함!
- JSTL은 커스텀 태그 사용 가능. 그래서 prefix를 지정해 놓는게 좋음
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="value1" scope="request" value="jin"></c:set>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
이름: ${value1 }
<c:remove var="value1" scope="request"/>
</body>
</html>
코어 태그: 변수 지원 태그 - 프로퍼티, 맵의 처리
<c:set target="${some)" property="propertyName" value="anyValue" />
- target:
<c:set
으로 지정한 변수 객체 - some 객체가 자바빈일 경우:
some.setPropertyName(anyValue)
- some 객체가 맵일 경우:
some.put(propertyName, anyValue)
코어 태그: 흐름 제어 태그 - if
<c:if test="조건">
...
...
</c:if>
예제
<c:if test="${param.name == 'bk'}">
name 파라미터의 값이 ${param.name}입니다.<br>
</c:if>
코어 태그: 흐름 제어 태그 - choose
<c:choose>
<c:when test="조건1">
</c:when>
<c:when test="조건2">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
코어 태그: 흐름 제어 태그 - forEach
배열 및 collection에 저장된 요소를 차례대로 처리한다.
<c:forEach var="변수" items="아이템" [begin="시작번호"] [end="끝번호"]>
${변수}
</c:forEach>
- var: EL에서 사용될 변수명
- items: 배열, list, iterator, enumeration, map 등의 collection
- begin: items에 지정한 목록에서 값을 읽어올 인덱스의 시작값
- end: item에 지정한 목록에서 값을 읽어올 인덱스의 끝값
item이 map인 경우 변수에 저장되는 객체는 map, entry이다. 따라서 변수값을 사용할 때는 ${변수.key}와 ${변수.value}를 사용해 밉에 저장된 항목의 <키, 값> 매핑에 접근할 수 있다.
jstl04.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="n" scope="request" value="10"/>
<%
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("!!!!");
request.setAttribute("list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:forEach items="${list }" var="item" begin="1">
${item }<br>
</c:forEach>
</body>
</html>
코어 태그: 흐름 제어 태그 - import
지정한 URL를 읽어들인 후 결과를 지정한 변수에 저장한다.
<c:import url="URL" charEncoding="캐릭터인코딩" var="변수명" scope="범위">
<c:param name="파라미터이름" value="파라미터값" />
</c:import>
<c:param>
: url 속성에 지정한 사이트에 연결할 때 전송할 파라미터 입력
예제
<c:import url="http://media.daum.net/" charEncoding="euc-kr" var="daumNews" scope="request">
<c:param name="_top_G" value="news" />
</c:import>
원하는 URL의 내용을 읽어올 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="https://google.com" var="urlValue" scope="request"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${urlValue }
</body>
</html>
코어 태그: 흐름 제어 태그 - redirect
지정한 페이지로 리다이렉트한다. response.sendRedirect()와 비슷
문법
<c:redirect url="리다이렉트할 URL">
<c:param name="파라미터 이름" value="파라미터값" />
</c:redirect>
코어 태그: 기타 태그 - out
JspWriter에 데이터를 출력한다.
<c:out value="value" escapeXml="${true|false}" default="defaultValue" />
- value: JspWriter에 출력할 값을 나타낸다. 일반적으로 value 속성의 값은 String과 같은 문자열이다. 만약 value의 값이 java.io.Reader의 한 종류라면 out 태그는 Reader로부터 데이터를 읽어와 JspWriter에 값을 출력한다.
- escapeXml: 이 속성의 값이 true일 경우 아래 표와 같이 문자를 변경한다. 생략할 수 있으며, 생략할 경우 기본값은 true이다.
- default: value 속성에서 지정한 값이 존재하지 않을 때 사용될 값을 지정한다.
문자 | 변환된 형태 |
---|---|
< | < |
> | > |
& | & |
’ | ' |
” | " |
예제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="t" value="<script type='text/javascript'>alert(1);</script>" />
<c:out value="${t }" escapeXml="false"/>
</body>
</html>