Scriptlet 을 최소화 시키려 하는 이유는 JAVA LOGIC 과 HTML 을 분리 시키기 위해서 이다.
JAVA Bean 을 이용 하면 JAVA CODE 의 일부를 분리 할 수 있다.
id = 빈을 호출할때 사용할 이름
class = 사용할 빈 클래스의 위치
scope = page, request, session, application
<jsp:useBean id="" class="" scope=""/>
<!-- Scriptlet 사용 -->
<%--
String name = request.getParameter("userName");
firstBean.setName(name);
response.sendRedirect("result.jsp");
--%>
<!-- Action tag 사용 -->
<!--
name = 사용할 빈 이름
property = 사용할 멤버 변수
value = 값을 직접 넣을때
param = 파라메터를 받아서 넣을때
-->
<jsp:setProperty name="firstBean" property="name" value="홍길동"/>
<jsp:setProperty name="firstBean" property="name" param="userName"/>
<!-- 액션태그에는 redirect가 없어서 forward를 사용해야 한다. -->
<jsp:forward page="result.jsp"/>
Expression Language Tag
<%%>을 간단하게 표현하기 위함이 목적
Scriptlet을 줄이기 위해 Action tag 를 사용 한 것처럼 개발자들은 Custom Tag를 제작 할 수 있으며 이중 자주 사용되고 유용한 것들을 모아 만든 라이브러리가 JSTL이다.
jsp 파일 최상단에 아래와 같은 내용을 추가 해 준다.
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
Set
<c:set var="변수명" value="값" [scope="영역"]/>
<c:set var="변수명" [scope="영역"]>값</c:set> //scope영역 생략시 -> page
<c:remove var="변수명"/> //변수 삭제
if
java의 if 문과 비슷한 기능을 제공
<c:set var="myId">admin</c:set>
<c:if test="${myId eq 'admin'}" var="result">myId 는 admin 이 맞습니다.</c:if>
choose
java에서 switch와 비슷한 형태이다(조건식이 들어간다.)
else 역할을 하는 c:otherwise가 존재한다.
<c:choose>
<c:when test="${param.num ==0}">
forEach
array, collection 등에 저장되어 있는 값들을 순차처리 할 때 활용된다.
c:forEach var="변수명" items="덩어리" begin="시작번호" end="끝번호" step="증가값"
<!-- 일반적인 for 문 처럼 사용 -->
<c:forEach var="i" begin="1" end="10" step="1">${i} </c:forEach>
<!-- 실제로는 어떻게 사용 하는가? -->
<%
String[] sports = {"축구","야구","농구","골프","수영","볼링"};
HashMap map = new HashMap();
map.put("name","kim");
map.put("age","33");
map.put("phone","010-1234-1234");
%>
<!-- c 태그 내에서 스크립틀릿의 내용을 사용하기 위해서는 c:set으로 선언해야 한다 -->
<!-- varStatus 를 통해 추가 정보를 알 수 있다. -->
<c:forEach items="<%=sports%>" var="item" varStatus="stat">
<p>${stat.index} : ${item}</p>
</c:forEach>
<!-- 절대 경로 : 내 위치가 변해도 변하지 않는 경로 또는 주소(보안상 좋지 않다.)-->
<!-- 상대 경로 : 내 위치가 변하면 같이 변하는 경로 또는 주소-->
<!-- ./는 보통생략된다 (상대경로) -->
<ul>
<li><a href="./url.jsp">상대경로(현재위치의 url.jsp)</a></li>
<li><a href="./sub/link.jsp">상대경로(현재위치의 sub폴더 하위의 link.jsp)</a></li>
</ul>
<ul>
<li><a href="/url.jsp">절대경로(url.jsp)</a></li>
<li><a href="/11_JSTL/url.jsp">절대경로로 제대로 나오게 하려면?(url.jsp)</a></li>
</ul>
<ul>
<li><a href="/url.jsp">절대경로(url.jsp)</a></li>
<!-- c:url 을 사용하면 컨텍스트경로에 신경쓰지 않고 절대 경로를 사용 할 수 있다. -->
<li><a href='<c:url value="/url.jsp"/>'>절대경로로 제대로 나오게 하려면?(url.jsp)</a></li>
</ul>
<c:url value="http://search.daum.net/search" var="searchUrl">
<c:param name="w" value="blog"/>
<c:param name="q" value="독도"/>
</c:url>
forTokens
java의 tokenizer와 비슷하다.
(특정 구분자를 기준으로 끊어준다.)
<c:set var="text">축구,야구,농구,배구,골프,수영</c:set>
<c:forTokens items="{val}
</c:forTokens>
import
redirect
<!--
내부 페이지로 이동 되며, 외부 url 로 이동도 가능 하다.
redirect는 가장 마지막에 나와야한다 다음으로 나오는것은 실행이 안됨.(현재 페이지를 이동하는 기능이므로)
url로 이동시 파라메터 추가도 가능하다.
www.youtube.com/results?search_query=jsp
-->
<c:redirect url="http://www.youtube.com/results">
<c:param name="search_query" value="jsp"></c:param>
</c:redirect>
JSTL 의 함수도 사용이 가능 하다.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>