본문 바로가기
백엔드/JSP

JSP

by shinyou1024 2020. 4. 24.

1. 개요

JSP 특징

  • 웹 페이지를 동적으로 처리할 수 있는 기술 중의 하나
  • 서블릿 프로그램의 기능을 HTML 파일 내에 스크립트 형식으로 구현할 수 있음

이점

프레젠테이션 로직과 비즈니스 로직의 분리

  • 프레젠테이션 로직 : 브러우저 화면의 표현을 꾸미는 절차 및 기능

  • 비즈니스 로직 : 사용자 요청에 대한 내부적인 처리 절차

  • 분리의 중요성 : 웹 페이지 디자인이 변경돼도 내부 비즈니스 로직의 변경이 필요 없음!

    (반대도 마찬가지)

컴포넌트 재사용

  • JSP페이지나 자바빈즈에서 공통적으로 사용되는 컴포넌트를 만들어 재사용
  • 예 : 주소 검색, 한글 처리, DB 연결

기타

  • JSTL, EL, 커스텀 태그 활용 가능
  • 서버 자원의 효율적 관리

JSP의 처리과정

최초 요청 시

  • JSP 파일은 Servlet으로 변환 ⇒ 클래스 파일로 컴파일

  • 해당 클래스 파일이 Tomcat 내에서 실행되어 그 결과가 웹 브라우저로 전달

    Tomcat이 JSP/Servlet 컨테이너임

재요청 시

  • 메모리에 적재된 클래스가 응답을 줌

    ⇒ 서블릿 변환, 컴파일 작업 생략됨

2. 스크립팅 요소

Scriptlet (스크립틀릿)

  • JSP 페이지 내에서 java 코드 구현을 위해 사용

  • 서블릿으로 변환될 때 변환된 서블릿의 service메소드 안에 구현

  • 태그내에서 선언된 변수는 로컬변수!

    // <% 자바 코드 %>
    <%
      for(int i=0; i<=10; i++) {
          out.println("HelloWorld+<br>");
      }
    %>
    Declaration (선언)
  • 멤버 변수, 메소드 선언

  • 서블릿 변환시 서블릿의 멤버변수나 메소드로 선언됨

    // <%! 속성 선언 및 method 작성 %>
    <%!
      String name="Kim";
      public boolean isExist() {
          return true;
      }
    %>
    Expression (표현식)
  • 간단한 데이터 출력이나 메소드 호출을 통한 데이터 출력을 위해 활용

    ⇒ 즉, 브라우저에 출력할 때

  • 코드 마지막에 세미콜론(;)없는 것 주의!!!

    // <%= 출력 값, 변수, 함수 결과 %>
    <%= result + resultSum() %>

    3. Directive 태그 (지시자)

  • JSP 페이지에 대해 JSP 엔진 및 컨테이너에게 각종 처리 정보 전달하고 수행해야 할 기능을 정하는 역할

종류

page Directive 태그

  • 컨테이너에게 현재 JSP페이지를 이렇게 처리할 것인가에 대한 정보를 제공하는데 사용
<%@ page contentType="text/html; charset=utf-8;"%> 

include Directive 태그

  • 여러 JSP페이지에서 공통적인 내용이 있을 때 파일로 저장한 후 필요할 때 재사용
  • JSP페이지에서 파일을 삽입하여 사용
<td>html include</td>
<td><%@ include file="topbar.jsp"%></td>

taglib Directive 태그

  • 사용자에 의해 만든 커스텀 태그를 이용할 때 사용
  • JSP 페이지 내에 불필요한 자바 코드를 줄일 수 있다
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="core" %>

4. JSP 기본객체와 활성범위

JSP 기본 객체

  • 서블릿 패키지 내의 클래스 혹은 인터페이스
  • 서블릿 내의 클래스나 인터페이스를 선언하고 초기화해주는 일을 미리 jsp가 특정한 이름으로 대신해 줌
  • 단, JSP 기본객체는 선언부에서는 사용 불가

Request 기본 객체

  • 클래스의 인스턴스로서 HTML폼을 통해 전달되는 값을 가져오거나
  • HTTP 요청 자체에 담겨 있는 정보를 가져올 때

주요 메소드

  • getParameterName() : 현재 요청에 포함된 파라미터의 이름을 Enumeration형태로 넘겨줌

  • getParameter(String name) : name과 같은 이름을 가진 파라미터의 값을 가져옴

  • getParameterValues(String name) : name과 같은 이름을 가진 파라미터의 값을 배열 형태로 가져옴

    주로 checkbox, multiple, list에 사용

  • getCookies() : 모든 쿠키 값을 배열 형태로 가져옴

  • getMethod() : 현재 요청이 GET인지 POST인지

  • getSession() : 현재 세션 객체를 가져옴

  • getQueryString() : 요청 URL 중 QueryString 리턴

  • getContextPath() : 요청에 대한 컨텍스트 패스 정보 리턴. "/"로 시작

  • setCharacterEncoding() : 현재 JSP로 전달되는 내용을 지정한 캐릭터셋으로 변환. 한글 입력 시 필수!

request_result.jsp

