웹 서버(WAS)에서 객체 또는 변수가 생성된 후 유효할 수 있는 범위
request: http요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우
session: 웹 브라우저 별로 변수가 관리되는 경우 사용
application: 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용
Scope명 | 유지범위 | 활용 방법 | JSP 내장 객체 |
---|---|---|---|
pageScope | 요청된 페이지 내부에서 사용 | 지역변수처럼 사용 | pageContext |
requestScope | 요청부터 응답까지 | 데이터 리퀘스트를 할 때 | request |
sessionScope | 브라우저 종료 또는 설정 시간 | 사용자별로 정보 저장 시 | session |
applicationScope | 웹 어플리케이션이 종료될 때까지 | 사용자에게 공통적으로 무엇인가 보여주고자 할 때 | application |
공통함수:
void setAttribute(String Key, Object value); Object getAttribute(String key);
사용자 정의 태그!
우리가 html 등을 직접 만든다고 생각하면 된다!
스크립트릿 사용을 줄이고 태그와 같은 형태로 쓰고, 직접 만드는 경우보단 JSTL을 섞어서 사용한다.
표현 언어(Expression Language)
변수, 자바 객체 혹은 자바빈 객체를 손쉽게 사용하게 해준다.
객체의 메소드도 호출이 가능하며 출력 외에도 사칙, 비교, 논리, 삼항연산이 가능하다.
간단하게 변수나 객체를 참조할 수 있으며, 데이터가 없거나 null 객체를 참조할 때 에러가 발생하지 않는다.
자바빈 객체를 참조하는 방법 :
${저장이름.변수명}
기본적인 연산 사용 가능
${10 + 20} // 사칙연산, 30
${10 * 20} // 사칙연산, 200
${true && false} // 논리연산, false
${10 >= 20} // 논리연산, false
${user.name == "홍길동"? "교수": "학생"} // 3항 연산, 이름이 홍길동이면 교수 출력
배열, 맵 데이터 연동
${myList[0]} // 배열인 경우
${myMap["name"]} // 맵인 경우
특정 스코프에서 사용할 경우
${스코프명.객체id명.객체의 필드}
디폴트는 모든 scope
이름: ${requestScope.m.name}
커스텀 태그 라이브러리
JSP에서 스크립트릿(자바 코드 블록)을 사용하지 않고 HTML 형식을 유지하면서 조건문, 반복문, 간단한 연산 등을 사용할 수 있게 한다.
실제 구현된 라이브러리 파일이 필요하다!
JSTL을 JSP를 사용하려면 taglib 지시어롤 추가해야 한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
c: 접두어, 바꿀 수 있지만 그대로 사용하는 것을 권장
uri: 반드시 정확한 경로를 사용해야!
자바의 if문과 유사하다! (하지만 else는 지원x)
scope도 지정이 가능하지만 필수는 아니다.
<c:if test="조건" [var="결과 변수"] [scope="{page|request|session|application}">
</c:if>
test에서 선언한 조건을 만족하면 태그 내용을 실행한다!
예시)
<c:if test="${msg == 'user1'}" var="result">
test result: ${result}
</c:if>
= msg 속성값이 user1인 경우 결과 출력!
자바의 for문과 유사!
하지만 커스텀 태그 특성상 정밀한 설정이 불가하기 때문에 제공되는 속성을 잘 활용해야 한다.
<c:forEach [var="참조 객체"] [varStatus="상태 정보 변수"] begin="시작" end="종료" [step="반복 단계 증가 값, 1이 기본"]>
반복 출력되는 부분
</c:forEach>
var: 배열, 리스트 등 집합형 객체
varStatus: 반복 진행 상황을 참조하기 위한 객체
주어진 데이터를 모두 순환하지 않고 특정 구간과 상승 단계를 지정할 수 있다.
예시)
<c:forEach var="m" items="${members}" begin="0" varStatus="status" end="5">
index: ${status.index} /
count: ${status.count} <br>
name: ${m.name} <br>
email: ${m.email}<br>
<hr>
</c:forEach>
= members는 이전 페이지에서 전달된 리스트 객체
= 순혼하면서 아이템이 하나씩 m에 전달된다
= status 객체를 통해 인덱스, 횟수 확인
= m으로 참조되는 객체는 name, emial 필드에 대한 get/set 메소드가 있어야 접근 가능
<c:set>: 특정 scope에 값을 저장하는 기능(=setAttribute()) - 문자열, 배열 저장 가능
<c:out>: 출력을 위한 태그
if ~ else if 문 혹은 switch 문과 같은 형식으로 사용할 수 있다.
하지만 복잡한 조건 구성은 권장하지 x
자바의 String Tokenizer와 유사하게 구분자로 문자열을 나눈다. (파싱이라고 함)