ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP 정리
    IT/Spring-JSP&Servlet 2020. 4. 1. 00:09

    출처 : unsplash.com

     

    참고도서: 자바 웹을 다루는 기술

    (참고도서를 통해 공부하면서 내용 정리함)

     

    1. JSP
    - 기존 서블릿에서는 자바 코드를 기반으로 문자열을 이용하여(ex. println()) HTML과 javascript로 화면을 구성
    - but, JSP는 HTML, CSS, javascript를 기반으로 JSP 요소들을 사용해 화면을 구현

      (정적인 내용은 HTML/XML 활용, 동적인 내용은 JSP 태그와 스크립트 코드로 작성)

    - Servlet과 JSP 모두 웹 서버단에서 수행되는 기술이라는 점에서는 동일하지만 구현 방식이 상이
    2. JSP 구성요소
    - HTML, CSS, javascript
    - JSP 기본태그
    - JSP 액션태그
    - 커스텀(custom)태그 : 개발자가 직접 만들거나 프레임워크에서 제공

    3. JSP 변환과정
    1) 변환단계(Translation step) : (컨테이너가) jsp파일이 java파일로 변환  (ex. A.jsp -> A_jsp.java)
    2) 컴파일단계(Compile step) : (컨테이너가) 변환된 java파일을 클래스(class)파일로 컴파일 (ex. A_jsp.java -> A_jsp.class)
    3) 실행단계(Interpret step) : (컨테이너가) class파일을 실행하여 그 결과(HTML, CSS, javascript)를 브라우저로 전송/출력


    4. JSP페이지 구성요소
    - 디렉티브 태그(Directive Tag)
    - 스크립트 요소(Scripting Element) : 주석문, 스크립트릿(scriptlet) 표현식, 선언식
    - 표현 언어(Expression Language)
    - 내장 객체(내장 변수)
    - 액션 태그(Action Tag)
    - 커스텀 태그(Custom Tag)

    4.1 디렉티브 태그 (Directive Tag) - 지시자 태그
    - 주로 JSP페이지에 대한 전반적인 설정 정보를 지정할 때 사용
    - 종류: 
      - 페이지 디렉티브 태그 (Page Directive Tag) : jsp페이지의 전반적인 정보 설정
      - 인클루드 디렉티브 태그 (Include Directive Tag) : 공통으로 사용하는 jsp페이지를 다른 jsp페이지에 추가 시
      - 태그라이브 디렉티브 태그 (Taglib Directive Tag) : 개발자/프레임워크에서 제공하는 태그를 사용 시

    4.1.1 페이지 디렉티브 태그
    - 사용법: <%@page %> 안에 속성과 값을 나열
      <%@page 속성1="값1" 속성2="값2" 속성3="값3" ... %>

     

    4.1.2 인클루드 디렉티브 태그
    - 사용법: <%@ include %> 안에 속성과 값을 나열
      <%@ include file="공통기능.jsp" %>


    5. JSP 스크립트 요소

    - 정의: JSP 페이지에서 여러 가지 동적인 처리를 제공하는 기능

                <% %> 기호 안에 자바 코드로 구현 (<% %> 기호를 스크립트릿(scriptlet)이라고 부름)

    - 종류: 

    • 선언문: JSP에서 멤버 변수나 멤버 메서드를 선언할 때 사용 (선언문 내 멤버는 서블릿 변환 시 서블릿 클래스의 멤버로 변환됨)
    • 스크립트릿: JSP에서 자바 코드를 작성할 때 사용
    • 표현식: JSP에서 변수의 값을 출력할 때 사용

    5.1 선언문

    - 형식: <%! 멤버 변수 or 멤버 메서드 %>

    - 선언문에 작성된 내용은 Servlet 변환 시 Servlet 클래스의 멤버(멤버 변수 또는 메서드)가 됨

    - 객체 한 번 생성되면 계속 객체 상태 유지하면서 재활용되고 여러 클라이언트에서 요청 시 Servelt 객체를 공유하기 때문에 멤버 변수 사용은 가급적 자제하자!

     

    5.2 스크립트릿(수행문)

    - 형식: <% 자바 코드 %>

    - 초기 JSP에서 멤버(멤버 변수 또는 메서드) 정의와 관련된 내용을 제외하고 모든 자바 코드를 이용해 화면의 동적인 기능을 구현 (현재 JSP에서는 거의 사용되지 않음)

    - JSP 수행이 요청될 때마다 서버에서 수행해야 하는 java 코드를 추가하고자 할 때 사용하는 스크립트 태그!

    - 작성된 코드는 JSP 가 Servlet 으로 변환될 때 _jspService() 안에 그대로 삽입되므로 java 구문에 맞춰 작성해야 한다!

     

    5.3 표현식

    - 형식: <%= 값 or 자바 변수 or 자바 식 %>

    - 주의: <%= %> 안의 자바 변수나 자바 식에는 세미콜론(;)을 사용하면 안됨


    6. JSP 주석문

    - 종류:

    • HTML 주석
    • 자바 주석
    • JSP 주석 : <%-- 내용 --%>

     

    - Note: HTML주석 및 java주석은 서블릿으로 변환 시 자바 주석문으로 표시되지만, JSP 주석문은 JSP 자체의 주석문이기 때문에 서블릿 코드로 변환되지 않음.

    -> 간혹 jsp파일을 컴파일 시 하기와 같은 에러가 뜨면서 실패하는 경우가 있음

     

        " jasper.jasperexception unable to compile class for jsp code too large for try statement "

     

        jsp의 변환된 java파일을 보면 try 문 안에 jsp파일이 out.writer() 메서드 내에 기록이 되었고 해당 jsp에 자바 주석이 상당한 양이 있어 이를 지웠던 적이 있음 -> 이걸 지울게 아니라 jsp주석으로 바꿨으면 try문 내 자바 길이가 길어지지 않았을 듯.

     

    -> 이는 64KB를 넘어서 발생하는 문제로써 해당 파일을 쪼개어 "jsp:include" 하거나 코드 길이를 줄이는 방법이 있음

    There is a 64k limit on the size of the methods, so you may want to break up the pages into multiple ones (and then combine them using jsp:include) 
    or optimize your jsp so that the size of the generated code is reduced.

     

    -> 소스최적화 참고 : https://okky.kr/article/41858

    -> 기타 참고: https://m.cafe.daum.net/sepro/5CO5/99?listURI=%2Fsepro%2F_rec


    7. JSP 내장객체(내장변수) 기능

    - 정의: JSP가 서블릿으로 변환될 때 (개발자가 일일이 만드는 것이 아니라) 컨테이너가 자동으로 생성시키는 서블릿 멤버 변수를 지칭

    - 종류: 

    • page : 한 번의 요청에 대해 하나의 JSP 페이지를 공유
    • request : 한 번의 요청에 대해 같은 요청을 공유하는 JSP 페이지를 공유
    • session : 같은 브라우저에서 공유
    • application : 같은 애플리케이션에서 공유

    8. JSP 페이지 예외 처리하기

    - 예외 처리 JSP에 디렉티브 태그 속성 중 " isErrorPage " 속성을 "true"로 설정 (addException.jsp)

      <%@ page isErrorPage="true" %>

    - 일반 JSP 페이지의 디렉티브 태그 속성 중 " errorPage " 속성을 예외 처리 JSP 페이지 이름으로 지정 (add.jsp)

       <%@ page errorPage="addException.jsp" %>

     

    8.1 JSP페이지 오류

    - 404: page not found (요청한 JSP 페이지 미존재)

    - 500: internal server error (컨테이너에서 jsp 페이지 처리 중 오류 발생 - 주로 jsp 코딩 오류)

    - 수십 개의 jsp 페이지별로 각각 오류 페이지를 설정하기 보다는 "web.xml"에 설정하여 발생하는 에러코드별 노출할 에러페이지 설정 가능!

      <error-page>
      	<error-code>404</error-code>
      	<location>/err/error_404.jsp</location>
      </error-page>
      
      <error-page>
      	<error-code>500</error-code>
      	<location>/err/error_500.jsp</location>
      </error-page>

    9. 액션 태그

    - JSP를 개발할 때 자주 구현하는 기능을 제공하는 JSP의 고유 태그로 "표준 액션 태그" 와 "커스텀 액션 태그"로 구분 가능

      ( 표준 액션 태그는 JSP 구현 시 언제든 사용 가능하고, 커스템 액션 태그는 개발자가 직접 구현하여 사용한다. )

    - JSP에서 스크립트릿(<% %>)의 자바 코드 대신에 보다 쉽고 편리하게 디자이너 작업을 할 수 있도록 태그 형태로 제공된 기능

    - 표준 액션 태그 종류

    이름 형식 설명
    인클루드 액션 태그 <jsp:include> 현 JSP에 다른 JSP를 포함
    포워드 액션 태그 <jsp:forward> 서블릿에서 RequestDispatcher 클래서의 기능을 대신하는 태그
    유즈빈 액션 태그 <jsp:useBean> 객체를 생성하기 위한 new 연산자를 대신하는 태그
    셋프로퍼티 액션 태그 <jsp:setProperty> setter를 대신하는 태그
    겟프로퍼티 액션 태그 <jsp:getProperty> getter를 대신하는 태그

     

    9.1 인클루드 액션 태그 <jsp:include>

    - 다른 자원의 수행 결과를 포함하는 기능을 지원

    - 영역을 구분하여 공통으로 사용하는 jsp페이지를 다른 jsp페이지에 추가 시 사용하는 "인클루드 디렉티브 태그"와 같이 화면을 분할해서 관리할 때 사용

    - <jsp:include> 에서 flush 속성을 true/false 로 설정 가능 (true: include 기능 수행 전 출력 버퍼를 flush(비움))

      -> include 되는 자원으로부터 '응답(response)' 내용만 포함한다는 의미!

    - 예시: <jsp:include page="jsp페이지" flush="true 또는 false"> ... </jsp:include>

      -> flush : 지정한 "jsp페이지"를 실행하기 전 출력 버퍼 비움 여부를 지정

    항목 인클루드 액션 태그 (include 액션) 인클루드 디렉티브 태그 (include 지시자)
    구문 <jsp:include page=... /> <%@ include file=... %>
    설명 대상을 독립적으로 수행시키고 수행 결과만을 포함 -> jsp가 아닌 다른 기술로 만들어진 자원이라도 대상이 될 수 있음 대상의 소스를 jsp 안에 포함하여 servlet 소스로 변환 -> jsp 구문에 위배되는 내용은 포함 불가
    기능 jsp 레이아웃 모듈화 jsp 레이아웃 모듈화
    처리 시점 요청 시점에 처리
    (요청 시마다 include 가 처리됨)
    jsp -> java 변환 시 처리
    데이터 처리 방법 param 액션 태그를 이용해 동적 처리 정적 처리 only
    포함된 jsp 자바 파일 변환 여부 포함되는 jsp가 각각 자바 파일로 생성 포함되는 jsp가 포함하는 jsp에 합쳐진 후 한 개의 자바 파일로 생성

     

    9.2 포워드 액션 태그 <jsp:forward>

    - 서블릿에서 다른 서블릿으로 포워딩하는 방법으로써 "RequestDispatcher"를 이용하는 방법이 있음.

    - 포워드 액션 태그 사용 시 자바 코드 '없이도' 포워딩 가능하며, 포워딩 시 다른 서블릿이나 JSP로 값을 전달 가능

    - 동일 컨텍스트에 존재하는 또 다른 리소스(JSP페이지나 Servlet)으로 제어를 옮겨서 대신 응답하려는 경우 사용 (≑  요청 재지정)

    - 형식: <jsp:forward page="포워딩할 JSP 페이지"> ... </jsp:forward>

     

    9.3 자바 빈 (Java Beans)

    - 정의: 웹 프로그램(Java EE) 프로그래밍 시 여러 객체를 거치면서 만들어지는 데이터를 저장하거나 전달하는데 사용

    - JSP에서 사용되는 Java Beans 는 태그(표준 액션 태그, <jsp:useBean>)로 객체 생성 가능하고 이 객체가 수행되는데 필요한 데이터를 태그로 설정 가능하고, 수행 결과값을 태그로 추출 가능해야 한다 → 아래 규칙을 준수해야 함

    • JSP 에서 사용하는 Java 클래스는 패키지화되어야 하므로 "패키지를 선언" 해야 한다.
    • 매개 변수가 없는 생성자 메서드를 정의한다. (default 생성자)
    • 객체가 수행하는데 필요한 값 그리고 수행 결과값을 보관하는 멤버 변수를 private 타입으로 선언한다.
    • 객체가 수행하는데 필요한 값은 setter 메서드를 통해서 설정 가능하도록 setter 메서드 정의 필수
    • 객체의 수행 결과값을 getter 메서드를 통해서 추출 가능하도록 getter 메서드 정의 필수

    - 상기 규칙을 준수하지 못하더라도 jsp에서 java 클래스 사용에 제약 있는 것은 아니고, 다만 '표준 액션 태그'로 사용이 불가할 뿐이다.

    - 자바의 DTO(Data Transfer Object, 데이터 전송 객체) 클래스, VO(Value Object, 값 객체) 클래스와 같은 개념

    - 주로 스크립트릿(<% %>) 내에 java코드로 구현

     

    9.4 유즈빈 액션 태그 <jsp:useBean>

    - JavaBeans 클래스의 객체를 생성하거나 이미 생성된 JavaBeans 객체를 추출하는 기능을 수행

    - java 코드로 이루어진 자바 빈의 경우 코드가 길어지면 화면이 복잡해지는 단점이 존재

    - 유즈빈 액션 태그는 JSP 페이지에서 자바 빈을 대체하기 위한 태그

    - 형식: <jsp:useBean id="빈 이름" class="패키지 이름을 포함한 자바 빈 클래스 [scope="접근범위"] />

      (scope: 자바 빈에 대한 접근 범위를 지정하는 역할, 값: page(default), request, session, application)

     

    9.5 setProperty/getProperty <jsp:setProperty>, <jsp:getProperty>

    - 정의: useBean에 접근해 속성 값을 설정하거나 가져오는 태그

    - <jsp:getProperty> 액션 태그는 JavaBeans 객체의 getter 메서드를 호출해서 객체의 수행 결과값을 추출&출력하는 기능 제공

    - <jsp:setProperty> 액션 태그는 JavaBeans 객체의 setter 메서드를 호출해서 객체에서 사용하는 데이터 값을 설정하는 기능 제공

    더보기

    - 형식: <jsp:setProperty name="자바 빈 이름" property="속성 이름" value="값" />

               <jsp:getProperty name="자바 빈 이름" property="속성 이름" value="값" />

       ※ name: <jsp:useBean> 액션 태그의 id 속성에 지정한 이름

    - 형식2: <jsp:setProperty name="자바 빈 이름" property="속성 이름" param="속성 이름" />

                 <jsp:getProperty name="자바 빈 이름" property="속성 이름" param="속성 이름" />

         param: 전달된 매개변수 이름으로 useBean의 속성에 자동으로 값을 설정

    - 형식3: <jsp:setProperty name="자바 빈 이름" property="속성 이름" />

                 <jsp:getProperty name="자바 빈 이름" property="속성 이름" />

        ※ property 속성에는 property명을 지정하는데, 호출하려는 getter/setter 메서드에서 get을 제외한 명칭 중 첫 글자를 소문자로 변경한 값을 설정한다.

         property 속성 이름만 지정하면 전달받은 매개변수 중 같은 매개변수 값을 자동으로 설정

    - 형식4: <jsp:setProperty name="자바 빈 이름" property="*" />

                 <jsp:getProperty name="자바 빈 이름" property="*" />

         property 속성에 * 를 지정하면 jsp페이지에서 자동으로 매개변수 이름과 속성 이름을 비교한 후 같은 이름의 속성 이름에 전달된 값을 자동으로 설정함

         사전에 jsp나 html페이지에서 전달될 데이터의 매개변수 이름과 속성 이름을 동일하게 설정

     

    9.5.1 <jsp:getProperty>

    - 작성 : 엠티 태그(emptytag, 선언 후 바로 닫음(/)) 형식으로만 사용 가능

    <jsp:getProperty name="beanName" property="propertyName" />

     

    9.5.2 <jsp:setProperty>

    - 작성 : 엠티 태그(emptytag, 선언 후 바로 닫음(/)) 형식으로만 사용 가능

    <jsp:setProperty name="beanName" property="propertyName" />

    10. 표현 언어 (EL, Expression Language)

    - 자바 코드가 들어가는 표현식(<%= %>)을 좀 더 편리하게 사용하기 위해 JSP 2.0부터 도입된 데이터 출력 기능

    - 표현 언어를 사용하기 위해서 '페이지 디렉티브 태그'의 속성인 " isELIgnored "를 'false'로 설정 필요

    - 표현 언어에서만 사용 가능한 내장 객체(내장 변수)가 존재

      ex) param, ..

    - 형식: ${표현식 or 값}

     

    10.1 param 내장 객체

    - request.getParameter() 매서드를 호출한 것과 같으며, 한 개의 값을 전달하는 요청 매개변수를 처리

    - 형식: ${param."변수명"}

    - request.getParameter() 와의 차이

      i) request.getParameter() 를 통해 전달된 값을 사용하기 위해선 별도 변수에 저장하여야 하며, 해당 값이 전달되지 않는다면 null로 표기됨

      ii) param 내장 객체는 전달 값이 없더라도 별도 값을 가지지 않음

    첫 번째 행: getParameter 사용 시, 두 번째 행: param 사용 시

    10.2 requestScope 내장 객체

    - JSP의 request와 같은 기능을 하고 request에 바인딩된 객체를 참조

    - 형식: ${requestScope."변수명"}

    참고) sessionScope, applicationScope의 경우도 각각 session, application과 동일한 기능을 하며, 바인딩 된 객체를 참조

     

    10.3 pageContext 내장 객체

    - javax.servlet.jsp.PageContext 클래스를 상속해 웹 컨테이너가 JSP 실행 시 자동으로 생성해서 제공하는 내장 객체

    - 형식: <a> 태그를 이용해 다른 서블릿이나 JSP를 요청하는 2가지 방법이 존재

      i) 컨텍스트 이름(ex. pro14)을 직접 입력하는 방식

         => <a href="/pro14/test01/memberForm.jsp">회원 가입하기</a>

          단점) 컨텍스트 이름(ex. pro14)이 바뀌면 일일이 찾아서 수정해야 함

       ii) getContextPath() 매세드를 이용해 컨텍스트 이름을 가져오는 방식

         => <a href="<%=request.getContextPath() %>/test01/memberForm.jsp">회원 가입하기</a>

     

    10.4 Bean 사용

    - 자바 코드를 사용하지 않고 바로 Bean ID로 속성에 접근해 값을 취할 수 있음

    - 형식: ${빈이름.속성이름}

     

    10.5 Collection 객체 사용

    - 형식: ${Collection객체이름[index].속성이름}

    더보기

    잠깐!! Collection 인터페이스
    - 정의: 객체를 저장하거나 쉽게 조작할 수 있도록 제공된 interface
    - 유형: 크게 List, Set, Map 3가지로 구분 가능 (List, Set은 value만 저장되지만 Map은 key-value 쌍으로 저장됨)
      List : 각 요소에 정수 인덱스가 붙은 순차 컬렉션 (ex. ArrayList, LinkedList, ..)
      Set : 효율적인 포함 여부 검사에 최적화되어 있음 (ex. HashSet, TreeSet, ..)
      Map : (ex. HashMap, TreeMap, ..)
    - 데이터 추가를 위해 List, Set은 add() 메소드를 사용하는 반면, put() 메소드 사용함.

     

    10.6 HshMap 객체 사용

    - 형식: ${HashMap객체이름.키이름}

     

    10.7 표현 언어로 바인딩 속성 출력하기

    - request, session, applicaion 내장 객체에 속성을 바인딩한 후 다른 서블릿이나 jsp에 전달할 수 있으며,

      이때 표현 언어를 사용하면 자바 코드 사용하지 않고서도 바인딩된 속성 이름으로 출력 가능함

    - request, session, application 내장 객체에 setAttribute를 통해 값을 바인딩하며, getAttribute를 통해 값을 가져옴

    - 표현식(<%= %>)을 통해 값을 출력할 수 있고, 표현 언어(${ })를 통해 값을 출력할 수 있다.

    - request, session, application 내장 객체 간 우선 순위가 있으며, 같은 속성 이름으로 바인딩 시 다음의 우선순위로 출력함

      page > request > session > application

     

    10.8 커스텀 태그

    - 액션 태그나 표현 언어를 사용하더라도 조건식이나 반복문에서 자바 코드를 사용하고 있는데, 이러한 점을 개선하기 위해 커스텀 태그 사용

    - 종류

    • JSTL(JSP Standard Tag Library) : JSP페이지에서 가장 많이 사용하는 기능을 태그로 제공, JSTL 라이브러리를 따로 설치하여 사용
    • 커스텀태그: 개발자가 필요에 의해 만든 태그로 스트러츠나 스프링 프레임워크에서 미리 만들어서 제공

     

    10.8.1 JSTL (JSP 표준 태그 라이브러리)

    라이브러리 세부 기능 접두어
    코어 변수 지원, 흐름 제어, 반복문 처리, URL 처리 c
    국제화 지역, 메시지 형식, 숫자 및 날짜 형식 fmt
    XML XML 코어, 흐름 제어, XML 변환 x
    데이터베이스 SQL sql
    함수 컬렉션 처리, 문자열 처리 fn

    1) Core 태그 라이브러리

    - JSP에서 자바 코드로 구현하는 변수 선언, 조건식, 반복문 등을 구현하는 라이브러리

    - 톰캣에서 기본적으로 제공하지 않기 때문에 taglib 디렉티브 태그 추가 필요!

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

     

    기능 태그 설명
    변수 지원 <c:set> jsp페이지에서 변수 지정
      <c:remove> 지정된 변수 제거
    흐름 제어 <c:if> 조건문 사용
      <c:choose> switch문 사용
      <c:forEach> 반복문 사용
      <c:forTokens> 구분자로 분리된 각각의 토근 처리
    URL 처리 <c:import> URL을 이용해 다른 자원을 jsp에 추가
      <c:redirect> reponse.sendRedirect() 기능 수행
      <c:url> 요청 매개변수로부터 URL 생성
    기타 태그 <c:catch> 예외 처리에 사용
      <c:out> JspWriter에 내용을 처리 후 출력

    A. <c:if> 태그

    - JSP페이지에서 조건문을 대체해 사용하는 태그

    - 형식: <c:if test="${조건식}" var="변수이름" [scope="scope 속성 중 하나"] > ... </c:if>

      scope속성: page, request, session, application

     

    B. <c:choose> 태그

    - JSP페이지에서 switch문의 기능을 수행

    - 형식:

    <c:choose>

         <c:when test="조건식1" >본문내용</c:when>

         <c:when test="조건식2" >본문내용</c:when>

          ...

         <c:otherwise>본문내용</c:otherwise>

    </c:choose>

     

    C. <c:forEach> 태그

    - JSP페이지에서 반복문을 수행하는 태그

    - 형식:

    <c:forEach var="변수이름" items="반복할객체이름" begin="시작값" end="마지막값"

                     step="증가값" varStatus="반복상태변수이름">

      ...

    </c:forEach>

    ▼ varStatus 속성

    속성 설명
    index int items에서 정의한 항목을 가리키는 index번호 (0부터 시작)
    count int 몇 번째 반복인지 나타냄 (1부터 시작)
    first boolean 첫 번째 반복인지 나타냄
    last boolean 마지막 반복인지 나타냄

    D. <c:url> 태그

    - JSP페이지에서 URL 정보를 저장하는 역할

    - 형식: 

    <c:url var="변수이름" value="URL경로" [scope="scope 속성 중 하나"]

         [ <c:param name="매개변수이름" value="전달값" /> ]

         ...

    </c:url>

     

    E. <c:redirect> 태그

    - 지정된 JSP페이지로 리다이렉트할 때 사용. response.sendRedirect() 기능과 동일

    - <c:redirect> 태그로 리다이렉트 시 매개변수 전달 가능

    - 형식: 

    <c:redirect url="redirect할 URL">

        [ <c:param name="매개변수이름" value="전달값" /> ]

        ...

    </c:redirect>

     

    F. <c:out> 태그

    - 화면에 지정한 값을 출력하는 태그

    - 표현 언어와 기능은 거의 동일하지만 기본값 설정 기능 등을 제공하므로 사용이 보다 편리함

    - 형식: <c:out value="출력값" default="기본값" [escapeXml="boolean값"] />

     

     

    댓글

Designed by Tistory.