...
    <tr>
        <td>이름<td>
        <td><%=request.getParameter("id")%></td>
    </tr>
    <tr>
        <td>상품</td>
    <td>
<% 
    String favorites[] = request.getParameterValues("items");
    for(String item:items) {
        out.println(item+"<br>");
    }
%>
    </td>
    <tr>

Response 기본 객체

클래스의 인스턴스로서 사용자 요청에 대한 응답을 처리하기 위해 사용

주요 메소드

  • setContentType(String type)
  • sendError(int status, String msg) : 오류 코드 세팅, 메시지 보내기
  • sendRedirect(url) : 클라이언트 요청을 다른 페이지로 보낸다
  • getOutputStream() : 바이너리 데이터 출력이 가능한 스트림을 얻어온다

1) PageContext 기본 객체

다른 기본 객체에 대한 프로그램적인 접근 방법 제공

주요 메소드

  • getPage() : 현 페이지에 대응하여 생성된 서블릿 인스턴스인 page 기본 객체를 리턴
  • getRequest() : 현 페이지의 클라이언트 요청 정보를 가지고 있는 request 기본 객체 리턴
  • getResponse() : 현 페이지의 클라이언트 응답 정보를 가지고 있는 request 기본 객체 리턴
  • getOut() : 현 페이지의 output stream인 out 기본 객체 리턴
  • getSession()
  • getServletContext()
  • getException()

2) Exception 기본 객체

오류페이지로 지정된 JSP 페이지에서 예외 발생 시 전달되는 인스턴스에 대한 참조 변수

(오류 페이지 지정 : isErrorPage="true")

활성 범위(scope)와 기본 객체

188 페이지 삽입

Scope와 정보공유

  • pageContext, request, session, application 객체는 Scope내에서 정보를 공유할 수 있는 방법 제공
  • 속성을 저장하고 조회할 수 있는 방법 제공
  • LifeCycle 길이 비교 : application > session > request > page

page scope

  • page scope에 있는 객체 각 페이지의 pageContext에 저장
  • 객체를 생성한 JSP 페이지를 통해서만 접근 가능
  • 응답을 클라에게 보내거나 페이지를 다른 자원에 forward하면 pageContext 객체를 사용할 수 없음
  • Scope 속성 미지정 시 디폴트로 page scope로 설정

request scope

  • 서버는 클라의 HTTP 요청이 있을 때마다 HttpServletRequest 인터페이스를 구현한 객체를 생성
  • 이 객체는 request scope의 생명주기 동안 객체를 저장할 수 있는 키/값 속성 쌍들의 컬렉션을 담고 있음

session scope

  • 객체들을 키/값 쌍으로 저장하는 것을 허용

  • request scope와의 차이점 : 지속성

    session scope의 생명주기가 더 길다 (다수 요청에 걸쳐 존재)

application scope

  • ServletContext는 모든 애플리케이션에서 애플리케이션 객체를 조회/저장할 수 있도록 함

    ⇒ ServletContext는 request scope와 sessions scope의 상위 스코프

  • 애플리케이션 객체의 수명 : 서버가 살아있는 동안

속성(attribute) : <name, value>

  • pageContext, request, session, application 기본 객체만 가지고 있는 정보 저장 장소
  • 각 활성 범위가 생성되어 소멸되기 전까지 연관된 기본 객체에 특정 정보를 저장하여 활용
  • 서블릿과 JSP 페이지 간 특정 정보 주고받거나 공유할 때 사용
  • name(속성 이름) : String
  • value(값) : Object

메소드

  • setAttribute(String name, Object value) : name이름으로 Object형 데이터 저장
  • getAttribute(String name) : name에 해당하는 속성 값이 있으면 Object형태로 가져옴
  • removeAttribute(String name) : 삭제

5. 에러 처리

Page Directive를 이용한 에러 처리

  • errorPage, isErrorPage 속성 사용 목적 : 발생하는 오류를 일관되게 처리

  • HTTP 주요 에러코드

    400 : Request 구문 오류

    404 : 요청 자원이 존재하지 않음

    405 : 요청 메소드(GET, POST, PUT)가 허용되지 않음

    500 : 서버 내부 오류 발생

  • WEB-INF/web.xml에서 변경

      <error-page>
          <error-code>404</error-code>
          <location>/ErrorHandler404.jsp/</location>
      </error-page>
  • 오류 페이지 예시 (ErrorHandler404.jsp)

      <% response.setStatus(HttpServletResponse.SC_OK); %>
      ... 생략

Java Exception과 에러 페이지

  • Exception 클래스 작성 :자바 클래스나 서블릿 클래스에서 CheckedException을 catch하는 부분에서 발생하게 될 Exception을 RuntimeExcpetion으로 래핑해주는 사용자정의 Exception 클래스

  • 해당 Exception 클래스를 사용한 서블릿 클래스 생성을 통해 예외 처리할 수 있음

  • web.xml 내 Exception 발생시 출력할 페이지 설정

      <web-app>
      <error-page>
          <exception-type>java.lang.Exception</exception-type>
          <location>/error/expHandler.jsp</location>
      </error-page>
      </web-app>

'백엔드 > JSP' 카테고리의 다른 글

Servlet  (0) 2020.04.24

댓글