[TIL] 240314

Geehyun(장지현)·2024년 3월 17일

TIL

목록 보기
49/70
post-thumbnail

Today

  • CHAP 10 - 표현언어(EL)
- 표현언어란?
  스크립트 요소의 표현식과 유사하게, 변수의 값을 출력하기 위해 사용되는 문법 요소 입니다.
  ${변수명} 의 방법으로 사용합니다.
  사용법이 비교적 간결하고, 예외오 형변환에 관대합니다.
  
- 표현언어의 특징
  1) JSP 내장 객체의 영역에 담긴 속성을 사용할 수 있습니다.
  2) 표현언어 내에서 산술, 비교, 논리 연산 등이 가능합니다.
  3) 자바 클래스에 정의된 메서드를 호출할 수 있습니다.
  4) 표현언어만의 객체를 통해 JSP와 동일한 기능을 수행할 수 있습니다.
  
- EL 내 객체 표현 방식
  1) . 이용
     ${객체명.속성명}
     → 속성명에 특수문자(- 등) 미포함 시 이용가능
     → 한글 이용 불가
  2) [] 이용
     ${객체명[속성명]}
     → 속성명에 특수문자(- 등), 한글 포함 가능. 단, "" 또는 ''으로 묶어 줘야함
  [예시]   
  ${header.user-agent}      (X)
  ${header.["user-agent"]}  (O)
  ${king.한글}               (X)
  ${king['한글']}            (O)
  
- 기본 사용법
  ● 4가지 영역 속성에 접근
     ${pageScope.속성명} - pageCotext.getAttribute("속성명") 처럼 page 영역 내 속성 값을 갖고옵니다.
     ${requestScope.속성명} - request.getAttribute("속성명") 처럼 request 영역 내 속성 값을 갖고옵니다.
     ${sessionScope.속성명} - session.getAttribute("속성명") 처럼 
                             session 영역 내 속성 값을 갖고옵니다.
     ${applicationScope.속성명} - application.getAttribute("속성명") 처럼 
                                 application 영역 내 속성 값을 갖고옵니다.
     ★ 영역 명 없이 속성명만 사용할 경우 가장 작은 영역에서 부터 해당 속성명을 찾습니다.
     
  ● request 영역 내 파라미터 값에 접근
     ${param.파라미터명} - request.getParameter("파라미터명") 처럼 
                         request 영역 내 저정된 파라미터 값을 갖고옵니다. (단건)
     ${paramValues.파라미터명} - request.getParameterValues("파라미터명") 처럼 
                               request 영역 내 저장된 파라미터 값을 String[] 로 갖고옵니다.
  ● 헤더 영역에 접근하기
     ${cookie.쿠키명}
     ${header.헤더명}
     ${headerValues.헤더명} - request.Headers("헤더명")
  ● 그 외
     ${initParam.파라미터명} - application.getInitParameter()와 동일하게 
                             web.xml 내 작성된 파라미터 값을 갖고옵니다.
     ${pageContext.접근할속성명} - pageContext 영역의 속성에 접근할 수 있습니다.

