JSP(JavaServer Page)

JSP 등장 배경

  • ms사에서 ASP(Active Server Page) 라는 쉽게 웹을 개발할 수 있는 script 엔진을 발표. (1998)
  • 1997년에 발표된 서블릿은 ASP에 비해 상대적으로 개발이 불편.
  • ASP에 대항하기 위하여 썬에서 JSP를 발표. (1999)

모든 JSP는 Servlet으로 바뀌어 동작한다

  • WAS가 변경함.
  • eclipse, tomcat을 사용하는 본인의 환경에서는 eclipse workspace 아래의 .metadata 폴더에 java로 변경된 jsp파일이 생성된다.
  • 해당 파일의 _jspService() 메소드 안을 살펴 보면 jsp 파일의 내용이 변환되어 들어가 있다.
  • 즉, 이 java 파일(Servlet 코드)이 컴파일 되어 실행되서 그 결과가 클라이언트(브라우저)에 보여진다.

JSP의 실행 순서

  1. 클라이언트(브라우저)가 웹서버에 JSP에 대한 요청 정보를 전달.
  2. 클라이언트가 최초로 JSP를 요청했을 경우, jsp 엔진 동작.
    1. JSP로 작성된 코드를 Servlet 코드로 변환한다. (java 파일 생성)
    2. Servlet Code를 컴파일해서 실행가능한 class 파일로 변환.
    3. Servlet Class를 로딩하고, 인스턴스를 생성.
  3. 서블릿이 실행되어 요청 처리, 응답정보 생성.

JSP Syntax

  • 선언문(Declaration) : <%! %>
    • 전역 변수 선언 및 메소드 선언에 사용.
    • JSP의 body에 작성하는 코드는 기본적으로 Service 메소드 내부로 변환됨.
      • 응답 정보 보내는건 service 메소드이기 때문.
    • 선언문을 사용하면 Service 메소드 외부에 변수나 메소드를 선언할 수 있다.
  • 스크립트릿(Scriptlet) : <% %>
    • Java Code 작성 시 사용.
  • 표현식(Expression) : <%= %>
    • 클라이언트(브라우저)에 응답결과를 표현하고 싶은 java code 부분.
    • 즉, 사용자 화면에 출력할 내용 기술.
  • 주석(Comment)
    • HTML주석, Java주석, JSP주석 사용 가능.
    • JSP 주석(<%-- --%>) : 서블릿으로 변경 자체가 되지 않음.
    • Java 주석(// , /* */) : 서블릿으로 변경되어, java 파일에서 주석.
    • HTML 주석(<!-- --!>) : 서블릿으로 변경되고, java로 실행 되어 응답결과에 포함도 되나 웹 브라우저가 화면에 출력 시 주석처리.

JSP Implicit Objects(내장 객체)

  • JSP가 Servlet으로 변경될 때 이미 선언되어 있는 객체.
  • response, request, application, session, out …
  • 내장객체

2. EL & JSTL

1) EL(Expression Language)

  • 번역하면 표현 언어.
  • 값을 표현하는데 사용되는 스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다.

  • 기능
    • JSP의 scope에 맞는 속성 사용
    • 집합 객체에 대한 접근 방법 제공
    • 수치 연산, 관계 연산, 논리 연산자 제공
    • 자바 클래스 메소드 호출 기능 제공
    • 기본 객체 제공(scope, parameter …)
  • Syntax
    • 기본
      • ${exp}
    • 객체 접근 규칙
      • ${exp1.exp2}
      • ex) ${param.code}, ${requestScope.name} ..
  • 표현 언어 비활성화 : JSP에 명시하기
    • <%@ page isELIgnored = "true" %>
    • default 값은 false.

2) JSTL(JSP Standard Tag Library)

  • JSP 페이지에서 조건문 처리, 반복문 처리 등을 html tag형태로 작성할 수 있게 돕는 역할을 한다.
  • HTML / JAVA 가 혼용되어 있어 유지보수가 어려운 문제를 해결하기 위해 등장.

  • JSTL의 태그 종류
라이브러리 하위 기능 접두어 관련 URL
코어 변수 지원
흐름 제어
URL 처리
c http://java.sun.com/jsp/jstl/core
XML XML 코어
흐름 제어
XML 변환
x http://java.sun.com/jsp/jstl/xml
국제화 지역
메시지 형식
숫자 및 날짜 형식
fmt http://java.sun.com/jsp/jstl/fmt
데이터베이스 SQL sql http://java.sun.com/jsp/jstl/sql
함수 콜렉션 처리
String 처리
fn http://java.sun.com/jsp/jstl/function


  • 코어 태그
