ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tue/Feb/11 [Java-JSTL] day29. JSTL 기초
    Study/2020 국비교육_Java 2020. 2. 11. 09:48

    Tue/Feb/11

    [Java-JSP] day29.

     - JSTL 기초

     

    JSTL 기초

    JSTL = JSP Standard Tag Library

    Java 코드를 태그 형태로 사용할 수 있도록 재정의해 준 것

    초기 setting : 액션태그와 달리 라이브러리 library 필요 → jstl~.jar를 lib 폴더에 복붙

    • javax.servlet.jsp.jstl-1.2.1.jar

    • javax.servlet.jsp.jstl-api-1.2.1.jar

    Custom Tag : 개발자가 직접 정의하여 사용하는 태그

     - JSTL은 거의 모든 자바 코드를 커스텀 태그로 바꿔 놓음

     

    EL Expression Language 표현언어 : 자바코드를 대신해 다른 EL 사용 - ${ }

    ex. <%=age%> → ${age}

    getParameter() / getSession() 사용하지 않아도 바로 꺼내서 사용할 수 있음

     

    JSTL은 총 4종의 태그 제공

    태그 URI // library의 주소

    Prefix

    // 자유롭게 지정 가능하나, 일반적인 관행

    Core http://java.sun.com/jsp/jstl/core c
    XML http://java.sun.com/jstl/xml x
    formating http://java.sun.com/jstl/fmt fmt
    DB http://java.sun.com/jstl/sql sql

     

    페이지 지시자 taglib 통해 아래와 같이 library 호출; <HTML> 위에서

    <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

     * eclipse가 uri 오타 못잡아줌 - 오타 주의!

     

    JSTL Core Library - 일반태그

     

    일반

    • <c:out> 출력, print / out

      • <c:out value = "out_value" default = "default_value" escapleXml = "true | false" >

      • escapleXml : html 태그를 그대로 출력할 건지 - compile 된 값을 출력할 건지?

        • boolean type-기본값 FALSE, 게시판에서 자주 사용되는 속성

        • <PRE></PRE>로 대체 가능, 띄어쓰기도 모두 반영

        • true 인 경우 html을 xml로 인식하여 태그가 먹히지 않고 그대로 화면에 노출, 일부 특수문자는 엔티티 코드 entity code 로 변환됨

          • < = &lt;  > = &gt; & = &amp; 등

    • <c:set> 변수 지정

      • <jsp:setProperty> 와 유사, 그러나 JSP 액션태그와 달리 <jsp:useBean> 필요 없음, javaBean 외 arrayList 등 다른 객체도 설정 가능

      • 기본형식

        • <c:set var="var_name" value = "var_value" scope = "area" /> 몸체가 없는 형태

          • scope = page  |  request  |  session  |  application

        • <c:set var="var_name"> var_value </c:set> 몸체가 있는 형태

      • property value 생성

        • <c:set target = "target_var_name" property  = "property_name" value = "property_value" /> 몸체 없는 형태

        • <c:set target="target_var_name" property = "property_name > property_value </c:set> 몸체 있는 형태

      → <c:set> 기본 사용법 예제) java Model class 를 통해 변수명 / getter / setter 미리 지정해놔야 함

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"	import = "com.wjh.jstl_test.InfoModel"%>
        
    <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
    
    <%
    	InfoModel info = new InfoModel();
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>EXE04</title>
    </head>
    <body>
    
    <c:set var="info" value="<%=info %>" > </c:set>
    <!-- 
     <c:set var="info" value="<%=new InfoModel() %>" > </c:set> 
     객체 생성을 여기서 바로 할 수도 있다
    -->
    
    <c:set target = "${info}" property = "name" value = "TEST" ></c:set>
    <c:set target = "${info}" property = "age" value = "24"></c:set>
    
    회원이름 : ${info.name } <hr>
    나이 : ${info.age } <hr>
    
    </body>
    </html>

    • <c:remove> 지정 변수 삭제

      • <c:remove var = "var_name" />

    • <c:catch> 예외 처리

      • <c:catch var = "catch_object" > </c:catch>

        • var = 예외 처리 객체

    <c:catch var="myError">
    	<% int x = 10/0; %>
    </c:catch>
    
    <c:if test = "${myError != null }">
    	${myError.message }
    </c:if>

     

    조건

    • <c:if> else 문 없음, 참일 때만 사용 가능

      • <c:if test = "contition_statement" > 참일 때 실행할 내용 </c:if>

    • <c:choose> else

      • <c:when> else if (){} , choose 가 감싸고 있어야 함

      • <c:otherwise>  else {} , choose 가 감싸고 있어야 함

    <c:set var = "gender" value = "<%=1 %>" > </c:set>
    
    <c:choose>
    	<c:when test = "${gender==1 }" >
    	남자입니다.
    	</c:when>
    	
    	<c:when test="${gender == 2 }">
    	여자입니다.
    	</c:when>
    	
    	<c:otherwise>
    	그 외 ?? 
    	</c:otherwise>
    	
    </c:choose>

     

    URL

    • <c:import> 파일이나 사이트 import

    • <c:url> link

    <c:url>

    <c:url var = "nameSend" value = "/01_1_el_test.jsp" >
    	<c:param name = "name" value = "free"></c:param>
    </c:url>
    
    <a href = '<c:out value = "${ nameSend }"></c:out>'>URL</a>

      →  location.href = '/#.jsp?param=***' 을 보다 깔끔하게 대체할 수 있음

    • <c:redirect> : response.sendRedirect()

    • <c:param> : 위의 import / url / redirect 를 통해 value 전달할 떄

     

    반복

    • <c:forEach> : for ( )

      • <c:forEach items = "var_array_name"  var = "var_name" > 작업 내용 </c:forEach>

        • elements를 앞에서부터 하나씩 꺼내서 var 에 대입

        • index 활용불가 ; for ( : ) type

      • <c:forEach items = "var_arrya_name"  varStatus = "index" > 작업 내용 </c:forEach>

        • elements를 꺼낼 때마다 꺼낸 횟수 count 와 저장 위치 index가 함께 추출됨

        • index 사용 가능 - <c:if> 이용해 index 구간 설정 가능 ; for( ; ; ) type

        • varStatus 주요속성

          • status.current : 현재 element

          • status.index : 0부터 증가

          • status.count : 1부터 증가

          • status.first : 현재 loop가 처음인지 ? true : false;

          • status.last : 현재 loop가 마지막인지? true : false;

          • status.begin : 시작값

          • status.end : 끝값

          • status.step : 증가값

    • <c:forEachToken> : for ( ) 의 일부만 반복

    <c:forEach> 

    <H1>
    	HEADER 라는 개체가 갖고 있는 값들을 불러서 보여준다<br>
    	request.getHeader() 로 가져올 수 있는것
    </H1>
    	
    <h3>header</h3>
    <c:forEach items = '${header}' var = "h">
    	<c:out value = "${h}" /><br>
    </c:forEach>
    <hr>
    
    <H3>header.cookie</H3>
    <c:out value = "${header.cookie }" /> <hr>
    	
    <h3>또는 header["cookie"]</h3>
    <c:out value = '${header["cookie"]}' />
    
    <!--
    이 방식은 for loop 사용 가능한 장점
    다만 대부분 DB 사용하면서 변수명을 모두 일치시키기 때문에 쓸일이 거의 없음
    -->

    <%
    	response.setContentType("text/html;");
    	String[] abc = { "빨강", "파랑", "노랑" };
    %>
    
    <hr>
    	
    <h3>pageScope : scope 속성 값 중 page 범위</h3>
    <c:forEach items = '${pageScope }' var = "h">
    	<c:out value = '${h}' /> <br />
    </c:forEach> 
    
    <hr>
    	
    <h3>colors</h3>
    <c:set var = "color" value = "<%=abc %>" />
    <c:forEach items = '${color }' varStatus = "i">
    	<c:out value = '${i.count }' />. <c:out value = '${color[i.index] }' />
    </c:forEach>

    <h2>반복</h2>
    <h3>&lt;c:forEach></h3>
    <c:forEach var = "one" begin = "1" end = "10">
    	<c:out value = "${one }" />
    </c:forEach>
    
    <p>
    <b>header</b>
    </p>
    	
    <c:forEach var = "h" items = "${header}">
    	<c:out value = '${h.key} : ${h.value }' /><br>
    </c:forEach>

     

    기타

    • <c:forTokens>

      • String.split() 없이도 문자열 쪼개서 전달 가능

      • <c:forTokens var = "var_name" items = "String" delims = "문자열 쪼갤 구분자" varStatus = "status_name" > 실행할 내용 </c:forTokens>

    <c:forTokens var = "one" items = "서울|인천,대전,대구,부산,광주,평양" delims="," varStatus = "sts">
    	<c:out value = "${sts.count }.${one }" /> &middot;
    </c:forTokens>
    	
    <hr>
    	
    <c:forTokens var = "one" items="서울|인천,대전,대구,부산,광주,평양" delims=",|" varStatus = "sts">
    	<c:out value = "${sts.count }.${one }" /> &#149;
    </c:forTokens>

     

    * Collection (data 수집) 의 방식

    아래 List / Map / Set 은 Interface (Class X)

    • List

      • index가 반드시 존재 - 순서

      • ArrayList

    • Map

      • index 대신 key 사용 - 순서X

      •  HashMap

        • Cookie

        • Session

      • Header

        • header.value / header.key

    • Set

      • 일종의 map 형태

      • 중복된 값은 저장 불가

      • 순서 X

     

    응용 예제)

    session에 값 저장

    <c:if test = "${!empty hit}">
    	<c:set var = "hit" value = "${hit+1 }" scope = "session" />
    	<c:out value = "${hit }" /> 번 리로드 되었습니다.
    </c:if>
    	
    <c:if test="${empty hit}">
    <c:set var = "hit" value = "1" scope = "session" /> 세션에 값 저장
    </c:if>
    	
    <hr>
    	
    <a href = "14_session_test.jsp"  >reload</a>

     

    파라미터 :  <c:out value = "${param.id }" />
    <hr>
    <form method = "post" >
    	<input type = "text" name = "id" >
    	<input type = "submit" />
    </form>

    <% request.setCharacterEncoding("UTF-8");%> 을 사용한 경우

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix = "fmt" uri = "http://java.sun.com/jstl/fmt" %>
    
    <fmt:requestEncoding value = "UTF-8" />
    
    파라미터 :  <c:out value = "${param.id }" />
    <hr>
    <form method = "post" >
    	<input type = "text" name = "id" >
    	<input type = "submit" />
    </form>

    <fmt:requestEncoding value = "UTF-8" /> 사용한 경우

    <form>에 action 값 지정하지 않으면 현재 페이지에 값 전송

     

    접속자의 접속 국가 알아내는 response.getLocale()

    접속 국가 변경하는 <fmt:setLocale value="locale" />

    <pre>
    	default locale : <%=response.getLocale() %>
    	set locale : ko <fmt:setLocale value = "ko" />
    	now : <%=response.getLocale() %>
    	set locale : ja <fmt:setLocale value = "ja" />
    	now : <%=response.getLocale() %>
    	set locale : en <fmt:setLocale value = "en" />
    </pre>

     

     


    <//>

    댓글

Designed by Tistory.