[jsp] el, jstl

포키·2023년 6월 1일
0

국비과정

목록 보기
69/73

참고
참고2


jsp에서 스크립트 없애기
1. 연산은 서블릿에서 한다
2. 표현식은 el로 대체한다
3. 조건문, 반복문은 jstl로 대체한다

el (expression language)

  • jsp에서 하는 일은 대부분 값을 빼오는 것 = getter
  • el은 이를 대체하는 역할
	<!-- request 객체의 속성으로 들어간 'myString - abc' -->
	<%
    request.setAttribute("myString", "abc");
    %>
    <!-- 스크립트릿과 표현식을 이용하여 값을 가져오는 방식 (기존) -->
    <%
    String str = (String) request.getAttribute("myString");
    %>
    <%= str %>
    <!-- el을 사용하여 값을 가져오는 방식 -->
    ${ requestScope.myString }
  • scope와 속성 이름을 통해 속성값을 가져올 수 있음
	${ requestScope.myString }
    ${ myString }
  • scope를 표시하지 않으면 pageContext -> request -> session -> application 순서로 확인하여 값을 가져옴
  • 표현식은 null을 표시 <-> el은 null이 들어가면 ""(빈 문자열) 반환
  • 속성값이 객체일 경우 속성명.멤버변수명 or 속성명[멤버변수명] 형태로 멤버변수 값까지 가져올 수 있음 (getter의 역할!)
	${ myString.myValue }
    ${ myString["myValue"] }

obj.a (dot notation) 방식과 obj[“a”] (bracket) 방식의 차이
후자는 속성명 자리에 문자열을 참조하는 참조변수명을 넣을 수 있다 (“a”를 의미하는 문자열 strObj를 그 저리에 넣을 수 있는 것)
(자바스크립트의 경우는 그렇다는 거라 el에서는 그렇지 않을 수도… 있지만 맞을듯)

  • scope가 아니라 기본객체인 pageContext 자체에도 접근할 수 있다.
    (request, session, application에는 바로 접근 불가능하지만, pageContext를 통해 이끌어내어 접근하는 것이 가능)
	${ pageContext.request.contextPath }
  • 연산 가능
	${ 4 < 3 }
  • 복수데이터 값 가져오기
	${ list[2] }
    ${ map["aKey"] }
  • empty : null이거나 size가 0인 경우 true
  • not empty : empty의 반대

    empty 배열은 길이가 0이어도 false
    (배열은 고정길이므로, 길이가 0인 배열이 나타날 일이 없어서 확인을 안한다. 는 가설.)

jstl (java standard library)

  • 조건문, 반복문을 쓰기 위함
    (스크립트릿 없애기! el로는 jsp 스크립트릿의 변수 접근 불가)
  • 코드로 만들 수 있는 일을 태그로 정의한 것
  • jstl은 기능별로 나뉘어있는데 지금 우리가 다룰 건 core

    remind💦
    jsp는 view 역할만 수행!!!!!!!!!!!!!!!!!
    get해서 값 보여주는 역할!!!!!!!!!!!!!!!!!!!!

사용 준비

  • jstl 라이브러리 다운로드 (mvn repository)
    WEB-INF > lib.jar 파일 넣고
    jsp 코드에 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 입력

<c:set> <c:remove>

	<c:set var="num" value="100" scope="request" />
    <!-- 속성을 넣는 역할 (거의 안씀) -->
    ${ num }

    <c:remove var="num" scope="request" />
    <!-- 속성을 없애는 역할 (거의 안씀) -->
    ${ num }

예시 코드

    <c:set var="num" value="100" scope="request" />
    <!-- 속성을 넣는 역할 (거의 안씀) -->
    ${ num }
    <c:remove var="num" scope="request" />
    <!-- 속성을 없애는 역할 (거의 안씀) -->
    ${ num }

    <hr/>

    <c:if test="${ 4 > 0 }">
        true
    </c:if>
    <!-- if문 역할, 하지만 else, else if가 불가능 -->
    <c:choose>
        <c:when test="${ myValue > 10 }">
        10보다 크다
        </c:when>
        <c:when test="${ myValue > 5 }">
        5보다 크다
        </c:when>
        <c:otherwise>
        5 이하이다
        </c:otherwise>
    </c:choose>
    <!-- if문처럼 else, else if를 따질 수 있다. 일반적으로 조건문을 설정할 때 사용한다. -->

    <hr/>

    <c:forEach var="i" begin="0" end="10" step="3">
        ${ i }
    </c:forEach>
    <!-- 일반적 for문 대체. 0에서 10까지 1씩 증가한다. -->
    <hr/>
    <%
        ArrayList<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        request.setAttribute("list", list);
    %>
    <c:forEach items="${ list }" var="myString" varStatus="status">
        ${ status.count }번째 반복 : ${ myString } -> ${ status.index }
        <br/>
    </c:forEach>
    <!-- forEach문 대체. items=복수데이터, var=원소 하나를 부르는 이름, status=반복문 정보(index, count반복횟수)를 가짐 -->
profile
welcome

0개의 댓글