🔯 Servlet & JSP컨테이너
🖤 웹 컴포넌트
- Servlet과 JSP와 같이 웹 서버에서 수행되는 자원들이다.
🖤 컨테이너
- 웹 컴포넌트를 저장하는 저장소 역할, 메모리 로딩, 객체 생성 및 초기화 등 Servlet 의 생명주기를 관리하고 JSP를 Servlet 으로 변환하는 기능을 수행하는 프로그램이다.
🖤 (1) Servlet 컨테이너
서블릿을 수행하려면 다음과 같은 환경을 구성해야 한다
- 자바 수행 환경
- Web Server
- Servlet 컨테이너
Servlet 컨테이너는 클라이언트의 요청에 따라 서블릿을 수행하는 자바로 구현된 프로그램이다
🖤 (2) JSP 컨테이너
JSP를 수행하려면 다음과 같은 환경을 구성해야 한다
- 자바 수행 환경
- Web Server
- Servlet 컨테이너
- JSP 컨테이너
JSP 컨테이너는 JSP를 서블릿으로 변환하는 프로그램이다. 변환된 서블릿의 수행은 Servlet 컨테이너가 담당한다
대부분 WAS에서는 서블릿 컨테이너와 JSP 컨테이너를 내장하고 있다.

🔯 Servlet (서블릿)
클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 = 서블릿이란 자바를 사용하여 웹을 만들기 위해 필요한 기술 |
🖤 Servlet 특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트 (자바기반이라 java 확장자를 갖는다)
- html을 사용하여 요청에 응답한다.
- Java Thread를 이용하여 동작한다.
- MVC 패턴에서 Controlle 역할로 이용된다.
- Http 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받아야 한다.
- UDP보다 처리 속도가 느리다.
- HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.
Interface 및 Class | 설 명 |
Servlet 인터페이스 | 서블릿 프로그램을 개발한 때 반드시 구현해야 하는 메서드를 선언하고 있는 인터페이스 init(), service(), destroy(), doGet(), getServletConfig(), getServletInfo() 메서드를 선언 |
GenericServlet 클래스 | Servlet 인터페이스를 구현하여 클라이언트 - 서버 환경에서 서버 단의 애플리케이션으로서 필요한 기능을 구현한 추상 클래스이다. service() 메서드를 제외한 모든 메서드를 정의하여 적절한 기능으로 구현하였다. |
HttpServlet 클래스 | GenericServlet 클래스를 상속하여 service() 메서드를 재정의함으로써 HTTP 프로토콜에 알맞은 동작을 수행하도록 구현한 클래스이다. |
① Servlet 매핑
web.xml
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.example.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
/** 또는 Servlet파일에 @WebServlet("/first") 선언 */
② Servlet 코드 작성
HelloServlet.java

