
1. 개요
JSP 특징
- 웹 페이지를 동적으로 처리할 수 있는 기술 중의 하나
- 서블릿 프로그램의 기능을 HTML 파일 내에 스크립트 형식으로 구현할 수 있음
이점
프레젠테이션 로직과 비즈니스 로직의 분리
-
프레젠테이션 로직 : 브러우저 화면의 표현을 꾸미는 절차 및 기능
-
비즈니스 로직 : 사용자 요청에 대한 내부적인 처리 절차
-
분리의 중요성 : 웹 페이지 디자인이 변경돼도 내부 비즈니스 로직의 변경이 필요 없음!
(반대도 마찬가지)
컴포넌트 재사용
- JSP페이지나 자바빈즈에서 공통적으로 사용되는 컴포넌트를 만들어 재사용
- 예 : 주소 검색, 한글 처리, DB 연결
기타
- JSTL, EL, 커스텀 태그 활용 가능
- 서버 자원의 효율적 관리
JSP의 처리과정
최초 요청 시
-
JSP 파일은 Servlet으로 변환 ⇒ 클래스 파일로 컴파일
-
해당 클래스 파일이 Tomcat 내에서 실행되어 그 결과가 웹 브라우저로 전달
Tomcat이 JSP/Servlet 컨테이너임
재요청 시
-
메모리에 적재된 클래스가 응답을 줌
⇒ 서블릿 변환, 컴파일 작업 생략됨
2. 스크립팅 요소
Scriptlet (스크립틀릿)
-
JSP 페이지 내에서 java 코드 구현을 위해 사용
-
서블릿으로 변환될 때 변환된 서블릿의 service메소드 안에 구현
-
태그내에서 선언된 변수는 로컬변수!
Declaration (선언)// <% 자바 코드 %> <% for(int i=0; i<=10; i++) { out.println("HelloWorld+<br>"); } %>
-
멤버 변수, 메소드 선언
-
서블릿 변환시 서블릿의 멤버변수나 메소드로 선언됨
Expression (표현식)// <%! 속성 선언 및 method 작성 %> <%! String name="Kim"; public boolean isExist() { return true; } %>
-
간단한 데이터 출력이나 메소드 호출을 통한 데이터 출력을 위해 활용
⇒ 즉, 브라우저에 출력할 때
-
코드 마지막에 세미콜론(;)없는 것 주의!!!
// <%= 출력 값, 변수, 함수 결과 %> <%= 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>
댓글