[21.09.28] EL과 JSTL

yed·2021년 9월 28일
0

EL(Expression Language)

  • page, request, session, application 관련 데이터 출력 코드를 간략하게 사용할 수 있는 표기법이다.
    (scope. 데이터가 돌아가는 프로젝트의 범위 관련)
  • 자바빈 컴포넌트를 쉽게 접근하게 도와준다
  • 집합객체list, String[]에 대한 접근 방법을 제공한다
  • 수치연산, 관계연산, 논리 연산자 제공한다
  • 자바 클래스 메소드 호출 기능을 제공한다
  • 표현 언어만의 기본 객체(범위 객체)를 제공한다

jsp 내장객체와 영역(scope)

  • page : 자기 자신의 정보 저장. 생성된 페이지 내에서 사용할 수 있음
  • request : url, form 등 요청된 페이지 내에서 사용할 수 있음
  • session : 하나의 클라이언트가 유지되는 동안 사용. 웹 브라우저의 생명주기 내에서 정보 저장
  • application : 웹 어플리케이션의 생명주기 내에서 사용할 수 있음

EL변수를 사용해서 더 편하게 scope를 사용할 수 있다

EL 기본 객체

  • pageContext : JSP의 page 기본 객체와 동일하다. pageScope보다 상위. page객체 안에 있는 기능을 쓸 수 있음.

  • pageScope : page 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

  • requestScope : request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

  • sessionScope : session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

  • applicationScope : application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체

  • param : 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체. String 타입이다.
    request.getParameter("파라미터이름")의 결과와 동일

  • paramValues : 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체. String[] 타입
    request.getParameterValues("파라미터이름")과 결과 동일

  • Cookie : <쿠키이름, 쿠키값> 매핑을 저장한 Map 객체.
    request.getCookies()와 동일

  • initParam : 초기화된 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체

데이터 전송 시 가장 많이 사용하는 형태가 key-value

  <%
  pageContext.setAttribute("num1", 1);
  request.setAttribute("num2", 2);
  session.setAttribute("num3", 3);
  application.setAttribute("num4", 4);

기존에 값을 가져오는 방법

  int number1=(Integer)pageContext.getAttribute("num1");
  int number2=(Integer)request.getAttribute("num2");
  %>
  <p>JSP 변수의 합 : <%=number1+number2 %></p> 

EL표기법을 사용해 값을 가져오는 방법

  <p>page num1 : ${num1 }</p> 
  <p>request num2 : ${num2 }</p>
  <p>session num3 : ${num3 }</p>
  <p>application num4 : ${num4 }</p>

EL은 jsp에 자바를 섞은 표기법이다.
객체안에 들어간 값을 jsp 변수로 받아오고 태그<%=%>로 가져오는 것에서
EL 표기법${}을 사용해 바로 저장된 값을 가져오게 된다. 단계가 줄어들었다

EL 표기법을 쓰는 이유. 코드가 짧아져서 편리하다!

중복된 키가 있을 경우 생기는 문제

  pageContext.setAttribute("scopeNum", 1);
  request.setAttribute("scopeNum", 2);
  session.setAttribute("scopeNum", 3);
  application.setAttribute("scopeNum", 4);
  %>
  
  <p>page scopeNum : ${scopeNum }</p>
  <p>request scopeNum : ${scopeNum }</p>
  <p>session scopeNum : ${scopeNum }</p>
  <p>application scopeNum : ${scopeNum }</p>

다 1 출력됨. 포함관계의 가장 안쪽인 page의 값이 나오는 것이다.
이름은 신중하게 지을 것! 에러가 표시되지않아서 조심해야함

EL 연산자

기본적인 연산자는 자바와 동일하고 / 와 div는 동일한 연산자

주로 서버사이드에서 데이터를 가져왔는데 데이터가 비어있을 경우 처리를 해야하는데 데이터가 비어있는지 아닌지 확인할 때 사용한다.

산술 연산자

더하기 : +
빼기 : -
몫 : /, 나머지 : mod

비교 연산자

같은가? : ${10 eq 10}<br>
다른가? : ${10 != 10}<br>
작은가? : ${10 lt 10}<br>
큰가? : ${10 gt 10}<br>
작거나 같은가? : ${10 le 10 }<br>
크거나 같은가? : ${10 ge 10 }<br>

논리 연산자

논리곱 : ${true and false }<br>
논리합 : ${true or false }<br>
논리 부정 : ${not true }<br>

empty 연산자

null : ${empty nullStr }<br>
빈 문자열 : ${empty emptyStr }<br>
길이가 0인 배열 : ${empty zeroArray }<br>
빈 ArrayList(collection) : ${empty emptyList }<br>
나머지 경우 : ${empty "문자열" }<br>
not null : ${not empty nullStr }<br>

true/false로 값이 나온다.

parameter 보내기

${param.파라미터이름}
reqeust.getParameter("파라미터이름")와 같다

마찬가지로 jsp 변수로 받아오는 과정을 생략할 수 있다!

하지만 보통 parameter는 form에서 서버로 데이터를 보낼때만 사용하고 서블릿에서 jsp로 데이터를 보낼땐 param방식을 못쓰기때문에 param은 잘 사용하지않는다

EL useBean

  <jsp:useBean id="point" class="edu.web.el01.Point" scope="page"/>
  <jsp:setProperty property="x" name="point" value="0.0"/>
  <jsp:setProperty property="y" name="point" value="0.0"/>
  <p>point의 x,y 좌표값 : ${point.x }. ${point.y }</p> 
  <p>point의 x,y 좌표값 : ${pageScope.point.x }. ${pageScope.point.y }</p>