@WebServlet("/hello") // Servlet 매핑 정보 지정
public class HelloServlet extends HttpServlet{ // HttpServlet 클래스를 상속받은 HelloServlet 클래스 작성
private static final long serialVersionUID = 1L;
public HelloServlet() {
System.out.println("======> HelloServlet 객체 생성");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("======> init() 메서드 호출");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html><html>");
out.println("<head><meta charset='UTF-8' />");
out.println("<title>JSP 예제</title>");
out.println("<link rel='icon' href='date:,'></head>");
out.println("<body><h1>Hello Servlet~!!</h1></body>");
out.println("</html>");
out.close();
}
}
@WebServlet("/맵핑명") | 서블릿 매핑 선언 |
HttpServlet 클래스 | Http 프로토콜로 제공되는 서블릿을 구현하기 위한 클래스 서블릿을 만들기위해서는 반드시 상속받아야한다 |
init() 메서드 | 서블릿이 최초로 호출되었을 때 서블릿 컨테이너가 자동 실행한다 서블릿 객체 생성 후 단 한번만 실행 |
doGet() 메서드 | 클라이언트로부터 Http 프로토콜을 통해 전달된 GET 메세지를 처리하기 위한 메소드이다 HttpServlet 클래스를 상속받고, doGet()메소드를 재정의함으로써 서블릿을 만들 수 있다 |
javax.servlet.http.HttpServletRequest | Http Request인 요청과 관련된 핵심 API |
javax.servlet.http.HttpServletResponse | HttpServletResponse인 응답과 관련된 핵심 API |
🔯 GET / POST 방식 & 요청 / 응답 처리
Http는 크게 다음과 같이 두 가지 관점에서 규칙을 정의하고 있다.
- 요청 규칙: 웹 브라우저가 웹 서버에 HTML과 같은 데이터를 요청할 떄 사용할 데이터 구성 규칙
- 응답 규칙: 웹 서버가 웹 브라우저가에 HTML과 같은 데이터를 전송할 때 사용할 데이터 구성 규칙
GET 방식 | URL에 전달하고자 하는 정보를 포함해서 정보를 전달하는 방식이다. ? 이후의 값들은 서버에서 Query_String을 통해 전달된다 "속성=값" 형태로 사용해야 하며 "&"는 여러 속성 값을 전달할 때 연결해 주는 문자열이다 |
POST 방식 | 전달하고자 하는 정보를 첨부파일 형태로 포함해서 전달하는 방식이다. 즉 데이터 영역을 이용해서 데이터를 전송하는 방식이다. |
⭐ HttpServletRequest 클래스의 주요 메소드 ( 요청처리를 위한 코드 )
메서드 | 기능 |
getParameter(name) | 문자열 name과 같은 이름을 가진 파라미터의 값을 가져온다 |
getParameterValues(name) | 문자열 name과 같은 이름을 가진 파라미터의 값을 배열 형태로 가져옴. checkbox, multiple list 등에 주로 사용된다. |
getMethod() | 현재 요청이 GET, POST 인지 가져온다 |
getRemoteAddr() | 클라이언트의 IP 주소를 가져온다 |
setCharacterEncoding | 현재 JSP로 전달되는 내용을 지정하는 캐릭터셋을 변환한다 html form에서 한글 입력시 정상적으로 처리하려면 반드시 필요하다 |
⭐ HttpServletResponse 주요 메소드 ( 응답처리를 위한 코드 )
메서드 | 기능 |
setContentType (type) | HTTP 헤더 부분의 Content-Type을 정의한다 |
setHeader (name, value) | name 헤더의 값을 value로 지정한다. |
sendError (status, msg) | 오류코드를 설정하고 메세지를 보낸다 |
sendRedirect (url) | 클라이언트 요청을 다른 페이지로 보낸다 |
🖤 요청처리를 위한 코드 작성
- HttpServletRequest 클래스는 클라이언트 요청을 처리하는 기능을 제공하는 클래스이다.
- 서블릿으로 전달된 파라미터 정보를 얻기 위해서는 HttpServletRequest 객체의 getParameter() 메소드를 이용한다.
String userName = request.getParameter("name"); |
🖤 응답처리를 위한 코드 작성
- 클라이언트에서 서블릿으로 요청을 하면 서블릿은 처리한 결과를 html 형식으로 응답 처리한다.
- HttpServletResponse의 setContentType (type) 메소드를 이용해 응답페이지의 MIME타입과 인코딩 스타일을 다음과 같이 지정한다.
response.setContentType("text/html; charset=UTF-8"); |
- 서블릿 및 JSP를 이용한 응답처리는 기본적으로 자바 I/O 기술을 이용한다.
- Java 출력을 위한 OutputStream 또는 Writer 클래스를 사용한다.
- 클라이언트에게 응답 관련 작업을 수행하는데, 데이터를 출력하기 위한 출력스트림을 추출하는 메서드이다.
PrintWriter out = response.getWriter(); |
🔯 Servlet 포워드
1. 포워드 기능
: 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
2. 포워드 기능이 사용되는 용도
- 요청(request)에 대한 추가 작업을 다른 서블릿에게 수행하게함
- 요청(request)에 포함된 정보를 다른 서블릿이나 JSP와 공유함
- 요청(request)에 정보를 포함시켜 다른 서블릿에 전달할 수 있음
- 모델2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용됨
3. Servlet의 포워드 방법
1. 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청을 하는 방법이다. | |
redirect 방법 | HttpServletResponse 객체의 sendRedirect () 메서드를 이용 웹브라우저에 재요청하는 방식 |
형식: response.sendRedirect("포워드할 서블릿 또는 JSP"); | |
Refresh 방법 | HttpServletResponse 객체의 addHeader() 메서드를 이용 웹 브라우저에 재요청하는 방식 |
형식: response.addHeader("Refresh", 경과시간(초); url=요청할 Servlet 또는 JSP); |
|
location 방법 | Javascript location 객체의 href 속성을 이용 Javascript에서 재요청하는 방식 |
형식: location.href = '요청할 서블릿 또는 JSP'; |
2. 서블릿에서 클라이언트를 거치지 않고 바로 다른 서블릿에게 요청하는 방법 | |
requestDispather 방법 | requestDispather 클래스의 forward() 메서드를 이용 일반적으로 포워딩 기능을 지칭 서블릿이 직접 요청하는 방법 |
형식: requestDispather dis = request.getRequestDispather("포워드할 서블릿 또는 JSP") |
🔯 바인딩
바인딩의 사전적 의미
두개를 하나로 묶는다.
바인딩이란?
- 서블릿에서 다른 서블릿 또는 JSP로 대량의 데이터를 공유하거나 전달하고 싶을 때 사용하는 기능이다.
(GET방식은 전달할 데이터양이 적을때 편리) - 웹 프로그램 실행 시 데이터를 서블릿 관련 객체에 저장하는 방법이다.
- 주로 HttpServletRequest, HttpSession, ServletContext객체에서 사용되며 저장된 데이터는 프로그램 실행 시 서블릿이나 JSP에 공유하여 사용한다.
⭐ 서블릿 객체에서 사용되는 바인딩 관련 메서드
메서드 | 기능 |
setAttribute(String name, Object value) | 데이터를 각 객체에 바인딩한다. |
getAttribute(String name) | 각 객체에 바인딩된 데이터를 name으로 가져온다. |
removeAttribute(String name) | 각 객체에 바인딩된 데이터를 name으로 제거한다. |
🔯 ServletContext 클래스
- 톰캣 컨테이너 실행시 각 Context마다 한개의 ServletContext 객체를 생성함 (톰캣 컨테이너가 종료하면 ServletContext 객체 소멸)
- ServletContext 객체는 웹 어플리케이션 전체의 공통 자원이나 정보를 미리 바인딩해서 서블릿들이 공유하여 사용한다.
🖤 특징
- javax.servlet.ServletContext로 정의되어 있음
- 서블릿과 컨테이너 간의 연동을 위해 사용
- Context(웹 어플리케이션)마다 하나의 ServletContext가 생성됨
- 서블릿끼리 데이터를 공유하는데 사용됨
- 컨테이너 실행 시 생성되고 컨테이너 종료 시 소멸됨
🖤 기능
- 서블릿에서 파일 접근 기능
- 데이터 바인딩 기능
- 로그 파일 기능
- Context에서 제공하는 설정 정보 제공 기능
🖤 톰캣 컨테이너의 ServletContext와 ServletConfig 생성 상태
- ServletContext는 컨텍스트당 생성되는 반면 ServletConfig는 각 서블릿에 대해 생성된다

