[JSP] - 서블릿
* 서블릿 (Servlet) 이란?
서블릿은 Java라는 언어로 웹 프로그램을 만들기 위한 기반 기술로서
웹프로그래밍에서 클라이언트의 ‘요청 (request)’을 처리하고
그 결과를 다시 클라이언트에게 ‘응답 (response)’ 하는 클래스
JSP 이전에 Servlet이 있었음 -> 그러나 Servlet 만으로는 웹서버 구현하기 불편함
-> 그래서 작성할 때는 HTML처럼 비교적 직관적으로 작성할 수 있는 JSP 등장
-> JSP 프로그래밍과 Servlet 프로그래밍은 동전의 양면
동일한 페이지동작을 Servlet으로도 만들수 있고, JSP로도 만들수 있다.
* 서블릿 용도 → MVC 모델
Servlet은 MVC 모델에서 ‘Controller’ 역할도 하게 됩니다.
A라는 요청(request)이 오면 Servlet( Controller )이 Model 작업을 처리하도록 보내고,
그 결과를 다시 Servlet이 받으면 Servlet은 이를 jsp에 보내고 이를 사용자에게 응답(response)함
서블릿은 *.java 파일입니다.
JAVA 파일? 웹브라우저가 보여줄수 있는 리소스가 아닙니다.
그래서 웹에서 접근 가능한 형태 (URL/URI) 로 접근하기 위해서는
서블릿과 URL을 연결해주는 URL 매핑이 필수
* 서블릿 만들기
New > Servlet > Java package, HelloServlet 입력 , Superclass(서블릿을 만들기 위해서는 반드시 HttpServlet을 상속받아야 함) > Next > Edit 클릭 > URL 매핑 ex) /HelloServlet -> 수정 가능
* URL 매핑
원래의 URL 주소대신 일종의 닉네임을 부여하는 것.
보안상의 목적, MVC 모델 구현 목적…
- 방법1 : 좌측과 같이 어노테이션 사용
- 방법2 : web.xml 에서 세팅
URL은 대소문자 구분한다
*서버 가동 중에 서블릿, Java 파일 변경하면
이클립스 개발환경에서 이미 서버가 가동 중일 때 소스 파일을 수정하면,
곧바로 서버에 반영되는 것이 아니라 약간의 시간적 딜레이 발생 후 reload 됨
소스파일 저장하기 한 뒤, Console 창에 아래와 같이 reload 관련 메세지가 뜨면 서버에 반영이 된 것
기존 브라우저에 페이지가 열려 있는 경우, 브라우저는 수동으로 새로고침
확실하게 하려면 Server 를 Stop - Start 하거나, Restart 하는 것이 좋음
* Servlet 특징
- 동적 웹어플리케이션 컴포넌트
- 확장자는 .java
- 클라이언트의 요청에 동적으로 작동한다.
- java thread를 이용해서 동작한다. (서블릿의 강점! 서버에 대한 부하 줄임)
- MVC 패턴에서 controller 이용된다.
* URL 매핑
- 기존의 경로 > http://localhost:8080/JSP02_ServletBasic/servlet/com.test.ex.HelloServlet
- URL 맵핑 경로> http://localhost:8080/JSP02_ServletBasic/He
- URL 맵핑 방법:
방법1: web.xml에서 서블릿 맵핑을 하는 방법과
방법2: 어노테이션[@WebServlet("/He")] 이용하는 방법이 있다.
* web.xml 역할
웹 어플리케이션의 deployment descriptor(배포 설명자)로, 각 어플리케이션의 환경을 설정하는 역할을 한다.
서버가 처음 로딩될 때 읽어들이고, 해당 환경설정에 대해 tomcat에 적용하여 서버를 시작한다.
[주로 담는 내용들]
dispatcherServlet 설정, db설정과 같은 서블릿 설정
listener, filter 설정, welcome File list, error page 처리
mime type 매핑, session의 유효시간 설정,servlet context의 초기 파라미터 설정 등이 있다.
* web.xml 에 url 매핑 추가하기
- web.xml이 변경되면 Server restart를 추천
* 서블릿으로 HTML 문서 response
1. content type 설정
2. PrintWriter 객체생성 <-- response 객체로부터
3. PrintWriter 객체로 HTML 스트림에 쓰기
text/html ← 이를 MIME type 이라 한다.
response 받는 브라우저에게 이 response 데이터가 ‘어떠한 종류의 데이터’인지 알려주는 역할
package com.lec.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet 요청!");
// 서블릿으로 HTML 문서 response 맛보기
// 1. content type 설정 (★주의★ PrintWriter 뽑기 전에 설정해야 합니다)
// 2. PrintWriter 객체생성 <-- response 객체로부터
// 3. PrintWriter 객체로 HTML 스트림에 쓰기
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html lang='ko'>");
out.println("<head>");
out.println("<meta charset='utf-8'>");
out.println("<title>서블릿 response</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>HTML 문서 response</h2>");
out.println("</body>");
out.println("</html>");
out.flush();
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
* 참고 : MIME type
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
* 서블릿 vs JSP 중 뭐가 편할까?
- 서블릿 → JAVA 코드 내에서 HTML을 다룰 수 있다.
JAVA 로 처리할 코드가 많다면 서블릿에
그래서 서블릿은 MVC 모델에서 ‘컨트롤러’ 역할로 많이 쓰임
- JSP → HTML 코드 내에 JAVA 코드를 넣을 수 있다.
브라우저에 보일 내용이 메인이면 JSP에서
그래서 JSP 는 MVC 모델에서 ‘뷰’ 역할로 많이 쓰임
궁극적으로 JSP 프로그래머는 원하는 결과를
서블릿으로도 만들수 있어야 하고, JSP 로도 만들수 있어야 한다.
그리고 웹서버는 HTML 만 다루는게 아니다. 다양한 형태의 문서를 다룰수도 있다.