el로 클래스 프로퍼티에 접근가능 해당 페이지에서 useBean을 사용했기때문에 pageScope에 포함되는것.

point.x는 getter 메소드와 동일.

VO클래스를 만들어놓고 변수명을 나중에 바꾼다면 에러가 발생할 수 있음. 클래스안에서 변수명만 바꾸고 getter/setter의 메소드명을 바꾸지 않으면 문제가 발생. 변수명을 바꾼다면 메소드명까지 신경쓰거나 다 지워서 다시 만드는게 좋다.
메소드 이름까지 다 바꿨는데 안되는 경우? 서버가 과거의 정보를 가지고 있고 변경된 정보를 반영하지 못했을 때 발생. 서버 clean 후 재시작해야함


JSTL(JSP Standard Tag Library)

  • JSP 태그의 경우 HTML 태그의 가독성을 떨어트림. 이를 해결하기 위해 JSTL을 사용
  • JSP의 다양한 커스텀태그를 모아놓은 라이브러리다
  • 반복, 조건, SQL 등 다양한 기능을 사용할 수 있다

jsp 태그 <%%>와 EL 태그는 혼용해서 사용하기 어렵고 EL 태그는 제어문이 없기때문에 JSTL을 이용해 반복문을 사용한다

가독성과 편리함을 위해 JSTL을 사용함

JSTL Tag

  • core : 변수 지원, 흐름 제어, URL처리 등 가능. 접두어 c
  • xml : xml 코어, 흐름 제어, xml 변환. 접두어 x
  • 데이터베이스 : SQL. 접두어 SQL

JSTL 라이브러리 추가 방법

  • http://tomcat.apache.org/taglibs/standard/ 접속
  • version standard 1.1 Getting the Taglib download 링크 클릭
  • binaries/jakarta-taglibs-standard-1.1.2.zip 다운로드
  • jakarta-taglibs-standard-1.1.2/lib 경로의 jstl.jar,
    standard.jar 파일을 해당 프로젝트의 web-inf/lib 폴더에 저장
  • 필요한 taglib을 uri로 지정
    예)<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:set> 태그

<c:set var="name1" value="고기"></c:set>
<p>name1의 값 : ${name1 }</p>

JSTL을 사용한 값을 EL태그로 가져옴

  • var : 변수이름
  • value : 변수값

<c:remove> 태그

  • set 태그로 지정한 변수를 삭제할 때 사용함
  • scope 영역을 지정하지 않으면 동일한 이름의 변수를 모두 삭제한다

<c:if> 태그

<c:if test="조건">실행문</c:if>

  • 자바의 if문과 유사한 기능
  <c:if test="${param.name=='test' }"> 
    <p>결과값이 true</p>
    <p>파라미터 name값은 'test'</p>
  </c:if>

param.name == request.getParameter("name")

<c:choose> 태그

  • 자바의 switch문과 if-else문을 섞었음
  <ul>
    <c:choose>
      <c:when test="${param.flag==0 }"> <!-- 첫번째 조건 -->
        <li>파라미터 flag의 값은 0입니다.</li>
      </c:when>
      <c:when test="${param.flag==1 }">
        <li>파라미터 flag의 값은 1입니다.</li>
      </c:when>
      <c:when test="${param.flag==2 }">
        <li>파라미터 flag의 값은 2입니다.</li>
      </c:when>
      <c:otherwise> <!-- else와 동일 -->
        <li>파라미터 flag의 값을 0,1,2 중에 입력하세요</li>
      </c:otherwise>      
   </c:choose>
 </ul>

<c:when>은 if문. <c:otherwise>는 else 역할
html 태그와 접합해서 가독성있게 사용할 수 있다

<c:forEach> 태그

  • 자바의 for문, for-each문의 형태

  • 배열, 컬렉션, 맵 등에 저장되어 있는 값을 순차적으로 처리한다.

  • 기본 형태

 <c:forEach var="변수" items="아이템" begin="시작값" end="끝값" step="증가값">
   ${변수}
 </c:forEach>
  • items : array, collection, map 형태의 데이터를 저장
  • begin : 생략가능. 시작 인덱스
  • end : 생략가능. 끝 인덱스
  • step : 생략가능. 인덱스 증감

Iterator, Enumeration, Map의 경우 데이터 저장 순서와 읽는 순서가 일치하지않을 수 있어서 begin, end, step 속성을 잘 사용하지 않음.

  • 구구단 만들기
  <c:forEach var="i" begin="2" end="9">
    <p>${i }단</p>
    <c:forEach var="j" begin="1" end="9">
      ${i }X${j }=${i*j }<br>
    </c:forEach>
  </c:forEach>
  • 배열의 전체 데이터 출력
  <%
  String[] sports={"야구", "축구", "스쿼시", "테니스"};
  request.setAttribute("sports", sports);
  %>
  <h2>배열에서 데이터 출력</h2>
  <c:forEach var="s" items="${sports }" varStatus="status"> 
  <!-- String s  -->
    현재 인덱스 값 : ${status.index }<br>
    문자열 값 : ${s }<br>
    루프 실행 횟수 : ${status.count }<br>
    begin 값 : ${status.begin }<br>
    end 값 : ${status.end }<br>
    step 값 : ${status.step }<br>
  </c:forEach>

개발의 우선순위.
멋있어보이는 기능을 먼저 구현하면 안됨.
가장 기본적인 기능 먼저 완성하고 거기에 옷을 입혀야 한다!

profile
6개월 국비과정 기록하기

0개의 댓글

관련 채용 정보