기능분류 태그 설명
변수 지원 set JSP에서 사용될 변수를 설정한다.
  remove 설정한 변수를 제거한다.
흐름 제어 if 조건에 따라 내부 코드를 수행한다.
  choose 다중 조건 처리시 사용.
  forEach 콜렉션, Map의 각 항목 처리 시 사용.
  forTokens 구분자로 분리된 각각의 토큰 처리 시 사용.
URL 처리 import URL을 사용하여 다른 자원의 결과를 삽입한다.
  redirect 지정 경로로 리다이렉트.
  url url을 재작성.
기타 태그 catch 예외 처리 사용.
  out JspWriter에 내용을 알맞게 처리한 후 출력.


  • 코어 태그 : 변수 지원 태그 - set, remove
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <c:set var="varName" scope="session" value="someValue" />
    
    • jsp 파일의 상단에 첫번째 라인과 같이 core tag를 쓸 것이라는 것을 선언한다.
    • 코어의 set Tag를 사용하여 4가지 스코프의 변수에 값을 저장할 수 있다.
    • EL에서 사용되는 변수명은 varNaem, session scope에 “someValue” 값을 셋팅하는 예제이다.
    • remove Tag를 사용하여 스코프에 할당된 변수 삭제 가능하다.
  • 코어 태그 : 변수 지원 태그 - 프로퍼티, 맵의 처리
      <c:set target="${some}" property="propertyName" value="anyValue" />
    
    • target : 변수 객체, property : 프로퍼티 이름, vlaue : 할당할 프로퍼티 값
    • target의 some객체가 자바빈일 경우 : setter메소드 some.setPropertyName(anyValue) 호출
    • target의 some객체가 맵(Map)일 경우 : put메소드 some.put(propertyName, anyValue) 호출
  • 코어 태그 : 흐름제어 태그 - if
      <c:if test="조건">
      // test의 조건이 true일 떄 수행되는 코드
      </c:if>
    
  • 코어 태그 : 흐름제어 태그 - choose
      <c:choose>
          <c:when test = "조건1">
          // 조건 1이 true일 때 수행되는 코드
          </c:when>
    
          <c:when test = "조건2">
          // 조건 2가 true일 때 수행되는 코드
          </c:when>
    
          <c:otherwise>
          // 조건 1, 조건 2를 모두 만족하지 않을 때 수행되는 코드
          </c:otherwise>
      </c:choose>
    
  • 코어 태그 : 흐름제어 태그 - forEach
      <c:forEach var="변수" items="아이템들" [begin="시작번호"] [end="끝번호"]>
          ...
          ${변수}
          ...
      </c:forEach>
    
    • 배열 및 Collection에 저장된 요소를 차례대로 사용한다.
    • var : EL에서 사용할 변수명
    • items : 배열, List, Map ..
    • begin : index 시작 값, 생략 가능
    • end : index 끝 값, 생략 가능
  • 코어 태그 : 흐름제어 태그 - import
      <c:import url="URL" charEncoding="캐릭터인코딩" var="변수명" scope="범위">
          <c:param name="파라미터이름" value="파라미터 값"/>
      </c:import>
    
    • 지정한 URL에 연결하여 결과를 지정한 변수에 저장한다.
    • url : 결과를 읽어올 url.
    • charEncoding : 읽어온 결과를 저장할때 사용할 cahrEncoding.
    • var : 읽어온 결과를 저장할 변수명.
    • scope : 변수를 저장할 영역
    • 태그는 url 속성에 지정한 사이트에 연결할 때 전송할 파라미터.
  • 코어 태그 : 흐름제어 태그 - redirect
      <c:redirect url="URL">
          <c:param name="파라미터이름" value="파라미터 값"/>
      </c:redirect>
    
    • 지정한 페이지로 리다이렉트 한다.
      • response.sendRedirect() 와 유사.
    • url : 리다이렉트될 URL
    • 태그는 url 속성에 지정한 사이트에 연결할 때 전송할 파라미터.
  • 코어 태그 : 기타 태그 - out
      <c:out value="value" [escapeXml="{true|false}"] default="defaultValue" />
    
    • JSPWriter에 데이터를 출력한다.
    • value : JspWriter에 출력할 값을 나타낸다.
    • escapeXml : <, & 와 같은 문자를 &lt:, &amp: 로 변경할 지 여부.
      • 기본 값은 true이다.
    • default - value 속성에서 지정한 값이 존재하지 않을 떄 사용될 값.