⭐ ServletContext에서 제공하는 메서드
메서드 | 기능 |
getAttribute(String name) | - 주어진 name을 이용해 바인딩된 value를 가져옴 - name이 존재하지 않으면 null 반환 |
getAttributeNames() | - 바인딩된 속성들의 name 반환 |
getContext(String uripath) | - 지정한 uripath에 해당하는 객체를 반환 |
getInitParameter(String name) | - name에 해당되는 매개변수의 초기값 반환 - name에 해당되는 매개변수가 없으면 null 반환 |
getInitParameterNames() | - Context의 초기화 관련 매개변수들의 이름들을 Enumeration 타입으로 반환 - 매개변수가 없으면 null 반환 |
getMajorVersion() | - 서블릿 컨테이너가 지원하는 주요 서블릿 API 버전 반환 |
getRealPath(String path) | - 지정한 path에 해당되는 실제 경로 반환 |
getResource(String path) | - 지정한 path에 해당되는 Resource 반환 |
getServerInfo() | - 현재 서블릿이 실행되고 있는 서블릿 컨테이너의 이름과 버전 반환 |
getServletContextName() | - 해당 어플리케이션의 배치 관리자가 지정한 ServletContext에 대한 웹 어플리케이션 이름 반환 |
log(String msg) | - 로그 파일에 로그를 기록 |
removeAttribute(String name) | - 해당 name으로 ServletContext에 바인딩된 객체를 제거함 |
setAttribute(String name, Object object) | - 해당 name으로 객체를 바인딩 |
setInitParameter(String name, String value) | - 주어진 name으로 value를 Context 초기화 매개변수로 설정 |
ServletContext와 ServletConfig 사용법
ServletConfig 기능
- ServletContext 객체를 얻는 기능
- 서블릿에 대한 초기화 작업 기능
@WebServlet("/맵핑명") 을 이용한 서블릿 설정
요소 | 설명 |
urlPatterns | 웹 브라우저에서 서블릿 요청시 사용하는 매핑 이름 |
name | 서블릿 이름 |
loadOnStrartup | 컨테이너 실행시 서블릿이 로드되는 순서 지정 |
initParams | @WebInitParam 애너테이션을 이용해 매개변수를 추가하는 기능 |
description | 서블릿에 대한 설명 |
'Language > JSP (Java Server Pages)' 카테고리의 다른 글
JSP 내장 객체 (0) | 2022.07.25 |
---|---|
JSP 기본 문법 (0) | 2022.07.10 |
쿠키와 세션(cookie and session) (0) | 2022.07.06 |
Web Programming (인터넷 프로그래밍) (0) | 2022.06.23 |
JSTL 표준 커스텀 태그 (0) | 2022.06.15 |