Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 11660번
- jquery
- ajax
- 백준
- 생성자
- 2차원배열 구간합
- Java
- this와 this() 차이
- map()
- function test
- MariaDB Query Log
- 슈더코드
- 백준 11659번
- 합배열
- 구간합구하기
- pseudo-code
- interrupted()
- 마리아DB 쿼리 로그
- @AllArgsConstructor
- this
- SQL
- Bean LifecCycle
- 백준 1235번
- json
- 상속과 참조
- select
- 구간합
- 자바 람다식
- @NoArgsConstructor
- InterruptException
Archives
- Today
- Total
평범한 연구소
[JSP|Servlet] JSTL | Core, Fomatting, JSTL Functions 본문
Pront/Javascript
[JSP|Servlet] JSTL | Core, Fomatting, JSTL Functions
soyeonisgood 2022. 10. 4. 20:51JSTL (JSP Standard Tag Library)
- JSP에서는 사용자가 태그를 정의해서 사용하는 것이 가능. 이런 사용자 정의 태그를 커스텀 태그라고 하는데 이들 중 자주 사용하는 것을 표준으로 만들어 놓은 것이 JSTL.
- JSTL은 JSP의 공통적인 핵심 기능을 캡슐화한 태그 모음.
- JSTL은 반복(iteration) 및 조건문, XML 문서 조작을 위한 태그, 국제화 태그 및 SQL 태그와 같은 일반적인 구조 작업 지원.
- JSTL 과 커스텀 태그 및 JSP 액션태그는 XML 기반에서 작성되었기 때문에 모든 태그는 시작 태그와 종료 태그의 쌍으로 이루어져야한다.
- 시간, 날짜, 숫자의 포맷이나 문자열 가공 등의 처리에서 비즈니스 로직과 프러젠테이션 로직을 분리할 수 있다.
- EL(Expression Language)를 사용하여 표현.
JSTL 태그 종류
- Core tags
- 기능: 변수지원, 흐름제어, URL 처리 등
- 접두어(prefix): c
- 참조 구문: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- Fomatting tags
- 기능: 지역, 메시지 형식, 숫자 및 날짜 형식 등
- 접두어(prefix): fmt
- 참조 구문: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- JSTL function
- 기능: 컬렉션 처리, String 처리 등
- 접두어(prefix): fn
- 참조 구문: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions %>
JSTL Core 태그
- 일반 프로그램 언어에서 제공하는 변수선언, 조건, 제어, 반복문 등의 기능 제공
< c:out > | 수식(expression)의 결과를 출력. <%= %> 과 유사. |
< c:set > | JSP에서 사용할 변수 설정 |
< c:if > | 조건에 따라 내부 코드 실행 |
< c:choose > | 여러 조건 처리할 때 사용 |
< c:when > | <c:choose> 하위 태그, 조건에 따라 내부 코드 실행 |
< c:otherwise > | <c:choose> 하위 태그, <c:when> 조건 만족한 것이 없을 경우 실행 |
< c:forEach > | 고정된 횟수 또는 컬렉션, Map의 각 항목을 처리할 때 사용하는 반복문 |
< c:forTokens > | 제공된 구분자(delimeter)로 구분된 토큰을 반복. 문자열을 토큰으로 분할하고 각 토큰을 반복하여 출력 생성하는 데 사용 |
< c:param > | 주로 <c:url>, <c:redirect>, <c:import> 태그와 함께 사용하며 매개변수를 추가 |
< JSTL Core 태그 예제 >
c:forEach
- 고정된 횟수 또는 컬렉션에 대해 중첩 본문 컨텐츠를 반복하는 데에 사용되는 반복 태그.
- 형식
컬랙션 내의 반복
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"]
[end="end"] [step="step"]>
...
</c:forEach>
정수 범위 내의 반복
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin"
end="end" [step="step"]>
...
</c:forEach>
- 주요 속성
- var : 사용할 변수
- items : Collection 객체(List, Map 등), begin속성과 end속성이 없는 경우 필수
- varStatues : 반복 상태를 알 수 있는 변수
- current : 현재 인덱스의 객체
- index : 루프 실행에서의 현재 인덱스 (0부터 시작)
- count : 루프의 실행 횟수 (1부터 시작)
- first : 현재 실행이 첫번째인 경우 (true)
- last : 현재 실행이 마지막이면 true
- begin : begin 속성 값
- end : end 속성 값
- step : step 속성 값
- begin : 반복 시작 인덱스. 정의되지 않을 경우 0. item속성이 없으면 필수.
- end : 반복 종료 인덱스. items 속성이 없으면 필수.
- step : 반복할 때마다 건너뛸 인덱스 개수.
<c:forEach var="n" begin="1" end="9" step="1"> <!-- step: 증가분. 1이면 생략 가능 -->
${param.num} * ${n} = ${param.num * n} <br>
</c:forEach>
<c:forEach var="dan" begin="2" end="9">
<p> ** ${dan} 단 ** </p>
<c:forEach var="n" begin="1" end="9">
${dan} * ${n} = ${dan * n} <br>
</c:forEach>
<p> --------------------- </p>
</c:forEach>
ex15.jsp
<%
request.setCharacterEncoding("utf-8");
List<String> list = new ArrayList<>();
list.add("서울");
list.add("부산");
list.add("대구");
request.setAttribute("list", list);
request.setAttribute("subject", "자바,스프링,HTML,CSS,서블릿");
%>
...
ex15_ok.jsp
<h3>forEach : Collection 객체 반복</h3>
<!-- items는 향상된 for문과 유사. -->
<c:forEach var="a" items="${list}">
<p>${a}</p>
</c:forEach>
<h3>forEach : 메소드 사용</h3>
<p>${subject}</p>
<c:forEach var="a" items="${subject.split(',')}">
<p>${a}</p>
</c:forEach>
ex16.jsp
<%
request.setCharacterEncoding("utf-8");
List<User> list = new ArrayList<>();
list.add(new User("홍길동", 20,"010-1111-1111","자바"));
list.add(new User("너너너", 21,"010-1111-2222","HTML"));
list.add(new User("도도도", 21,"010-1111-3333","CSS"));
list.add(new User("가가가", 20,"010-1111-1000","servlet"));
list.add(new User("후후후", 23,"010-1111-2000","oracle"));
request.setAttribute("list", list);
%>
...
ex16_ok.jsp
<h3>forEach : Collection 객체 반복 출력</h3>
<h3>forEach와 EL을 이용한 출력</h3>
<c:forEach var="vo" items="${list}">
<p> ${vo.name} | ${vo.age} | ${vo.tel} | ${vo.subject}
</c:forEach>
<hr>
<h3>반복 상태 확인: varStatus 속성</h3>
<!-- index:0부터 순서, count:1부터 순서, first:처음여부, last:마지막여부 -->
<c:forEach var="vo" items="${list}" varStatus="status">
<p>
${vo.name} | ${vo.age} | ${vo.tel} | ${vo.subject} |
${status.index } | ${status.count } | ${status.first} | ${status.last }
</p>
</c:forEach>
- Map 접근 가능
ex17.jsp
<%
Map<String, Object> m = new HashMap<>();
m.put("name", "이이이");
m.put("age", 20);
m.put("subject", "servlet");
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> a;
a = new HashMap<>();
a.put("name", "가나다");
a.put("city", "서울");
list.add(a);
a = new HashMap<>();
a.put("name", "누누누");
a.put("city", "경기");
list.add(a);
a = new HashMap<>();
a.put("name", "마마마");
a.put("city", "인천");
list.add(a);
request.setAttribute("map", m);
request.setAttribute("list", list);
%>
...
ex17_ok.jsp
<h2> EL 및 JSTL에서 Map 접근</h2>
<h3>EL에서 Map 접근</h3>
<p> ${map.name} | ${map.age} | ${map.subject}</p>
<hr>
<h3>JSTL에서 Map 접근</h3>
<c:forEach var="a" items="${map}">
<p> ${a.key} : ${a.value} </p>
</c:forEach>
<h3>JSTL에서 List의 Map 접근</h3>
<c:forEach var="m" items="${list}">
<p> ${m.name} | ${m.city} </p>
</c:forEach>
c:out
- 표현식의 결과 출력.
- 형식
body가 없는 경우
<c:out value="value" [escapeXml="{true|false}"] [dafault="기본값"]/>
body가 있는 경우
<c:out value="value" [escapeXml="{true|false}"]>
- 주요 속성
- value : 출력할 값
- default : 변수가 null일 경우 대체 출력되는 값
- escapeXml : "<", ">", 및 "&" 와 같은 문자의 사용 여부를 제어. true로 설정된 경우 이런 문자는 자동으로 해당 XML로 변환. (<, >, & 등)
<h3>EL을 이용한 출력(글자는 red로 출력)</h3>
<p> ${msg} </p>
<hr>
<h3>c:out를 이용한 출력, 기본 escapeXml 이 true로 태그 문자는 그대로 태그 문자로 출력</h3>
<p> <c:out value="${msg}"/>
<hr>
<h3>c:out를 이용한 출력</h3>
<p> <c:out value="${msg}" escapeXml="false"/>
c:if
- 조건문. else 구문이 없다.
- 형식
<c:if test="condition" [var="varName"] [scope="{page|request|session|application}"]>
- 주요 속성
- test : 본문 내용의 실행 여부를 결정하는 조건식. true이면 본문 실행.
- var : 테스트 조건 결과를 저장할 boolean형 변수.
- scope : 조건 결과를 저장할 변수(var에 선언된 변수)의 scope
<c:if test="${not empty param.num}">
<p>
${param.num} : ${ param.num % 2 == 0 ? "짝수" : "홀수" }
</p>
</c:if>
<hr>
<c:if test="${not empty param.num}">
<p>
${param.num} :
<c:if test="${param.num % 2 == 0}">
짝수
</c:if>
<c:if test="${param.num % 2 == 1}">
홀수
</c:if>
</p>
</c:if>
c:choose, c:when, c:otherwise
- 여러 조건 중 하나의 조건을 선택하여 실행
- <c:when> 조건에 만족하는 것이 없으면, <c:otherwise> 태그 내의 본문을 실행한다.
- 주요 속성
- test : 본문 내용의 실행 여부를 결정하는 조건식. true이면 본문 실행.
<c:if test="${not empty param.num }">
<p>
${param.num} :
<c:choose>
<c:when test="${param.num%3==0 && param.num%4==0}">
3과 4의 배수
</c:when>
<c:when test="${param.num%3==0}">
3의 배수
</c:when>
<c:when test="${param.num%4==0}">
4의 배수
</c:when>
<c:otherwise>
3 또는 4의 배수가 아님
</c:otherwise>
</c:choose>
</p>
</c:if>
c:set
- <jsp:setProperty> 액션 태그와 유사. 표현식의 결과를 특정 범위(scope)에 저장한다.
- 형식
<c:set [var="varName"] [value="value"] [target="target" property="propertyName"]
[scope="{page|request|session|application"]/>}
- 주요 속성
- value : 저장할 값 또는 수식
- var : 값을 저장할 변수 이름
- target : JavaBean 또는 java.util.Map의 경우, 속성을 설정할 객체의 이름. JavaBean인 경우에는 해당 setter 속성이 있어야한다.
- property : JavaBean 또는 java.util.Map의 경우, 값을 설정하는 객체의 속성.
- scope : 값을 저장할 변수(var에 선언된 변수)의 scope
<c:set var="n" value="2"/>
<c:set var="result" value="1"/>
<c:forEach var="a" begin="1" end="10">
<c:set var="result" value="${n*result}"/>
<p> ${n} ** ${a} = ${result } </p>
</c:forEach>
c:url
- url을 만들어 URL 인코딩 또는 URL 형식 지정에 사용
- context 속성이 지정된 경우, value와 context의 값은 / 로 시작해야한다.
- context path가 자동으로 추가.
- response.encodeURL() 에 대한 호출 작성의 대체 방법으로 사용된다.
- 형식
<c:url value="value" [context="context"] [var="varName"]
[scope="{page|request|session|application"]/>}
- 주요 속성
- value : 기본 URL
- context : / 다음에 오는 로컬 어플리케이션의 이름. 기본값은 컨텍스트.
- var : 처리된 URL을 표시할 변수명. 기본값은 표시되는 페이지
- scope : 값(url)을 저장할 변수의 scope
c:param
- c:import, c:url 태그에 파라미터를 전달하기 위한 태그.
- 형식
<c:param name="name" value="value"/>
- 주요 속성
- name : 파라미터 이름
- value : 파라미터 값
<!-- 파라미터를 인코딩하여 주소를 만든다. -->
<c:url var="a" value="ex20_ok.jsp">
<c:param name="name" value="홍길동"/>
<c:param name="age" value="20"/>
</c:url>
...
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String age = request.getParameter("age");
name = URLDecoder.decode(name, "utf-8");
%>
<p>이름 : <%=name %></p>
<p>나이 : <%=age %></p>
c:import
- jsp:include 액션 태그와 유사
- 서버 내부 및 서버 외부 자원의 내용을 포함하는 추가 기능이 있다.
- 형식
파라미터를 추가하지 않는 경우
<c:import url="url" [context="context"] [var="varName"] [varReader="varReaderName"]
[scope="{page|request|session|application"] [charEncoding="charEncoding"]/>
파라미터 추가
<c:import url="url" [context="context"] [var="varName"] [varReader="varReaderName"]
[scope="{page|request|session|application"] [charEncoding="charEncoding"]>
<c:param name="name" value="value"/>
</c:import>
<h3> 내부 자원 포함 </h3>
<c:set var="a" value="ex11.jsp"/>
<c:import var="u" url="${a}"></c:import>
<p> <c:out value="${a}"/> 소스 보기 </p>
<c:out value="${u}"/>
<hr>
<p> <c:out value="${a}"/> 소스 실행 결과 보기 </p>
<c:out value="${u}" escapeXml="false"/>
<hr>
<p> c:import 에서 var 속성을 지정하지 않으면 바로 실행 결과 출력 </p>
<c:import url="ex19.jsp"/>
<h3> 외부 자원 포함 </h3>
<c:set var="a" value="https://www.naver.com"/>
<c:import var="u" url="${a}"/>
<p>네이버 홈페이지</p>
<c:out value="${u}" escapeXml="false"></c:out>
<hr>
<p>네이버 소스보기</p>
<c:out value="${u}"/>
<hr>
c:forTokens
- 제공된 delimeter로 구분된 토큰을 반복한다.
- 문자열을 토큰으로 분할하고 각 토큰을 반복하여 출력을 생성하는 데 사용된다.
- 형식
<c:forTokens items="stringOfTokens" delims="delimiter" [var="varName"] [varStatus="varstatusName"]
[begin="begin"] [end="end"] [step="step"]>
...
</c:forTokens>
- 주요 속성
- varStatus : 반복 상태를 알 수 있는 변수
- delims : 문자열을 분류하는 기호
- begin : 지정된 인덱스에 있는 초큰에서 반복 시작. 첫번째 토큰의 인덱스는 0.
- end : 지정된 인덱스의 토큰에서 반복 종료.
<!-- 제공된 구분자로 구분된 토큰을 반복 출력 -->
<c:forTokens var="color" items="red,blue,green" delims=",">
색상명 : <c:out value="${color}"/><br>
</c:forTokens>
JSTL Formatting 태그
- 숫자, 날짜, 시간을 포맷팅하는 기능과 국제화, 다국어 지원 기능 제공.
< fmt:formatNumber > | 특정 형식이나 정밀도로 숫자 값을 형식화하여 출력. |
< fmt:formatDate > | 날짜 정보를 담고 있는 객체를 포맷팅하여 출력 |
< fmt:setLocale > | 로케일 지정. |
< JSTL Fomatting 태그 예제 >
<p> default local : <%= response.getLocale() %> </p>
<p> default local : ${pageContext.response.locale }</p>
<hr>
<h3>통화기호</h3>
<p> 디폴트 : <fmt:formatNumber value="12345.6789" type="currency"/> </p> <!-- ₩12,346 -->
<p>
<fmt:setLocale value="en_US"/>
en_US 통화 : <fmt:formatNumber value="12345.6789" type="currency"/>
</p> <!-- $12,345.68 -->
<p>
<fmt:setLocale value="ko_KR"/>
kr_KO 통화 : <fmt:formatNumber value="12345.6789" type="currency"/>
</p>
<hr>
<h3>숫자</h3>
<p> number : <fmt:formatNumber value="12345.67890" type="number"/> </p>
<p> currency : <fmt:formatNumber value="12345.6789" type="currency"/> </p>
<p> currency : <fmt:formatNumber value="12345.6789" type="currency" currencySymbol="W"/> </p>
<p> percent : <fmt:formatNumber value="0.756" type="percent"/> </p>
<p> pattern=".0" : <fmt:formatNumber value="123455.6789" pattern=".0"/> </p>
<p> pattern : <fmt:formatNumber value="123455.6789" pattern="#,##0.0"/> </p>
<p> pattern : <fmt:formatNumber value="0.6789" pattern="#,##0.0"/> </p>
<p> pattern : <fmt:formatNumber value="0.6789" pattern="#,###.0"/> </p>
<p> pattern : <fmt:formatNumber value="12455.6789" pattern="₩#,##0.0"/> </p>
<h3>날짜</h3>
<c:set var="now" value="<%= new java.util.Date() %>"/>
<p> ${now } </p>
<p> date : <fmt:formatDate value="${now}" type="date"/> </p>
<p> time : <fmt:formatDate value="${now}" type="time"/> </p>
<p> both : <fmt:formatDate value="${now}" type="both"/> </p>
JSTL function 태그
- 문자열을 처리하는 함수를 제공.
fn:contains(A, B) | 문자열A에 문자열B가 포함된 경우 true 반환.(대소문자 구분) |
fn:containsIgnoreCase(A, B) | 문자열A에 문자열B가 포함된 경우 true 반환.(대소문자 구분X) |
fn:startsWith(A, B) | 문자열A의 시작이 B로 시작하는지 확인 |
fn:endsWith(A, B) | 문자열A의 끝이 B로 끝나는 경우 true 반환 |
fn:indexOf(A, B) | 문자열A에서 B가 처음 위치하는 인덱스 반환. 없으면 -1. |
fn:length(A) | 문자열A 길이 |
fn.replace(A, B) | 문자열A에서 B에 해당하는 문자를 찾아 C로 변환 |
fn:substring(A, B, C) | A에서 인덱스번호 B부터 C까지 해당하는 문자열 반환 |
fn.substringAfter(A, B) | A에서 B가 나타내는 이후의 문자열 반환 |
fn.substringBefore(A, B) | A에서 B가 나타내는 이전의 문자열 반환 |
fn.toUpperCase(A) | A를 모두 대문자로 반환 |
< JSTL function 태그 예제 >
<c:set var="str" value="seoul korea"/>
<p> ${fn:contains(str, "kor") ? "kor존재" : "kor없음" } </p>
<p> ${fn:containsIgnoreCase(str, "KOR") ? "kor 존재" : "kor 없음" } </p>
<p> ${fn:startsWith(str, "seoul") ? "seoul 로 시작" : "seoul로 시작하지 않음" } </p>
<p> ${fn:endsWith(str, "korea") ? "korea 로 끝남" : "korea로 끝나지 않음" } </p>
<p> kor의 위치 : ${fn:indexOf(str, "kor") } </p>
<p> substring(str, 6, 9) : ${fn:substring(str, 6, 9) } </p>
<p> substringAfter(str, "seoul") : ${fn:substringAfter(str, "seoul") } </p>
<p> substringBefore(str, "korea") : ${fn:substringBefore(str, "korea") } </p>
<p> length(str) : ${fn:length(str) } </p>
<p> replace(str, "korea", "한국") : ${fn:replace(str, "korea", "한국") }</p>
<p> 대문자로 : ${fn:toUpperCase(str) }
'Pront > Javascript' 카테고리의 다른 글
[Javascript] 쿠키와 세션 (0) | 2022.10.08 |
---|---|
[Javascript] 간단한 유효성 검사 (0) | 2022.10.05 |
[JSP|Servlet] 표현언어(EL) (0) | 2022.10.04 |
[JSP|Servlet] JDBC (0) | 2022.10.02 |
[JSP|Servlet] 에러 페이지 (0) | 2022.10.02 |