🔯 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