- 응용 사용법
  ● 컬렉션 활용하기
     컬렉션 객체를 4가지 영역 중에 저장해서 사용 가능
     1) List 객체
        ${List변수명[idx]}
     2) Map 객체
        ${Map변수명["key명"]}
        ${Map변수명['key명']}
        ${Map변수명.key명}
  ● EL 내 연산자
     1) 할당 연산자
        ${num = 11} - 할당과 동시에 출력
        ${num = 11;''} - 할당만 하고 출력은 안 함
     2) 산술 연산자
        ${num1 + num2} - 덧셈 
        ${num1 - num2} - 뺄셈
        ${num1 * num2} - 곱셈
        ${num1 / num2} ${num1 div num2} - 나눗셈
        ${num1 % num2} ${num1 mod num2} - 나머지
     3) 비교 연산자
        ${num1 > num2} ${num1 gt num2} - 좌측이 우측보다 크면 ture 아니면 false
        ${num1 >= num2} ${num1 ge num2} - 최측이 우측보다 커거나 같으면 ture 아니면 false 
        ${num1 < num2} ${num1 lt num2} - 좌측이 우측보다 작으면 ture 아니면 false
        ${num1 <= num2} ${num1 le num2} - 좌측이 우측보다 작거나 같으면 ture 아니면 false
        ${num1 == num2} ${num1 eq num2} - 좌측과 우측이 같으면 ture 아니면 false
        ${num1 != num2} ${num1 ne num2} - 좌측과 우측이 다르면 ture 아니면 false
     4) 논리 연산자
        ${조건1 && 조건2} ${조건1 and 조건2} - AND 연산자
        ${조건1 || 조건2} ${조건1 or 조건2} - OR 연산자
        ${!조건1} ${not 조건1} - NOT 연산자
     5) empty 연산자
        ${empty 변수명} - 해당 변수가 null / 빈 문자열 / 길이가 0인 배열 / size가 0인 
                         리스트 일 때 ture을 반환
     6) 삼항 연산자
        ${조건 ? true일 때 결과 : false일 때 결과}        
   ● 메서드 사용
     1) 인스턴스 메서드
        객체를 만들어 4가지 영역 중에 저장하여 해당 속성명으로 접근하여 사용 가능
        ${저장한속성명.메서드명()}
     2) 정적 메서드
        해당 클래스 자체로 접근하여 메서드 사용 가능 (정적 클래스일 경우)
        ${클래스명.메서드명()}
     3) TLD 사용
        TLD란? Tag Libaray Descriptor로 사용자 정의 태그나, JSTL 태그를 설정하기위한 XML 파일 입니다. 
        단, 파일 확장자는, xml 이 아니라 tld를 사용 합니다.
        1) webapp > WEB-INF 폴더 내 .tld 파일 추가
        2) 위 .tld파일에
           ...생략
           <tlib-version>1.0</tlib-version>
           <short-name>메서드 짧은 이름</short-name>
           <function>
             <name>메서드 이름</name>
             <function-class>패키지.클래스</function-class>
             <function-signature>리턴타입 메서드명(인자)</function-signature>
           <function>
           * 이 때 Java의 기본자료형이 아닌 타입을 작성 시에는 패키지명까지 풀네임으로 작성해야 합니다.
        3) 사용할 JSP 문서에서 <%@ taglib %>로 갖고와서 사용
        
        => 예전에 쓰던 방식으로 현재는 사용 X 그래도 레거시 코드를 읽을 수는 있어야함.
  • CHAP 11 - JSTL
- JSTL이란?
JSP Standard Tag Library로 JSP에서 자주사용되는 기능들을 태그 형식으로 만들어놓은 라이브러리 입니다.
태그 형식으로 작성할 수 있기 때문에, 스크립트 요소보다 보기 깔끔하고 간결할 수 있습니다.
- JSTL 종류
1) ★ Core 태그 : 변수 선언, 조건문/반복문, URL 처리 등
   접두어 - c / URI - jakarta.tags.core
2) Formatting 태그 : 숫자, 날짜, 시간 포맷 지정
   접두어 - fmt / URI - jakarta.tags.fmt
3) XML 태그 (접두어 x) : XML 파싱
   접두어 - x / URI - jakarta.tags.xml
4) Function 태그 : 컬렉션, 문자열 처리 (잘 안씀 - 사용자 정의 메서드 EL에서 사용가능해서)
   접두어 - fn / URI - jakarta.tags.functions
5) SQL 태그 : 데이터베이스 연결 및 쿼리 실행 (잘 안씀 - 이거보다는 JDBC 커넥터 이용하기 때문)
   접두어 - sql / URI - jakarta.tags.sql

- JSTL 사용 방법
1) 지시어 선언
   <%@ taglib prefix="접두어" uri="해당 태그의 URI" %>
2) JSP 문서 내 JSTL 태그 사용
   <접두어:태그명 ~~~ /> 또는 <접두어:태그명 ~~~> 내용 </접두어:태그명>

