▶ JSP Action Tag
- 표준 액션 태그
- include
- forward
- 커스텀 액션 태그
- JSTL Core Library : 변수선언, 조건문, 반복문 등과 관련된 문법을 제공
- JSTL Formatting Library : 숫자, 날짜 및 시간데이터 출력형식을 지정할 때 사용하는 문법을 제공
- formatNumber
- formatDate
- JSTL Functions Library : EL구문에서 사용할 수 있는 메서드를 제공
- OTHERS
- c:import
- c:redirect
- c:catch
▶ JSP Action Tag
: XML기술을 이용해서 기존의 JSP문법을 확장시키는 기술을 제공하는 태그들
=> jstl.jar 파일을 다운로드 후 WebContent/WEB-INF/lib폴더에 추가해야 사용가능하다.
1. 표준 액션 태그
: JSP페이지에서의 별도의 라이브러리 연동 없이 즉시 사용가능하다.
: 태그앞에 jsp: 접두어가 붙는다.
2. 커스텀 액션 태그
1. 표준 액션 태그
▶ include / forward◀
▶ include ◀
1. 기존의 include 지시어를 이용한 방식(정적 include방식 == 컴파일시 포함되는 형태)
<%@ include file="footer.jsp" %>
특징 : include하고 있는 페이지상에 선언되어 있는 변수를 현재 페이지에서도 사용 가능함.
include한 페이지의 year 변수값 : <%= year %>
단, 현재페이지에서 동일한 이름으로 변수를 선언할 수 없었음.
//<% String year = "2022"; %>
2. JSP표준 액션태그를 이용한 include 방식(동적 include방식 == 실행시 포함되는 형태)
<jsp:include page ="footer.jsp" />
<!-- 반드시 시작태그와 종료태그가 있어야 한다.
단, 시작태그와 종료태그 사이에 넣을 값이 없는 경우 시작태그에 / 를 붙여서 표현함 -->
특징1 : include하고 있는 페이지에서 선언된 변수를 공유하지 않는다.
<% String year = "2022"; %>
특징2 : 포함시 include하는 페이지로 내가 원하는 값을 전달할 수 있다.
<jsp:include page ="footer.jsp" >
<jsp:param value="testValue" name="test"/>
</jsp:include>
<jsp:include page ="footer.jsp" >
<jsp:param value="testValue2" name="test2"/>
</jsp:include>
전달받은 param : ${param.test }
▶ forward ◀
<h1>여기는 02_forward.jsp 입니다..</h1>
<jsp:forward page="footer.jsp"/>
<!-- forward 특성상 url은 그대로고 화면만 바뀜. -->
2. 커스텀 액션 태그
▶ JSTL이란 ?
: JSP Standard Tag Library의 약자로 JSP에서 사용되는 커스텀 액션태그.
공통적으로 사용되는 코드들의 집합을 보다 쉽게 사용할 수 있도록 태그화해서 표준으로 제공한다.
* 라이브러리 다운로드 후 추가하기
1) 인터넷을 통해 jstl.jar파일 추가
2) dev폴더에 추가
3) WEB-INF/lib에 추가하기
* JSTL 선언방법
: JSTL을 사용하고자 하는 JSP페이지 상단에 taglib지시어를 사용해서 선언한다.
<%@ taglib prefix= "접두어" url="라이브러리 파일상의 url주소" %>
▶ JSTL 분류
1. JSTL Core Library
: 변수선언, 조건문, 반복문 등과 관련된 문법을 제공
* 변수선언 <c:set var="변수명" value="리터럴" scope="스코프영역을 지정(생략)" />
- 변수를 선언하고 초기값을 대입해두는 기능을 제공
- 해당 변수를 어떤 scope에 담아둘껀지 지정가능함(기본값은 pageScope)
=> 해당 scope영역에 setAttribute함수를 이용해서 key+value형태로 데이터를 담아놓는 형태다
=> c:set을 통해 선언된 변수는 EL로 접근해서 사용할 수 있다.
* 주의사항
- 변수의 타입(자료형)을 별도로 지정하지 않음
- 반드시 해당 변수의 담아주고자하는 초기값 속성을 무조건 추가해줘야 함
(선언과 동시에 초기화 해야함)
<c:set var="num1" value="10" />
<c:set var="num2" scope="request" > 20 </c:set>
num1 변수값 : ${pageScope.num1 }
num2 변수값 : ${requestScope.num2 }
<c:set var="result" value="${num1+num2 }" scope="session" />
result 변수값 : ${result }
* 변수삭제 <c:remove var="제거하고자하는 변수명" scope="스코프영역지정(생략)">;
- 해당 변수를 scope에서 찾아서 제거하는 태그
- scope지정 생략시 모든 scope에서 변수명과 일치하는 값을 모두 제거함
=> 해당 scope에 removeAttribute메서드를 이용해서 제거하는 것과 같다.
삭제전 result : ${result }
1) 특정 scope지정해서 삭제하기
<c:remove var="result" scope="request"/>
request에서 result 삭제 후 : ${result }
<!-- sessionScope에 result를 선언했기 때문에 삭제되지 않는다 -->
2) 모든 scope에서 삭제하기
<c:remove var="result" />
삭제후 result : ${result }
* 변수출력<c:out value ="출력하고자 하는값" default="기본값(생략가능)" escapeXml="true/false"(기본값 true, 생략가능)) >;
- 데이터를 출력하고자 할 때 사용하는 태그
- 기본값 : value에 출력하고자 하는 값이 없을 경우 기본값으로 출력할 내용물을 기술(생략가능)
- escapeXml : 태그로써 해석할지 여부(생략가능)
result : <c:out value="${result }" />
default 설정시 result : <c:out value="${result }" default ="값이 없다.." />
<!--
* escapeXml
생략시 기본값 true => 문자열로 취급
-->
<c:set var="outTest" value="<b>출력 테스트</b>" />
<c:out value="${outTest }" />
<c:out value="${outTest }" escapeXml="false" />
1) 조건문 - if (<c:if test="조건식" >;)
- JAVA의 단독 if문과 비슷한 역할을 하는 태그
- 조건식을 test라는 속성에 속성값으로 작성하는데, 무조건 EL구문으로 작성해야 한다.
<c:if test="${num1 gt num2 }" >
<b>num1이 num2보다 큽니다.</b>
</c:if>
<!-- 조건식이 만족이 되지 않아 출력자체가 되지 않음 -->
<c:if test="${num1 lt num2 }" >
<b>num1이 num2보다 작습니다.</b>
</c:if>
<c:set var="str" value="안녕" />
<c:if test="${str eq '안녕' }" >
<mark>Hello</mark>
</c:if>
<c:if test="${str ne '안녕' }" >
<mark>Good Bye</mark>
</c:if>
2) 조건문 - choose(<c:choose>, <c:when>, <c:otherwise>;)
- JAVA의 if-else, if-else if 또는 switch문과 비슷한 역할을 하는 태그
- 조건식들을 c:choose의 하위요소로 c:when에 작성한다.
<c:choose>
<c:when test="${num1 eq 20 }">
<b>num1은 20입니다</b>
</c:when>
<c:when test="${num1 eq 10 }">
<b>num1은 10입니다.</b>
</c:when>
<c:otherwise>
<b>num1은 10 혹은 20과 일치하지 않습니다.</b>
</c:otherwise>
</c:choose>
3) 반복문 = forEach
for-loop문 -> <c:forEach var="변수명", begin="초기값" end="종료값" step="증감식" />;
향상된 for문 -> <c:forEach var="변수명", items="순차적으로 접근할 컬렉션" varStatus="현재 접근된 요소의 상태값을 보관할 변수명 />"
=> step : 미지정시 기본값은 1
=> varStatus : 생략가능
<!-- for loop문 -->
<% for(int i = 1; i <= 10; i++) { %>
<% } %>
<c:forEach var="i" begin="1" end="10">
반복확인 : ${i } <br>
</c:forEach>
<c:forEach var="i" begin="1" end="10" step="2">
반복확인 : ${i } <br>
</c:forEach>
<!-- 태그내부에서 활용 -->
<c:forEach var="i" begin="1" end="6">
<div id="div${i}">div태그</div>
</c:forEach>
<%
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("홍길동", 20, "남자"));
list.add(new Person("김길동", 30, "남자"));
list.add(new Person("박길동", 15, "남자"));
request.setAttribute("pList", list);
%>
<table border="1">
<thead>
<tr>
<th>순번</th>
<th>이름</th>
<th>나이</th>
<th>성별</th>
</tr>
</thead>
<tbody>
<%-- <% if(!list.isEmpty()) { %> --%>
<%-- <% for(Person p : list ) { %> --%>
<!-- <tr> ... -->
<%-- <% } %> --%>
<%-- <% } %> --%>
<c:choose>
<c:when test="${empty pList }">
<tr>
<td colspan="4">조회결과 없습니다.</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach var="p" items="${pList }" varStatus="s">
<tr align="center">
<td>${s.count }</td> <!-- index : 0부터시작, count : 1부터 시작 -->
<td>${p.name }</td>
<td>${p.age }</td>
<td>${p.gender }</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</tbody>
</table>
4) 반복문 - forTokens
<c:forTokens var="각 값을보관할변수" items="분리식키고자하는 문자열" delims="구분자">;
- 구분자를 통해서 분리된 각각의 문자열에 순차적으로 접근하면서 반복수행
- java의 split("구분자") 또는 StrimgTokenizer와 비슷한 역할
<ul>
<c:forTokens var="d" items="컴퓨터,핸드폰,tv,에어컨,냉장고.세탁기/비데" delims=",/">
<li>${d}</li>
</c:forTokens>
</ul>
<ul>
<c:forTokens var="d" items="컴퓨터,핸드폰,tv,에어컨,냉장고.세탁기/비데" delims=",./">
<li>${d}</li>
</c:forTokens>
</ul>
5) 쿼리스트링 관련 태그 - url, param
- url 경로를 생성해주고 쿼리스트링을 정의할 수 있는 태그
- 넘겨야할 쿼리스트링이 길 경우 사용하면 편리함
<c:url var="변수" value="요청할url주소" >;
<c:param name="키값" value="밸류값">;
<c:param name="키값" value="밸류값">;
...
</c:url>;
<c:url var="query" value="list.do">
<c:param name="currentPage" value="${emtpy currentPage ? 1 : currentPage }" />
<c:if test="${!empty search }">
<c:param name="search" value="${search }"/>
<c:param name="keyword" value="${keyword }"/>
</c:if>
</c:url>
2. JSTL Formatting Library
: 숫자, 날짜 및 시간데이터 출력형식을 지정할 때 사용하는 문법을 제공
2-1) formatNumber
- 숫자데이터의 포맷 지정
- 표현하고자 하는 숫자데이터의 형식을 통화기호, % 등 원하는 쓰임에 맞게 지정하는 태그
<fmt:formatNumber value="출력할값" groupingUsed="true/false"
type="percent/currency" currencySymbol="$" >;
type = "groupingUsed" 기본값 : true(,로 구분자가 찍힘)
type = "percent" : 소숫점을 백분율로 변경해서 출력(0.75 -> 75%)
type = "currency" : 통화단위로 출력. 통화단위는 컴퓨터의 로컬정보 기준
type = "currency" currencySymbol="$" : 통화단위를 $로 변경해서 출력
<c:set var="num1" value="123456789" />
<c:set var="num2" value="0.75" />
<c:set var="num3" value="50000" />
그냥 출력 : ${num1 }
formatNumber : <fmt:formatNumber value="${num1}" /> //세자리마다 구분되어 출력됨.
숫자 그대로 출력 : <fmt:formatNumber value="${num1}" groupingUsed="false" />
percent : <fmt:formatNumber value="${num2}" type="percent"/>
currency : <fmt:formatNumber value="${num3}" type="currency"/>
currencySymbol : <fmt:formatNumber value="${num3}" type="currency" currencySymbol="$"/>
2-2) formatDate
- 날짜 및 시간 데이터의 포맷 지정
- 단, java.util.Date객체를 사용해야 한다.
<c:set var="sysdate" value="<%= new java.util.Date() %>" />
그냥 출력 : ${sysdate}
<ul>
<li>
현재 날짜 : <fmt:formatDate value="${sysdate}" type="date" />
<!-- type속성 생략가능. 생략시 기본값 date --> <br>
</li>
<li>
현재 시간 : <fmt:formatDate value="${sysdate}" type="time" />
</li>
<li>
현재 날짜 및 시간 : <fmt:formatDate value="${sysdate}" type="both" />
</li>
<li>
customizing : <fmt:formatDate value="${sysdate}" type="both"
pattern="yyyy-MM-dd(E) a HH:mm:ss"/>
</li>
</ul>
3. JSTL Functions Library
: EL구문에서 사용할 수 있는 메서드를 제공
<c:set var="str" value=" How are you? " />
str : ${str}
문자열의 길이1 ? : ${str.length()}글자 입니다.
<!-- 문자열(String)의 length()를 사용해도 된다. -->
문자열의 길이2 ? : ${fn:length(str)}글자 입니다.
<!-- 문자열의 길이뿐 아니라 List도 매개변수로 제시하면 사이즈값이 리턴된다 -->
모두 대문자로 출력 : ${fn:toUpperCase(str)}
are의 시작인덱스 : ${fn:indexOf(str, 'are')}
문자열 변환 : ${fn:replace(str, "are", "were")}
<!-- 원본에 영향을 끼치지 않는다 -->
str에 "are" 이라는 문자열이 포함 ? : ${fn:contains(str, 'are')}
str에 "are" 이라는 문자열이 포함 ? : ${fn:contains(str, 'are') ? '포함되어 있음' : "포함되지 않음"}
<!-- 삼항연산자도 사용가능함 -->
문자열 앞,뒤 공백제거 : ${fn:trim(str)}
문자열 잘라주기1 : ${fn:substring(str,0,4)}
문자열 잘라주기2 : ${fn:substringAfter(str,'are')}
<%-- 문자열 잘라주기3 : ${fn:substringAfter(str,'are')} --%>
문자열 나누기 :
<c:forEach var="s" items="${fn:split(str,' ')}" >
${s} <br>
</c:forEach>
배열 합치기 : ${fn:join(fn:split(str,' '), ',')}
<c:set var="htmlStr" value="<h1>a > b || a < b</h1>" />
태그를 문자열로 바꿔주는 함수 : ${fn:escapeXml(htmlStr)}
태그를 그대로 출력 : ${htmlStr}
4. OTHERS
c:import : JSP 페이지에서 다른 페이지를 불러오는 기능
c:redirect : 페이지 재요청해주는 태그
c:catch : 예외처리하기
4-1) c:import
<c:import var="header" url="http://www.google.com" />
<c:out value="${header}" escapeXml="false"/>
- JSP 페이지에서 다른 페이지를 불러오는 기능
- var : 페이지를 저장하는 변수명
- url : 불러올 페이지의 위치(외부 브라우저도 가능)
4-2) c:redirect
<!-- 권한이 없거나 혹은 admin이 아닌 경우 메인페이지로 이동 -->
<c:if test="${empty role or role ne 'admin'}">
// <c:redirect url="/" >
// </c:redirect>
</c:if>
4-3) c:catch
<%
String test = null;
pageContext.setAttribute("test", test);
%>
<c:catch var="e" >
<%= test %> // null
<%= test.charAt(0) %> //java.lang.NullPointerException
</c:catch>
${e}
<!-- 페이지 그대로 유지됨 -->