cookie
쿠키는 생성 직후 클라이언트에만 저장되어 있으므로 다시 한 번 방문해서 서버로 전송해줘야 읽을 수 있다.
EL (Expression Language)
표현 언어는 3가지 영역에 저장된 값을 출력할 때 사용한다. 예외와 형변환에 관대하다. null인 변수를 사용할 때, 예외가 발생하지 않는다.
- JSP 내장 객체의 영역(page, request, session, application)에 담긴 속성을 사용할 수 있다.
- 산술 연산, 비교 연산, 논리 연산 가능
- 자바 클래스에 정의된 메서드를 호출할 수 있다.
- HTML, JS, CSS에서 사용할 수 있다. JSP 스크립트 요소(선언부, 표현식, 스크립틀릿)에서는 사용할 수 없다.
- null을 조작, 연산할 때 0으로 인식되어 예외가 발생하지 않는다.
사용법
${ 속성 }
<c:set value="${ elVar }"/> <!-- 액션태그 -->
<jsp:include page="${ pathVar }"/> <!-- jstl -->
${ object["property"] }
${ object['property'] }
${ object.property } // 영어 변수명만 사용 가능
EL 내장객체
- pageScope
- pageContext 내장 객체와 동일
- requestScope
- sessionScope
- applicationScope
<%
pageContext.setAttribute("scopeValue1", "페이지 영역");
request.setAttribute("scopeValue2", "리퀘스트 영역");
session.setAttribute("scopeValue3", "세션 영역");
application.setAttribute("scopeValue4", "어플리케이션 영역");
%>
...
<li>페이지 영역 : ${pageScope.scopeValue1}</li>
<li>리퀘스트 영역 : ${requestScope.scopeValue2}</li>
<li>페이지 영역 : ${sessionScope.scopeValue3}</li>
<li>페이지 영역 : ${applicationScope.scopeValue4}</li>
page영역은 포워딩되면 소멸되고 새 page 영역이 만들어진다.
폼값 처리
JSP : request.getParameter()로 폼값을 받는다
EL :
- param
- paramValues
- 요청 매개변수의 값을 문자열 배열로 받아온다. checkbox로부터 다중 선택 폼 값을 전달받을 때 사용된다.
<li>학력 : ${ param.grade }</li>
<li>관심사항 :
${ paramValues.inter[0] }
${ paramValues.inter[1] }
<li>
객체 전달
- 영역에 객체 인스턴스를 저장하여 사용한다.
- 폼으로는 객체를 전달할 수 없다.
<%
request.setAttribute("integerObj", new Integer(99));
%>
<jsp:forward page="ObjectResult.jsp" />
...
<li>Integer 객체 - ${integerObj}</li>
==================
Integer 객체 - 99
쿠키
쿠키, 헤더값을 el로 읽을 수 있다.
<%
CookieManager.makeCookie(response, "ELCookie", "EL좋아요", 10);
%>
<li>el cookie : ${cookie.ELCookie.value} </li>
<li>host : ${header.host}</li>
클래스 인스턴스의 메서드 호출
- src/main/java 아래에 .java 파일 생성
public class MyELClass {
// 입력받은 숫자의 홀짝 판별
public boolean isEven(int value){
if(value % 2 == 0) return true;
return false;
}
}
- webapp 아래의 jsp 파일에서 호출
- 클래스 인스턴스 생성
- 4가지 영역(page, request, session, application)에 저장
<%
MyELClass myClass = new MyELClass();
pageContext.setAttribute("myClass", myClass);
%>
...
${ myClass.isEven(22) }
JSTL
tag 종류
tag | 기능 | 접두어 |
---|---|---|
core | 변수 선언, 조건/반복문, url 처리 | c |
formatting | 숫자, 날짜, 시간 포맷 지정 | fmt |
xml | xml 파싱 | x |
function | 컬렉션, 문자열 처리 | fn |
sql | db 연결 및 쿼리 실행 | sql |
Core 태그
변수 선언, 조건문, 반복문
태그 | 기능 |
---|---|
set | 변수 설정 |
remove | 변수 제거 |
if | 단일 조건문. else는 없다 |
choose | 다중 조건. when-otherwise |
forEach | for, 향상된 for 두 가지 존재 |
redirect | sendRedirect()와 동일한 기능 |
⇒ forward VS redirect
첫째, URL의 변화여부(변화 O -> redirect, 변화 X -> forward)
둘째, 객체의 재사용여부(재사용 O -> forward, 재사용 X -> redirect)
위와 같은 차이점 때문에 웹 애플리케이션을 작성할 때 forward와 redirect 두 가지 방식 중 하나를 적절히 선택하여 사용해야한다. 예를 들어 게시판 애플리케이션을 작성한다고 해보자. 사용자가 보낸 요청정보를 이용하여 글쓰기 기능을 수행하는 CGI(Common Gateway Interface)가 있다면, 이 CGI의 응답 페이지는 forward와 redirect 중 어느 것을 사용해야 될까? 정답은 redirect이다.
사용자가 실수 혹은 고의로 글쓰기 CGI응답 페이지에서 새로고침을 누르면 어떻게 될까? forward의 경우 요청정보가 그대로 살아있기 때문에 똑같은 글이 여러번 등록될 수 있다. 하지만 redirect의 경우 처음 글을 작성할 때 보냈던 요청정보는 존재하지 않는다. 또한 글쓰기 기능을 하는 URL1이 아닌 URL2로 요청을 보내기 때문에 글쓰기가 여러번 수행되지 않는다.
즉, 시스템(session, DB)에 변화가 생기는 요청(로그인, 회원가입, 글쓰기)의 경우 redirect방식으로 응답하는 것이 바람직하며, 시스템에 변화가 생기지 않는 단순조회(리스트보기, 검색)의 경우 forward방식으로 응답하는 것이 바람직하다.
<c:set> 태그
변수 선언
<c:set var="expVar" value="<%= new Date() %>"/>
<c:set var="betweenVar">변수값 이렇게 설정</c:set>
<c:set var="personVar2" value="<%= new Person() %>" scope="request"/>
<c:set target="${personVar2}" property="name" value="값2" />
변수 사용
${ expVar }
${ betweenVar }
${ requestScope.personVar1.name }
<c:if> 태그
<c:if test="조건" var="변수명" scope="영역">
조건이 true일 때 출력할 문장
</c:if>
속성 | 기능 |
---|---|
test | if문에서 사용할 조건 |
var | 조건의 결과를 저장할 변수명 |
scope | 변수가 저장될 영역 지정 |
- 문자열 tRuE는 대소문자에 상관없이 항상 true 반환 | |
- 공백el공백과 같이 공백이 삽입되면 무조건 false 반환 | |
- test=” ${ result } “ |
<c:redirect> 태그
<c:redirect url="이동할 경로" />
response 내장 객체의 sendRedirect()와 동일하게 페이지 이동 처리
매개변수 전달은 <c:param> 태그 혹은 request 영역 사용
redirect는 request 영역이 공유되지 않음. forward는 request 영역 공유(서버에서 실행되므로)
<c:out> 태그
<c:out value="출력할 변수" default="기본값" escapeXml="특수문자 처리 true/false" />
- 변수가 null이면 default에 지정된 값이 출력된다.
- escapeXml 속성이 true이면 html 태그(마크업 언어)를 사용할 수 있다.
속성 | 설명 |
---|---|
value | 출력할 변수 지정 |
escapeXml | 특수문자를 변환할지 여부. 기본값은 true. 특수기호를 그대로 출력 |
default | value 속성에 값을 지정하지 않았을 때, 기본 출력값 |
formatting(국제화) 태그
국가별로 언어, 날짜, 시간, 숫자 형식을 설정할 때 사용한다.
숫자 포맷팅 및 파싱 fmt:formatNumber
로케일 설정 fmt:setLocale
국가별로 다른 통화 기호나 날짜를 표현할 때 사용
한글로 설정 :
<fmt:setLocale value="ko_kr"/>
<fmt:formatNumber value="10000" type="currency" />
<fmt:formatDate value="${today}" />
========================================
한글로 설정 : ₩10,000 2023. 11. 16.
References
'TIL' 카테고리의 다른 글
[TIL] Git 잘못된 브랜치에서 작업했을 때, 작업 내용을 다른 브랜치로 옮기기 (0) | 2023.11.27 |
---|---|
[AWS] AWS 가입, EC2 인스턴스 생성 (0) | 2023.11.23 |
[TIL] JSP Session, JSESSIONID, sendRedirect() 와 forward() 차이점 (1) | 2023.11.14 |
[TIL] 추상 클래스와 인터페이스 차이 (0) | 2023.11.13 |
[TIL] [DB] 일대다 관계, 제약조건 (0) | 2023.10.31 |