JSP의 개념과 문법을 이해한다.

Goal

  • JSP란
    • JSP의 개념
    • JSP의 동작 과정
    • JSP의 특징
  • JSP의 문법을 이해한다.
    • JSP Expression, Scriptlet, Declaration, Comment, Directive, Action
  • JSP에서 동적인 코드를 호출하는 6가지 전략
  • JSP Action 태그와 JSP EL(Expression Language)
  • JSP Scriptlet 태그와 JSTL(JSP Standard Tag Library)

JSP(Java Server Pages)란

Java 언어를 기반으로 하는 Server Side 스크립트 언어

JSP의 내부적인 동작 과정

JSP 문서는 백그라운드에서 Servlet으로 자동으로 변환된다.

  1. JSP가 실행되면 WAS는 내부적으로 JSP 파일을 Java Servlet(.java)으로 변환한다.
  2. WAS는 이 변환한 Servlet을 동작하여 필요한 기능을 수행한다.
    • 1) WAS는 사용자 요청에 맞는 적절한 Servlet 파일을 컴파일(.class 파일 생성)한다.
    • 2) .class 파일을 메모리에 올려 Servlet 객체를 만든다.
    • 3) 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드가 실행된다.
    • 4) WAS는 Request가 올 때마다 thread를 생성하여 처리한다.
    • 5) 각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행한다.
    • 6) service() 메서드는 요청에 맞는 적절한 메서드(doGet, doPost 등)를 호출한다.
  3. 수행 완료 후 생성된 데이터를 웹 페이지와 함께 클라이언트로 응답한다.

JSP의 특징

참고1 Predefined Values(또는 Implicit Object)


JSP 문법

1. JSP Expression

<%= expression %>

2. JSP Scriptlet

<% code fragment %>

3. JSP Declaration

<%! declaration %>

4. JSP Comment

<%-- comment --%>

5. JSP Directive

<%@ directive %>

  1. page
    • <%@ page attribute = "value" %>
    • page 지시어는 Container에 명령을 제공하는데 사용된다.
  2. include
    • <%@ include file = "relative_url" %>
    • include 지시어는 변환 단계에서 다른 외부 파일의 내용을 현재 JSP에 병합하도록 Container에 지시한다.
    • 웹 페이지에서 header와 footer의 구성은 거의 동일하기 때문에 외부에서 형식을 만든 후 include 지시어를 이용하여 main.jsp에 병합한다.
  3. taglib
    • <%@ taglib uri = "uri" prefix = "prefixOfTag" %>
    • JSP API를 사용하면 HTML 또는 XML 태그처럼 보이는 사용자 정의 태그(custom tags)를 정의할 수 있다.
      • JSTL(JSP Standard Tag Library, JSP 표준 태그 라이브러리)사용
      • 아래 참고2
    • tag library는 사용자가 정의한 동작을 구현한 사용자 정의(user-defined) 태그 집합입니다.

6. JSP Action

  1. <jsp:forward> action
    • 다른 리소스(JSP, html 또는 Servlet과 같은 정적 페이지)로 요청을 전달하는데 사용한다.
  2. <jsp:include> action
    • 현재 JSP 페이지에 다른 리소스를 포함시키는데 사용한다.
  3. <jsp:useBean> action
    • 해당하는 Bean(자바 객체)이 이미 존재하는지 확인한다.
    • 객체가 없으면 지정된 객체를 생성한다.
  4. <jsp:setProperty> action
    • Bean(자바 객체)의 속성을 설정한다.
  5. <jsp:getProperty> action
    • 주어진 속성값을 가져오는데 사용되며 이를 문자열로 변환하고 동적인 웹 페이지를 생성하는데 해당 내용을 사용할 수 있다.

JSP에서 동적인 코드를 호출하는 6가지 전략

1번 -> 6번으로 갈수록
간단한 app 또는 작은 규모의 개발팀 -> 복잡한 app 또는 큰 규모의 개발팀(Enterprise)

  1. Call Java code directly
    • Java 코드를 직접 호출
    • 모든 Java 코드를 JSP 페이지에 넣는다.
    • 아주 적은 양의 코드에만 적합한 전략
  2. Call Java code indirectly
    • Java 코드를 간접적으로 호출
    • 별도의 utility class(Java Class)를 작성한다.
    • utility class를 호출하는 데 필요한 Java 코드만 JSP 페이지에 넣는다.
  3. Use beans
    • beans로 구조화된 별도의 utility class(Java Class)를 작성한다.
    • jsp:useBean, jsp:getProperty, jsp:setProperty를 사용하여 utility class를 호출한다.
  4. Use the MVC architecture
    • MVC 아키텍처를 사용
    • Servlet(Controller)이 요청에 응답하고 적절한 데이터를 검색하여 결과를 beans(Model)에 저장한다.
    • 이 결과를 JSP 페이지(View)로 전달하여 결과를 표시한다.
    • 즉, JSP 페이지는 bean을 사용한다.
    • 구체적인 MVC 패턴은 MVC-Architecture 참고
  5. Use the JSP expression language
    • shorthand syntax를 이용하여 간단하게 객체 속성(property)에 접근하고 출력한다.
    • 즉, jsp:useBean, jsp:getProperty, jsp:setProperty를 expression language으로 간단하게 표현할 수 있다.
    • 일반적으로 beans, MVC 패턴을 함께 사용한다.
  6. Use custom tags
    • tag handler class를 만든다.
    • XML과 같은 사용자 정의 태그(custom tags)를 사용하여 태그 핸들러를 호출한다.

JSP Action 태그와 JSP EL(Expression Language)

객체 Bean에 접근하는 방법

1. JSP Action 태그

2. JSP EL(Expression Language)

예시

<%-- JSP 1.2(old) --%>
<jsp:useBean id="customer" type="beans.Customer" scope="request"> 
</jsp:useBean>

<ul>
  <li>Name: <jsp:getProperty name="customer" property="name" /></li>
  <li>Email: <jsp:getProperty name="customer" property="email" /></li>  
  <li>ID: <jsp:getProperty name="customer" property="id" /></li>
</ul>  
<%-- JSP 2.0(Preferred)  --%>
<ul>
  <li>Name: ${customer.name}</li>
  <li>Email: ${customer.email}</li>  
  <li>ID: ${customer.id}</li>
</ul> 

JSP Scriptlet 태그와 JSTL(JSP Standard Tag Library)

복잡한 것을 수행하는 임의의 Java Code를 삽입하는 방법

1. JSP Scriptlet 태그

2. JSTL(JSP Standard Tag Library) 참고2

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

<c:out value="Hello World"> </c:out>
<!-- Similar to the way <%= "Hello World" %> works -->

예시

<html>
<head>
<title>Count to 10 in JSP scriptlet</title>
</head>
<body>
   <%
      for(int i=1;i<=10;i++){
   %>
   <%=i%><br/>
   <%
      }
   %>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Count to 10 Example (using JSTL)</title>
</head>
<body>
   <c:forEach var="i" begin="1" end="10" step="1">
      <c:out value="${i}"/>
      <br/>
   </c:forEach>
</body>
</html>

관련된 Post

References