- Core 태그
1) set : 변수 선언 또는 자바빈즈 생성
   [변수 선언]
   <c:set var="변수명" value="" scope="4가지 영역 중 작성 / 생략 시 page" />
   또는
   <c:set var="변수명" scope="4가지 영역 중 작성 / 생략 시 page"></c:set>
   [자바빈즈 생성]
   <c:set var="변수명" value="<%= new 저장할 빈즈클래스%>" scope="4가지 영역 중 작성 / 생략 시 page" />
   <c:set target="${위 설정한 변수명}" property="속성명" value="" />
2) remove : 설정한 변수 제거
   <c:remove var="변수명" scope="4가지 영역 중 작성 / 생략 시 모든 영역 내 해당 변수 삭제" />
3) if : 단건 조건 비교 (else 절이 해당 조건 여부가 True일 때만 내용 실행 됨)
   <c:if test="${조건절}" var="변수명" scope="4가지 영역 중 작성 / 생략 시 page">
     조건이 True일 경우 실행될 내용
   </c:if>
   ${변수명}  => 이걸로 실행시킴   
   * 조건절 부분에 EL이 아닌 일반 형식이 들어오면 무조건 false를 반환(단, 일반형식으로 true 그 자체는 true로 반환)
   * 위 일반 형식 true일 경우 true이든 TRUE이든 tRuE이든 전부 true로 봄
   * 조건절 부분에서 test="  ${}   "이런식으로 공백이 있으면 false로 반환함(EL내부에서 공백은 상관 X)  
4) choose/when/otherwise : 다중 조건 비교
   <c:choose>
     <c:when test="${조건절1}">해당 조건절1이 true일 경우 실행 내용</c:when>
     <c:when test="${조건절2]">해당 조건절2가 true일 경우 실행 내용</c:when>
     <c:otherwise>위 조건절 중 아무 조건도 해당 안 될 때 실행 내용</c:otherwise>
   </c:choose>
5) forEach : 반복문 (일반형 / 향상된 for문형)
   [일반형]
   <c:forEach var="변수명(i,j이런거)" begin="시작값" end="종료값" step="증가할 값">
     반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
   </c:forEach>
   [향상된 for문형]
   <c:forEach var="변수명(i,j이런거)" items="<%=컬렉션 혹은 배열%>">
     반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
   <c:forEach>
   * JSTL의 forEach에는, status="status변수명" 으로 설정하여 현재 for문의 상태를 반복문 내에서 출력할 수 있음
     사용가능한 값 
     ① current : for문에 지정한 변수에 현재 담긴 값
     ② index : for문에 지정한 변수의 index를 반환(일반 for문에서는 current와 동일)
     ③ count : 실제 반복 횟수
     ④ first : 첫번째 반복일 경우만 true 반환
     ⑤ last : 마지막 반복일 경우만 true 반환
6) forTokens : 구분자를 기준으로 문자열을 나눈 것을 토큰이라하며, 해당 토큰 개수만큼 반복진행
   <c:forTokens var="토근을 담을 변수" items="자를 문자열" delims="구분자">
     반복할 내용! 여기서 위 변수 사용 시엔 ${변수명} EL 이용
   </c:forTokens>
   * forTokens에서 items에 들어갈 대상은 문자열만 가능합니다. 배열 X / 컬렉션 X
7) import : 외부 파일을 현재 위치에 삽입 (<jsp:include>와 동일)
   [기본 사용법]
   <c:import url="가져올 경로" var="해당 import문을 담을 변수 / 생략 시 바로 실행" />
   [파라미터 담아서 가기]
   <c:import url="가져올 경로" var="해당 import문을 담을 변수 / 생략 시 바로 실행">
     <c:param name="파라미터 명" value=""/>
   </c:import>
   또는 url="파일경로?쿼리스트링" 부분에 경로에 쿼리스트링 담아서 같이 보내기
   * import문에서 var="해당 import문을 담을 변수" 속성 지정 시 import문 선언만 하고 실행은 추후 해당 변수를 이용해서 원할 때 실행할 수 있으며, 생략 시 해당 지점에서 바로 실행됩니다.
   * <jsp:include>와 동일하기 때문에 request영역이 공유 됨 (page 영역은 공유 안됨)
