개발..너... 2022. 6. 15. 04:24
JSTL이란?

 

연산이나 조건문, 반복문을 편하게 처리할 수 있으며, JSP페이지 내에서 자바코드를 사용하지 않고도 로직을 구현할 수 있도록 효율적인 방법을 제공한다.

for(초기식;조건식;증감식){ } -> <c:forEach></c:forEach>

 

 

JSTL라이브러리 다운로드

 

https://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 

 

Index of /dist/jakarta/taglibs/standard/binaries

 

archive.apache.org

 

 

를 다운받아 프로젝트 lib에 넣고 java bildpath를 설정해준다.

 

 

JSTL 태그

 

  •  <c:set/ > : 변수를 만들 때 사용
  •  <c:out></c:out> : 값을 출력(EL문을 좀 더 많이 쓴다)
  • <c:if></c:if>: 조건제어
  • <c:choose></c:choose>: 조건제어(switch문)으로 내부에 c:when, c:otherwise만 있어야한다.
  • <c:when></c:when>: 조건제어(case문)
  • <c:otherwise></c:otherwise>:조건제어
  • <c:forEach></c:forEach>:반복제어

 

JSTL 사용방법-기본

 

*jstl_test.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
    <c:set var="userid" value="apple" scope="page" />
    회원 아이디: <c:out value="${userid }" /><br>
    회원 아이디: ${userid }
    <hr>
    <c:set var="userid" scope="session">user1</c:set>
    <c:set var="username" scope="session">김자바</c:set>
    회원아이디: ${userid }<br>
    회원이름: ${username }<br>
    회원아이디session: ${sessionScope.userid }<br>
    회원이름session: ${sessionScope.username }
 
</body>
</html>
cs

 

 

point1) jstl 상단 선언

 

 

JSTL을 사용하기 위해서는 이클립스에서 자동으로 JSTL을 이용하도록 하고있지않기에, 위의 url을 꼭 상단에 기재해주어야만 사용이 가능하다.

 

 

point2) JSTL과 EL문 차이점

 

 

첫번째는 JSTL로 userid의 value값인 apple을 가져온 것이고 두번째는 el문으로 userid의 값을 가지고 온 것이다. el문이 훨씬 간편한 것을 확인할 수 있다.

 

 

point3) Jstl이 값을 찾아오는 순서

초록박스는 page에 저장한 회원아이디, 빨간박스는 session에 저장한 회원 아이디이다. 

<c:set></c:set>형식으로 변수를 선언한 것은 이 안에 들어간 값이 value라는 것인데 이상하게 session에 저장한 아이디도 page에 저장된 id값 apple이 출력되었다.

 

이유는 EL문은 작은범위에서 큰 범위(page > request > session > application)로 값을 찾아서 데리고 온다. page는 session보다 작은 범위이기에 EL문 입장에서 page에 먼저 들어갔다가 userid인 apple값을 찾았고 그 값을 그대로 들고온 것이다. 그렇기에 만약 session에 있는 값을 가지고 오고 싶다면 

 

위처럼 sessionScope를 명시해주어야지만 session에 저장된 id값을 정상적으로 가지고 올 수 있다.

 

 

JSTL 사용방법-응용1(if문)

 

 

*jstl_test2.jsp

 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:set var="num" value="100" />
    <c:if test="${num gt 50 }">
        <script>
            alert("이 수는 50보다 큽니다");
        </script>
    </c:if>
    
    <c:if test="${num gt 30 }">
        <script>
            alert("이 수는 30보다 큽니다");
        </script>
    </c:if>
    
</body>
</html>
cs

 

*jstl_test3.jsp

 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    choose문 사용 (if~else문의 경우 jstl에서는 choose문을 사용해야만한다.)
    <br><hr>
 
    <c:set var="num" value="100" />
    <c:choose>
        <c:when test="${num gt 50}">
            이 수는 50보다 큽니다.
        </c:when>
        <c:when test="${num gt 30}">
            이 수는 50보다 큽니다.
        </c:when>
        <c:when test="${num gt 10}">
            이 수는 50보다 큽니다.
        </c:when>
        <c:otherwise>
            이 수는 그 이외의 숫자입니다.
        </c:otherwise>
    </c:choose>
</body>
</html>
cs

 

 

jstl문에는 if는 있지만 else문이 없다. 

그래서 if else문을 작성하고 싶을 경우, if문을 여러번 작성하던지 <c:choose>를 사용하여 if else문 형식의 기능을 구현시킨다.

 

 

JSTL 사용방법-응용2(if문을 활용하여 관리자 아이디 구분하기)

 

