티스토리 뷰

1) EL: Expression Language

- 값을 표현하는데 사용되는 스크립트 언어로 JSP의 기본 문법을 보완하는 역할을 함

> JSP에는 HTML도 들어가고, 자바 코드도 들어가고 막 섞여있음. 프론트 개발자와 백엔드 개발자 모두가 읽기 편하게 할 수는 없을까? 라는 고민에서 출발.

 

- EL의 기능

> JSP의 스코프에 맞는 속성 사용

> 집합 객체에 대한 접근법 제공

> 수치연산, 관계연산, 논리연산자 제공

> 자바 메소드를 호출할 수 있는 기능 제공

> EL만의 기본 객체 제공: pageContext, pageScope, requestScope, param, header, cookie, ...

 

- 기본 문법: ${exp}

ex) <b>${member.id}</b>님이 로그인하셨습니다.

ex) ${param.code} = 자바코드 request.getParameter("code") 에 해당

 

- 객체 접근: ${exp1.exp2}

> exp1이나 exp2가 null이면 null을 리턴

> exp1이 Map일 경우, exp2를 key로 한 값을 리턴

> exp1이 리스트/배열이고 exp2가 정수이면 해당 인덱스에 해당하는 값을 리턴

> exp1이 객체일 경우 exp2에 해당하는 getter 메서드를 호출한 결과를 리턴

 

- 연산자 사용: 다른 프로그래밍 언어들과 크게 다르지 않음

> 단, 몇몇 연산자를 영문자로 대체할 수도 있음 (ex: < 연산자같은 경우 HTML에서도 많이 쓰이는거라 헷갈릴 수 있으므로 lt로 써도 됨)

> empty 연산자라는 것도 있음. 뒤에 오는게 null이나 빈 문자열, 빈 리스트 같은거면 true를 리턴함

 

- EL을 비활성화하기: <%@ page isELIgnored = "true" %>

기본값은 false이므로 이걸 추가해주지 않으면 기본적으로 EL을 사용하게 된다 (서블릿 2.4버전부터).

 

[예제]

 

<%
pageContext.setAttribute("page", "this is page scope value");
%>
...
<body>
page scope value: ${pageScope.page} <br>
</body>

> 참고: page라는 변수 이름이 모든 scope 통틀어서 중복 없이 유일하다면, pageScope를 생략하고 그냥 ${page} 라고 써도 나온다. 하지만 명시적으로 써주는게 아무래도 이해하기 좋을 듯.

 

<%
request.setAttribute("a", 10);
request.setAttribute("b", true);
%>
...
<body>
k / 5: ${k div 5} <br> // 2.0 출력
!b: ${!b} <br> // false 출력
</body>

2) JSTL: JSP Standard Tag Library

- JSP에서 자바 코드를 '태그' 형식으로 대체할 수 있게 해준다. 

- 쓰는 이유는 EL과 마찬가지로 프론트 개발자들에게 좀 더 친숙한 코드를 위함... (진짜?)

- EL과 연동해서 활용

 

- 사용 준비: '라이브러리' 라는 이름대로 import를 시켜줘야 한다.

이 사이트에서 jar 파일 3개를 다운로드받아서, WEB-INF/lib/ 폴더에 넣어주면 됨

 

- 태그 분류: 크게 5가지 분류로 나뉨

> 코어, XML, 국제화, DB, 함수

 

- 코어 태그

> 변수 제어: set, remove

> 흐름 제어: if, choose, forEach, forTokens

> URL 처리: import, redirect, url

> 기타: catch, out

 

- 코어 태그: 예제

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
// 코어 라이브러리를 쓰겠다는 선언이자, JSTL 태그가 c: 로 시작 (prefix) 하게 정의하겠다는 의미
<c:set var="value1" scope="request" value="test"></c:set>
// set 태그는 변수를 세팅할 수 있음. request.setAttribute("value1", "test"); 와 같은 의미를 가짐

...

삭제전: ${value1 } <br>
<c:remove var="value1" scope="request"/> // remove로 값을 삭제할 수 있음
삭제후: ${value1 } <br> // value1이 없어졌으므로 아무 값도 뜨지 않음

> 객체의 프로퍼티 세팅

<c:set target="${some}" property="propertyName" value="anyValue" />

 

some 객체가 자바빈 (?) 일 경우: some.setPropertyName(anyvalue)

some 객체가 map일 경우: some.put(propertyName, anyValue);

 

- 흐름제어 태그

> 조건문: if와 choose가 있음. if에는 대응되는 else는 없고, choose가 if-else랑 유사함

<c:if test="조건">

...

</c:if>

 

<c:choose>

 <c:when test="조건1">

 ...

 </c:when>

 <c:when test="조건2">

 ...

 </c:when>

 <c:otherwise>

 ...

 </c:otherwise>

</c:choose>

 

<c:if test="${18<param.age}">
당신의 나이는 19세 이상입니다.
</c:if>

> 반복문: forEach

<c:forEach var="변수" items="아이템" [begin="시작인덱스"] [end="끝인덱스"]>

여기서 "아이템" 이란 배열, 리스트, iterator, enumeration, map 등 컬렉션 타입을 의미

 

<%
List<String> list = new ArrayList<>(); // ArrayList를 쓰기 위한 page import 필요
list.add("hello");
list.add("world");
list.add("!");
request.setAttribute("list", list); // "list" 라는 이름으로 ArrayList를 저장했음 
%>
...
<c:forEach items="${list}" var="item">
// item이라는 이름으로 list[0], list[1]... 이 저장된다는 뜻. 파이썬으로 치면 for item in list:
${item } <br>
</c:forEach>

> import 태그

지정한 URL에 연결하여 그 페이지의 내용을 읽어오고, 그 결과를 지정한 변수에 저장함.
(그 페이지에서 특정한 내용을 지정해서 긁어오는 건 아닌 것 같고 그냥 다 긁어옴. 특정 내용만 추출하려면?)

 

<c:import url="URL" charEncoding="인코딩" var="변수명" scope="범위">

 <c:param name="파라미터이름" value="값"/> // URL 뒤에 ? 하면서 붙는 그 쿼리문자열까지 포함하는 것. optional 

</c:import>

 

<c:import url="http://localhost:8080/webapp/testpage.jsp" var="value" scope="request"></c:import>
...
읽어들인 값 : ${value}

> redirect 태그: response.sendRedirect() 와 유사한 역할. 이 리다이렉트가 들어있으면 그냥 그 페이지로 간다.

<c:redirect url="대상URL">

 <c:param name="전달할_파라미터이름" value="값"/>

</c:redirect>

 

> out 태그: JspWriter (그러니까 그냥 JSP 페이지 화면) 에 데이터를 출력함.

<c:out value="값" escapeXml="{true|false}" default="value에서 지정한 값이 없을때 출력할 기본값" />

 

<c:set var="a" value="<script type='text/javascript'> alert(123);</script>" />
${a } // 자바스크립트가 실행되면서 alert 창에 123이라는 문자열이 뜸
<c:set var="a" value="<script type='text/javascript'> alert(123);</script>" />
<c:out value="${a }" escapeXml="true" /> // alert 창이 뜨지 않고 위의 문자열이 그대로 화면에 뜸

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함