8) redirect : 페이지 이동 처리 (response.sendRedirect()와 동일)
   [기본 사용법]
   <c:redirect url="이동할 경로" />
   [파라미터 담아서 가기]
   <c:redirect url="이동할 경로">
     <c:param name="파라미터 명" value=""/>
   </c:import>
   * resposne.sendRedirect와 동일하기 때문에 request영역은 공유되지 않습니다.
     따라서 값을 공유하려면 c:param으로 파라미터를 공유해야합니다.
9) url : url을 변수에 저장합니다.(경로를 입력하면 알아서 컨텍스트 루트를 포함하여 URL로 변환하여 저장 해줌) - 굳이 왜 쓸까 싶음
   <c:url value="저장할 경로" var="변수명" />
10) out : 표현식 처럼 변수를 출력할 때 사용
   <c:out value="${출력할 변수}" default="value에서 지정한 변수의 값이 null일 경우 출력" 
          escapeXml="태그를 문자 그대로 출력할 경우 true, 태그를 적용할 경우 false(생략할 경우 true)"
11) catch : 예외를 잡아 처리하는 역할
   <c:catch var="변수명">
     실행할 코드(스크립트 요소 / EL 등)
   </c:catch>
   * ${예외를 담은 변수명} 으로 예외 내용도 출력 가능
   
- Formatting 태그
1) 숫자 포맷팅 및 파싱
   [숫자 포맷팅]
   <fmt:formatNumber value="출력할 숫자" type="출력양식" 
                     var="해당 포맷팅 숫자를 담을 변수 / 생략 시 바로 출력"  
                     groupingUsed="세자리마다 콤마 출력할 경우 true(기본값) / 아니면 false" 
                     pattern="숫자 패턴"  scope="변수를 저장할 영역" />
   * type 속성 값 예시 : percent / currency / number(기본값) 
   * var="해당 포맷팅 숫자를 담을 변수" 속성 지정 시 포맷팅 선언만 하고 출력은 추후 해당 변수를 이용해서 원할 때 출력할 수 있으며, 생략 시 해당 지점에서 바로 출력됩니다. 
   [숫자 파싱]
   <fmt:parseNumber value="파싱할 문자열" type="출력양식" 
                    var="해당 값을 담을 변수명" 
                    integerOnly="정수만 파싱할 경우 ture / 아니면 false(기본값)" 
                    pattern="숫자 패턴"  scope="변수를 저장할 영역" />
   * type 속성 값 예시 : percent / currency / number(기본값) 
2) 날짜 포맷 및 타임존
   [날짜 포맷팅]
   <fmt:formatDate value="출력할 날짜" type="출력양식" var="해당 값을 담을 변수명" 
                   dateStyle="날짜 스타일" timeStyle="시간 스타일" 
                   pattern="날짜 패턴" scope="변수를 저장할 영역" />
   * type 속성 값 예시 : date(날짜만) / time(시간만) / both(둘 다)
   * dateStyle 속성 값 예시 
     : default(YYYY. MM. DD) / short(YY. MM. DD) / long(YYYY년 MM월 DD일) / full(YYYY년 MM월 DD일 D요일)
   * timeStyle 속성 값 예시 
     : default(오전/오후 HH:MM:SS) / short(오전/오후 HH:MM) / long(오전/오후 HH시 MM분 SS초 KST) / full(오전/오후 HH시 MM분 SS초 대한민국 표준시)
   [타임존 설정]
   <fmt:timeZone value="설정할 타임존">
    위 설명한 날짜 포맷팅 태그 이용
   </fmt:timeZone>
   * 대표적 타임존 : GMT(그리니치 천문대) / America/Chicago(미 중부 표준 시)
3. 로케일 설정 : 국가별로 다른 통화 기호나 날짜를 표현할 때 사용
   <fmt:setLocale value="기준 국가 코드">
   * 대표적 국가 코드 : ko_kr (한국) / ja_JP (일본) / en_US (미국)

Review

  • 액션태그, EL, JSTL...모든게 짬뽕되서 머리가 어질함. 쓰다보면 정리가 되지 않을까 싶습니다.
  • JSTL 중 XML부분은 간단히 읽어만 보기

TO DO

  • 밀린 정리 하기!
profile
블로그 이전 했습니다. 아래 블로그 아이콘(🏠) 눌러서 놀러오세요

0개의 댓글