Today
- 표현언어란?
스크립트 요소의 표현식과 유사하게, 변수의 값을 출력하기 위해 사용되는 문법 요소 입니다.
${변수명} 의 방법으로 사용합니다.
사용법이 비교적 간결하고, 예외오 형변환에 관대합니다.
- 표현언어의 특징
1) JSP 내장 객체의 영역에 담긴 속성을 사용할 수 있습니다.
2) 표현언어 내에서 산술, 비교, 논리 연산 등이 가능합니다.
3) 자바 클래스에 정의된 메서드를 호출할 수 있습니다.
4) 표현언어만의 객체를 통해 JSP와 동일한 기능을 수행할 수 있습니다.
- EL 내 객체 표현 방식
1) . 이용
${객체명.속성명}
→ 속성명에 특수문자(- 등) 미포함 시 이용가능
→ 한글 이용 불가
2) [] 이용
${객체명[속성명]}
→ 속성명에 특수문자(- 등), 한글 포함 가능. 단, "" 또는 ''으로 묶어 줘야함
[예시]
${header.user-agent} (X)
${header.["user-agent"]} (O)
${king.한글} (X)
${king['한글']} (O)
- 기본 사용법
● 4가지 영역 속성에 접근
${pageScope.속성명} - pageCotext.getAttribute("속성명") 처럼 page 영역 내 속성 값을 갖고옵니다.
${requestScope.속성명} - request.getAttribute("속성명") 처럼 request 영역 내 속성 값을 갖고옵니다.
${sessionScope.속성명} - session.getAttribute("속성명") 처럼
session 영역 내 속성 값을 갖고옵니다.
${applicationScope.속성명} - application.getAttribute("속성명") 처럼
application 영역 내 속성 값을 갖고옵니다.
★ 영역 명 없이 속성명만 사용할 경우 가장 작은 영역에서 부터 해당 속성명을 찾습니다.
● request 영역 내 파라미터 값에 접근
${param.파라미터명} - request.getParameter("파라미터명") 처럼
request 영역 내 저정된 파라미터 값을 갖고옵니다. (단건)
${paramValues.파라미터명} - request.getParameterValues("파라미터명") 처럼
request 영역 내 저장된 파라미터 값을 String[] 로 갖고옵니다.
● 헤더 영역에 접근하기
${cookie.쿠키명}
${header.헤더명}
${headerValues.헤더명} - request.Headers("헤더명")
● 그 외
${initParam.파라미터명} - application.getInitParameter()와 동일하게
web.xml 내 작성된 파라미터 값을 갖고옵니다.
${pageContext.접근할속성명} - pageContext 영역의 속성에 접근할 수 있습니다.
- 응용 사용법
● 컬렉션 활용하기
컬렉션 객체를 4가지 영역 중에 저장해서 사용 가능
1) List 객체
${List변수명[idx]}
2) Map 객체
${Map변수명["key명"]}
${Map변수명['key명']}
${Map변수명.key명}
● EL 내 연산자
1) 할당 연산자
${num = 11} - 할당과 동시에 출력
${num = 11;''} - 할당만 하고 출력은 안 함
2) 산술 연산자
${num1 + num2} - 덧셈
${num1 - num2} - 뺄셈
${num1 * num2} - 곱셈
${num1 / num2} ${num1 div num2} - 나눗셈
${num1 % num2} ${num1 mod num2} - 나머지
3) 비교 연산자
${num1 > num2} ${num1 gt num2} - 좌측이 우측보다 크면 ture 아니면 false
${num1 >= num2} ${num1 ge num2} - 최측이 우측보다 커거나 같으면 ture 아니면 false
${num1 < num2} ${num1 lt num2} - 좌측이 우측보다 작으면 ture 아니면 false
${num1 <= num2} ${num1 le num2} - 좌측이 우측보다 작거나 같으면 ture 아니면 false
${num1 == num2} ${num1 eq num2} - 좌측과 우측이 같으면 ture 아니면 false
${num1 != num2} ${num1 ne num2} - 좌측과 우측이 다르면 ture 아니면 false
4) 논리 연산자
${조건1 && 조건2} ${조건1 and 조건2} - AND 연산자
${조건1 || 조건2} ${조건1 or 조건2} - OR 연산자
${!조건1} ${not 조건1} - NOT 연산자
5) empty 연산자
${empty 변수명} - 해당 변수가 null / 빈 문자열 / 길이가 0인 배열 / size가 0인
리스트 일 때 ture을 반환
6) 삼항 연산자
${조건 ? true일 때 결과 : false일 때 결과}
● 메서드 사용
1) 인스턴스 메서드
객체를 만들어 4가지 영역 중에 저장하여 해당 속성명으로 접근하여 사용 가능
${저장한속성명.메서드명()}
2) 정적 메서드
해당 클래스 자체로 접근하여 메서드 사용 가능 (정적 클래스일 경우)
${클래스명.메서드명()}
3) TLD 사용
TLD란? Tag Libaray Descriptor로 사용자 정의 태그나, JSTL 태그를 설정하기위한 XML 파일 입니다.
단, 파일 확장자는, xml 이 아니라 tld를 사용 합니다.
1) webapp > WEB-INF 폴더 내 .tld 파일 추가
2) 위 .tld파일에
...생략
<tlib-version>1.0</tlib-version>
<short-name>메서드 짧은 이름</short-name>
<function>
<name>메서드 이름</name>
<function-class>패키지.클래스</function-class>
<function-signature>리턴타입 메서드명(인자)</function-signature>
<function>
* 이 때 Java의 기본자료형이 아닌 타입을 작성 시에는 패키지명까지 풀네임으로 작성해야 합니다.
3) 사용할 JSP 문서에서 <%@ taglib %>로 갖고와서 사용
=> 예전에 쓰던 방식으로 현재는 사용 X 그래도 레거시 코드를 읽을 수는 있어야함.
- JSTL이란?
JSP Standard Tag Library로 JSP에서 자주사용되는 기능들을 태그 형식으로 만들어놓은 라이브러리 입니다.
태그 형식으로 작성할 수 있기 때문에, 스크립트 요소보다 보기 깔끔하고 간결할 수 있습니다.
- JSTL 종류
1) ★ Core 태그 : 변수 선언, 조건문/반복문, URL 처리 등
접두어 - c / URI - jakarta.tags.core
2) Formatting 태그 : 숫자, 날짜, 시간 포맷 지정
접두어 - fmt / URI - jakarta.tags.fmt
3) XML 태그 (접두어 x) : XML 파싱
접두어 - x / URI - jakarta.tags.xml
4) Function 태그 : 컬렉션, 문자열 처리 (잘 안씀 - 사용자 정의 메서드 EL에서 사용가능해서)
접두어 - fn / URI - jakarta.tags.functions
5) SQL 태그 : 데이터베이스 연결 및 쿼리 실행 (잘 안씀 - 이거보다는 JDBC 커넥터 이용하기 때문)
접두어 - sql / URI - jakarta.tags.sql
- JSTL 사용 방법
1) 지시어 선언
<%@ taglib prefix="접두어" uri="해당 태그의 URI" %>
2) JSP 문서 내 JSTL 태그 사용
<접두어:태그명 ~~~ /> 또는 <접두어:태그명 ~~~> 내용 </접두어:태그명>
- Core 태그
1) set : 변수 선언 또는 자바빈즈 생성
[변수 선언]
<c:set var="변수명" value="값" scope="4가지 영역 중 작성 / 생략 시 page" />
또는
<c:set var="변수명" scope="4가지 영역 중 작성 / 생략 시 page">
값
</c:set>
[자바빈즈 생성]
<c:set var="변수명" value="<%= new 저장할 빈즈클래스%>" scope="4가지 영역 중 작성 / 생략 시 page" />
<c:set target="${위 설정한 변수명}" property="속성명" value="값" />
2) remove : 설정한 변수 제거
<c:remove var="변수명" scope="4가지 영역 중 작성 / 생략 시 모든 영역 내 해당 변수 삭제" />
3) if : 단건 조건 비교 (else 절이 해당 조건 여부가 True일 때만 내용 실행 됨)
<c:if test="${조건절}" var="변수명" scope="4가지 영역 중 작성 / 생략 시 page">
조건이 True일 경우 실행될 내용
</c:if>
${변수명} => 이걸로 실행시킴
* 조건절 부분에 EL이 아닌 일반 형식이 들어오면 무조건 false를 반환(단, 일반형식으로 true 그 자체는 true로 반환)
* 위 일반 형식 true일 경우 true이든 TRUE이든 tRuE이든 전부 true로 봄
* 조건절 부분에서 test=" ${} "이런식으로 공백이 있으면 false로 반환함(EL내부에서 공백은 상관 X)
4) choose/when/otherwise : 다중 조건 비교
<c:choose>
<c:when test="${조건절1}">해당 조건절1이 true일 경우 실행 내용</c:when>
<c:when test="${조건절2]">해당 조건절2가 true일 경우 실행 내용</c:when>
<c:otherwise>위 조건절 중 아무 조건도 해당 안 될 때 실행 내용</c:otherwise>
</c:choose>
5) forEach : 반복문 (일반형 / 향상된 for문형)
[일반형]
<c:forEach var="변수명(i,j이런거)" begin="시작값" end="종료값" step="증가할 값">
반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
</c:forEach>
[향상된 for문형]
<c:forEach var="변수명(i,j이런거)" items="<%=컬렉션 혹은 배열%>">
반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
<c:forEach>
* JSTL의 forEach에는, status="status변수명" 으로 설정하여 현재 for문의 상태를 반복문 내에서 출력할 수 있음
사용가능한 값
① current : for문에 지정한 변수에 현재 담긴 값
② index : for문에 지정한 변수의 index를 반환(일반 for문에서는 current와 동일)
③ count : 실제 반복 횟수
④ first : 첫번째 반복일 경우만 true 반환
⑤ last : 마지막 반복일 경우만 true 반환
6) forTokens : 구분자를 기준으로 문자열을 나눈 것을 토큰이라하며, 해당 토큰 개수만큼 반복진행
<c:forTokens var="토근을 담을 변수" items="자를 문자열" delims="구분자">
반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
</c:forTokens>
* forTokens에서 items에 들어갈 대상은 문자열만 가능합니다. 배열 X / 컬렉션 X
7) import : 외부 파일을 현재 위치에 삽입 (<jsp:include>와 동일)
[기본 사용법]
<c:import url="가져올 경로" var="해당 import문을 담을 변수 / 생략 시 바로 실행" />
[파라미터 담아서 가기]
<c:import url="가져올 경로" var="해당 import문을 담을 변수 / 생략 시 바로 실행">
<c:param name="파라미터 명" value="값"/>
</c:import>
또는 url="파일경로?쿼리스트링" 부분에 경로에 쿼리스트링 담아서 같이 보내기
* import문에서 var="해당 import문을 담을 변수" 속성 지정 시 import문 선언만 하고 실행은 추후 해당 변수를 이용해서 원할 때 실행할 수 있으며, 생략 시 해당 지점에서 바로 실행됩니다.
* <jsp:include>와 동일하기 때문에 request영역이 공유 됨 (page 영역은 공유 안됨)
8) redirect : 페이지 이동 처리 (response.sendRedirect()와 동일)
[기본 사용법]
<c:redirect url="이동할 경로" />
[파라미터 담아서 가기]
<c:redirect url="이동할 경로">
<c:param name="파라미터 명" value="값"/>
</c:import>
* resposne.sendRedirect와 동일하기 때문에 request영역은 공유되지 않습니다.
따라서 값을 공유하려면 c:param으로 파라미터를 공유해야합니다.
9) url : url을 변수에 저장합니다.(경로를 입력하면 알아서 컨텍스트 루트를 포함하여 URL로 변환하여 저장 해줌) - 굳이 왜 쓸까 싶음
<c:url value="저장할 경로" var="변수명" />
10) out : 표현식 처럼 변수를 출력할 때 사용
<c:out value="${출력할 변수}" default="value에서 지정한 변수의 값이 null일 경우 출력"
escapeXml="태그를 문자 그대로 출력할 경우 true, 태그를 적용할 경우 false(생략할 경우 true)"
11) catch : 예외를 잡아 처리하는 역할
<c:catch var="변수명">
실행할 코드(스크립트 요소 / EL 등)
</c:catch>
* ${예외를 담은 변수명} 으로 예외 내용도 출력 가능
- Formatting 태그
1) 숫자 포맷팅 및 파싱
[숫자 포맷팅]
<fmt:formatNumber value="출력할 숫자" type="출력양식"
var="해당 포맷팅 숫자를 담을 변수 / 생략 시 바로 출력"
groupingUsed="세자리마다 콤마 출력할 경우 true(기본값) / 아니면 false"
pattern="숫자 패턴" scope="변수를 저장할 영역" />
* type 속성 값 예시 : percent / currency / number(기본값)
* var="해당 포맷팅 숫자를 담을 변수" 속성 지정 시 포맷팅 선언만 하고 출력은 추후 해당 변수를 이용해서 원할 때 출력할 수 있으며, 생략 시 해당 지점에서 바로 출력됩니다.
[숫자 파싱]
<fmt:parseNumber value="파싱할 문자열" type="출력양식"
var="해당 값을 담을 변수명"
integerOnly="정수만 파싱할 경우 ture / 아니면 false(기본값)"
pattern="숫자 패턴" scope="변수를 저장할 영역" />
* type 속성 값 예시 : percent / currency / number(기본값)
2) 날짜 포맷 및 타임존
[날짜 포맷팅]
<fmt:formatDate value="출력할 날짜" type="출력양식" var="해당 값을 담을 변수명"
dateStyle="날짜 스타일" timeStyle="시간 스타일"
pattern="날짜 패턴" scope="변수를 저장할 영역" />
* type 속성 값 예시 : date(날짜만) / time(시간만) / both(둘 다)
* dateStyle 속성 값 예시
: default(YYYY. MM. DD) / short(YY. MM. DD) / long(YYYY년 MM월 DD일) / full(YYYY년 MM월 DD일 D요일)
* timeStyle 속성 값 예시
: default(오전/오후 HH:MM:SS) / short(오전/오후 HH:MM) / long(오전/오후 HH시 MM분 SS초 KST) / full(오전/오후 HH시 MM분 SS초 대한민국 표준시)
[타임존 설정]
<fmt:timeZone value="설정할 타임존">
위 설명한 날짜 포맷팅 태그 이용
</fmt:timeZone>
* 대표적 타임존 : GMT(그리니치 천문대) / America/Chicago(미 중부 표준 시)
3. 로케일 설정 : 국가별로 다른 통화 기호나 날짜를 표현할 때 사용
<fmt:setLocale value="기준 국가 코드">
* 대표적 국가 코드 : ko_kr (한국) / ja_JP (일본) / en_US (미국)
Review
- 액션태그, EL, JSTL...모든게 짬뽕되서 머리가 어질함. 쓰다보면 정리가 되지 않을까 싶습니다.
- JSTL 중 XML부분은 간단히 읽어만 보기
TO DO