서블릿은 요청에 대한 간단한 응답에도 코드량이 많아진다는 단점이 있다. 또한 점차 브라우저 화면에 대한 중요도가 높아져 서블릿에 화면 로직과 비즈니스 로직이 함께 있는 게 유지관리를 어렵게 했다.
결국 비즈니스 로직과 화면 기능을 분리해, 보다 수월한 재사용성과 유지 보수를 위해 JSP가 대두됐다.
자바 코드를 기반으로 HTML5로 화면을 구현하던 서블릿과 달리, JSP는 HTML5를 기반으로 JSP 요소를 사용한다.
JSP 파일을 만들면 기본적으로 아래와 같은 형태의 코드가 작성된다.
<%@
page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%> // JSP 태그
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body></body>
</html>
기본적인 실행 과정은 다음과 같다.
Context
**외부에서는 context root를 찾을 수 있지만 WEB-INF에 작성을 한다면 파일을 외부에서 찾을 수 없기 때문에, 라이브러리 폴더와 web.xml 파일이 위치한다.
JSP가 서블릿으로 변환될 때 컨테이너가 자동으로 _jspService()
메서드에 지역 변수로 생성시키는 서블릿 멤버 변수가 JSP 내장 객체이다.
내장 객체 | 타입 | 특징 | 스코프 |
---|---|---|---|
request | javax.servlet.http.HttpServletRequest | 클라이언트 요청 정보 | http요청을 WAS 응답까지 유지 |
response | javax.servlet.http.HttpServletResponse | 서버의 응답 정보 | |
session | javax.servlet.http.HttpSession | 세션 정보 | 동일 브라우저 |
out | javax.servlet.jsp.JspWriter | JSP 페이지에서 결과 출력 | |
application | javax.servlet.ServletContext | 컨텍스트 정보 | 동일 어플리케이션 |
pageContext | javax.servlet.jsp.PageContext | JSP 페이지 정보 | 해당 JSP 페이지 |
config | javax.servlet.ServletConfig | JSP 페이지 설정 정보 | |
page | java.lang.Object | JSP 페이지의 서블릿 인스턴스 | 현재 페이지 JSP 태그 전달값 |
exception | java.lang.Exception | 예외 처리 |
JSP는 HTML과 달리 컨테이너에서 자바로 변환 과정을 거치기 때문에 JSP에서 제공하는 스크립트 요소를 이용해 동적으로 화면을 구성할 수 있다.
JSP 스크립트는 <% %>
로 표현할 수 있다.
scriptlet
- <% 자바 코드 %>
로 작성된다.
declaration tag
- <%! 자바 코드 %>
로 작성되며 변수나 메서드 선언 시 사용된다.
expression tag
- <%= 자바 코드 %>
로 작성되며 변수 값을 출력할 때 사용된다.
JSP 첫 줄에 쓰이는 디렉티브 태그 속성 중 isErrorPage
속성을 true로 바꾸고 메인 JSP 파일에서 errorPage 값에 예외처리 페이지 링크를 달아 예외를 처리할 수 있다.
<!-- add.jsp -->
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
errorPage="exceptionHandler.jsp"
%>
<%
int num = Integer.parseInt(request.getParameter("num");
int sum = 0;
for (int i = 0; i <= num; i++) { sum = sum + 1; }
%>
<!DOCTYPE html>
<html>
<head><title>SUM</title></head>
<body><h1>1부터 <%= num %>까지의 합은 <%= sum %> 입니다.</h1></body>
</html>
<!--------------------------------------------------------------------->
<!-- exceptionHandler.jsp -->
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isErrorPage="true"
%>
<!DOCTYPE html>
<html>
<head><title>Exception page</title></head>
<body><h1><%= exception %></h1></body>
<!-- exception 내장 객체를 활용해 예외 처리 페이지를 만들 수 있다. -->
</html>
"DWP 이름"/src/main/webapp/WEB-INF/web.xml
에서 내 프로젝트의 인덱스 파일을 설정할 수 있다. 이는 NodeJS package.json의 main 프로퍼티를 설정한 것과 비슷하다.
해당 파일 안에 <welcome-file-list>
태그 안 <welcome-file>
태그에 경로를 설정하면, 해당 경로가 내 디렉토리 메인 페이지가 된다.
그리고, DB에 접근하는 로직을 갖는 JSP 파일 디렉티브 태그의 import 속성 값에 DAO, DTO 등의 영구적 계층 경로를 입력하면 DB를 활용한 서비스를 제공할 수 있다.
유데미 바로가기 / STARTERS 취업 부트캠프 공식 블로그 보러가기
[길벗]자바 웹을 다루는 기술 - 이병승