*jstl_test4.jsp

 

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
32
33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:choose>
        <%-- param.userid가 empty인 경우  --%>
        <c:when test="${empty param.userid }">
            <form>
                아이디<input type="text" name="userid"><br> 
                비밀번호<input type="password" name="userpw"><br> 
                
                <input type="submit" />
            </form>
        </c:when>
        
            <%-- param.userid가 empty가 아닌 경우 --%>
        <c:otherwise>
            <c:set var="userid" value="${param.userid }" />
            <c:set var="userpw" value="${param.userpw }" />
            <c:choose>
                <c:when test="${userid == 'admin' }">관리자</c:when>
                <c:when test="${userid == 'apple' }">김사과</c:when>
            </c:choose>
        </c:otherwise>
    </c:choose>
</body>
</html>
cs

 

 

만약 아이디가 빈값인 상태로 submit하였다면, 로그인 페이지로 유지

아이디가 빈값이 아닌 상태라면 해당 아이디를 구분하여 원하는 데이터를 출력시킬 수 있도록 하는 코드이다.

 

 

분홍박스: switch문을 활용한 것으로 if문을 감싸준다.

빨간박스: c:when c:otherwise로서 c:choose안에는 이 두가지만 들어가야한다.

초록박스: c:choose로서 switch안에 swith가 있다고 생각한다.

 

 

 

JSTL 사용방법-응용3(반복문)

 

*jstl_test5.jsp

 

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
32
33
34
35
36
37
38
39
40
41
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:forEach var="i" begin="0" end="10" step="1">
     ${i }
    </c:forEach>
    <hr>
    
    <c:set var="arData" value="<%=new int[]{10,20,30,40,50} %>" />
    <c:forEach var="i" begin="0" end="4" step="1">
        ${arData[i] }
    </c:forEach>
    <hr>
    
    <c:forEach var="data" items="${arData }">
        ${data }
    </c:forEach>
    <hr>
    
    <%
        HashMap<String, Integer> map = new HashMap<>();
        map.put("하나",1);
        map.put("둘",2);
        map.put("셋",3);
    %>
    
    <c:set var="map" value="<%=map %>" />
    <c:forEach var="entry" items="${map }" >
        ${entry.key }<br>
        ${entry.value }<br>
    </c:forEach>
</body>
</html>
cs

 

jstl문의 가장 기본적인 반복문

 

jstl문의 배열 반복문

 

jstl문의 향상된 for문

 

jstl문의 HashMap 배열 꺼내오기

 

 

JSTL 사용방법-응용4(반복문을 활용한 구구단 출력)

 

*jstl_test6.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <c:forEach var="i" begin="1" end="9" step="1">
        5  X ${i} = ${5*i }<br>
    </c:forEach>
</body>
</html>
cs

 

 

 JSTL function

 

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
32
33
34
35
36
37
38
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <%
        HashMap map = new HashMap();
        map.put("1","1");
        map.put("2","2");
        map.put("3","3");
        map.put("4","4");
        map.put("5","5");
    %>
    
    <c:set var="map" value="<%=map %>" />
    <c:set var="str1" value="jstlfn" />
    <c:set var="str2" value="jstlfn배워봅시다." />
    
    <h1>Function 태그 </h1>
    
    length(map) : ${fn:length(map) }<br>
    length(str1) : ${fn:length(str1) }<br>
    length(str2) : ${fn:length(str2) }<br>
    <hr>
    toUpperCase(str1) : ${fn:toUpperCase(str1) }<br>
   toUpperCase(str2) : ${fn:toLowerCase(str2) }<br>
    <hr>
    replace(str1,src,dest) : ${fn:replace(str1, "f", "^") }
    
</body>
</html>
cs

 

출력 내용

point1)

 

 

jstl_fn.jsp파일의 상단에 위치하고있다.

jstl의 라이브러리를 사용하려면 윗줄을 입력해야하고 jstl fucntion을 사용하고싶으면 밑줄을 선언해주어야한다. 단, function은 el선언문과 함께 사용해야한다.

 

 

point2)

 

 

length(obj)가 collection인 경우 저장된 항목의 개수를, 문자인 경우 문자열의 길이를 변환한다.

그래서 map의 길이는 5, str1,str2의 길이는 각각 문자열의 길이 6,12가 출력되었다.

 

 

toUpperCase(Str): str을 대문자로 변환한다.

tolowerCase(Str): str을 소문자로 변환한다.

 

 

replace(str,src,dest) : str에 있는 src를 dest로 반환한다.

그래서 jstlfn인 str의 f가 ^로 변경되어 jst^fn 으로 출력되었다.