JSP | Servlet
Servlet
서버 내부에서 실행되는 웹 프로그램
웹 브라우저로 실행 결과를 전송함↔ JavaScript: 클라이언트에서 실행
- JSP 페이지를 요청하면 .jsp 파일이 .java 파일로 변환되는데
변환된 자바 파일을 서블릿이라고 함 - .java 파일에 문제가 없다면 class 파일로 변환되어 메모리에 올라가게 됨
서블릿 객체가 생성되며 요청에 따른 응답을 실행 - 자바 코드가 많이 사용되기 때문에 접근이 어려워서 JSP가 개발됨
- 요청에 바로 응답하기 때문에 jsp보다 속도가 빠름
- 모델 2에 사용되며 JSP와 적절하게 혼합해서 사용된다고 함
Servlet 작성_in Eclipse
- New → Servlet
Class 파일로도 작성은 가능하지만
Servlet으로 사용하기 위한 환경설정을 일일이 다 해주어야 함 - Class name 작성
- URL mappings: 서블릿 요청 경로 지정, 실행할 서블릿 클래스명과 동일함
변경 시에는 xml파일 설정이 필요함[모델 2(스프링) 환경설정 시 사용]
ex) /HelloTest - 필요에 따라 생성자 및 메소드 선택
- 서블릿은 자바 파일이기 때문에 프로젝트의 src 폴더에 저장해야 함
이클립스에서 볼 때는 Java Resources 폴더 내부에 src폴더가 있음
Servlet 조건
- 서블릿, http 관련 클래스를 import 해야함
- 반드시 public class로 작성해야 함
홈페이지에 누구나 접속이 가능하게 만들기 위함 - HttpServlet 클래스를 상속받아야 함
doGet(), doPost() 등의 메소드를 사용하기 위함
doGet(): 사용자가 GET으로 요청을 보냈을 때 자동으로 호출되는 메소드(콜백 계열)
doPost(): POST로 요청 했을 때 자동으로 호출되는 메소드
Servlet Method
Servlet: 모든 서블릿이 구현해야 하는 메소드를 정의한 인터페이스
HttpServlet 클래스만 상속하는 경우에는 반드시 할 필요 없음
| 메소드 | 설명 |
|---|---|
| void init(ServletConfig config) | 서블릿 컨테이너가 서비스를 시작한 서블릿을 가리킬 때 호출되는 메소드 프로그램 실행시 최초 한 번만 실행되기 때문에 서블릿을 초기화하는 생성자 역할을 함 |
| void destroy() | 서블릿 컨테이너가 서비스를 종료하는 서블릿을 가리킬 때 호출되는 메소드 서버를 끄지 않은 상태에서 서블릿의 내용을 변경하고 저장하면 변경 사항을 반영하기 위해 서블릿을 재시작하려고 종료할 때 실행됨 |
| void service(ServletRequeset req, ServletResponse res) | 서블릿 컨테이너가 서블릿이 요청에 응답하도록 허가할 때 호출되는 메소드 |
HttpServlet Method
HttpServlet: 웹 사이트에 적합한 HTTP 서블릿을 생성하기 위해
상속되어야 하는 추상 클래스
최소 하나 이상의 메소드를 오버라이딩 해야함
| 메소드 | 설명 |
|---|---|
| protected void doGet(HttpServletRequest req, HttpServletResponse res) | service 메소드에 의해 서버가 서블릿에게 GET 요청을 처리하도록 할 때 호출되는 메소드 |
| protected void doPost(HttpServletRequest req, HttpServletResponse res) | 위 메소드와 처리 과정은 동일하며 POST 요청을 처리할 때 호출되는 메소드 |
| void service(HttpServletRequest req, HttpServletResponse res) | 사용자 요청을 protected service()에 급파 |
| protected void service(HttpServletRequest req, HttpServletResponse res) | public service()로부터 표준 HTTP 요청을 받아서 doXXX 메소드로 요청을 급파함 |
※ GET방식으로 데이터를 전달하는 경우
URI에서 /요청페이지/?매개변수1=값1&매개변수2=값2&... 형식으로 데이터가 전달됨
?이하의 데이터를 QueryString이라고 함
데이터 양이 적으며 보안에 상관없는 내용을 전달하는 경우 적합
※ POST로 데이터를 전달하는 경우
URL에 전달 데이터가 출력되지 않으며
데이터 양이 많거나 보안이 중요한 내용을 전달하는 경우 적합
Servlet 기본 구조
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@WebServlet("/HelloTest")
// 서블릿은 HttpServlet을 반드시 상속해야 하고
// 모든 사용자가 접근할 수 있도록 public으로 설정해야 함
public class HelloTest extends HttpServlet {
// init() 서블릿이 메모리에 올라갈 때 단 한 번만 호출되는 메소드
public void init(ServletConfig config) throws ServletException {
// 서블릿 초기화 등 생성자 역할
}
// destroy() 서블릿이 메모리에서 해제될 때 호출되는 메소드
public void destroy() {
}
// GET 방식 요청에 대한 응답을 실행하는 메소드
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
// POST 방식 요청에 대한 응답을 실행하는 메소드
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
- javax.servlet.ServletConfig: 서블릿 환경설정 관련 클래스
- javax.servlet.ServletException: 서블릿 예외 처리 클래스
- javax.servlet.annotation.WebServlet: 어노테이션 관련 클래스
- javax.servlet.http.HttpServlet: 상속받을 상위 클래스
HttpServlet 클래스를 상속받기 위해서 import 해주어야 함 - javax.servlet.http.HttpServletRequest: ServletRequest 인터페이스를 상속하며,
HTTP 서블릿에 대한 요청 정보를 제공하는 인터페이스 - javax.servlet.http.HttpServletResponse: ServletResponse 인터페이스를 상속하며,
응답을 보낼 때 HTTP의 특정 기능을 제공하는 인터페이스 - java.io.IOException: 입출력 예외 처리 클래스,
데이터 전송 시 입출력을 사용하게 되면 반드시 예외 처리를 해야 함
※ 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 만들고
그것을 서블릿의 서비스 메소드들(doGet, doPost, etc)에 인자로 전달함
@WebServlet() 어노테이션
@WebServlet()의 괄호 내부에 실제 경로가 아닌
"가상 경로"를 상대 경로로 지정해서 보안을 향상시킬 수 있음
- 실제 경로: /HelloTest
- 가상 경로: /test/imsi/HelloTest
- 프로그램 실행시 가상 경로를 포함한 URL이 출력됨
예제
WebContent/sub/send.html 에서 이름과 주소 데이터를 받아서
src/GetDate.java 서블릿에서 처리하는 예제WebContent/sub/getdate.jsp 와 비교
WebContent/sub/send.html
사용자의 요청을 받는 html 페이지
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>이름, 주소 전달</title>
</head>
<body>
<!-- <form method="post" action="getdate.jsp"> -->
<!-- 서블릿에 데이터 전송시 action="/프로젝트명/실행 서블릿 클래스명" -->
<form method="get" action="/ServletTest/GetDate">
이름: <input type="text" name="name" /><br/>
주소: <input type="text" name="addr" /><br/>
<input type="submit" value="보내기"/>
</form>
</body>
</html>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
src/GetDate.java
사용자의 요청을 처리해서 응답하는 서블릿 파일
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/GetDate")
public class GetDate extends HttpServlet {
// GET 방식으로 요청해도 service() 메소드가 호출됨
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// service() 호출 확인용
System.out.println("service 호출");
// 응답 문서의 타입과 인코딩 지정
response.setContentType("text/html;charset=utf-8");
// 데이터 전송을 위한 I/O 클래스, response의 getWriter() 메소드로 객체 반환
PrintWriter out = response.getWriter();
out.println("<html><head></head>");
out.println("<body>");
// 요청 데이터를 utf-8 인코딩으로 얻어 와서 변수에 저장
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String addr = request.getParameter("addr");
// 출력
out.println("이름: " + name + ", 주소: " + addr);
out.println("</body>");
out.println("</html>");
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
WebContent/sub/getdate.jsp
사용자의 요청을 처리해서 응답하는 JSP 파일
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>응답 페이지</title>
<%
// 한글 인코딩 설정
request.setCharacterEncoding("utf-8");
%>
<%
String name = request.getParameter("name");
String addr = request.getParameter("addr");
// 출력
out.println("이름: " + name + ", 주소: " + addr);
%>
</head>
<body>
</body>
</html>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
서블릿의 개요에 대해서는 이전에 한 번 살펴보았고
이번에는 서블릿을 직접 작성하는 방법에 대해 알아보았습니다.
서블릿은 .jsp 파일이 컴파일된 형태임과 동시에
JSP와 동일하게 사용자 요청을 처리해서 응답하는 역할도 수행할 수 있습니다.
서블릿과 jsp파일의 코드를 비교해 보면 jsp로 작성하는 것이 더 간단해 보이지만
자바에 숙달된 분들이라면 서블릿으로 작성하는 것이 더 편할 수도 있다고 합니다.
기능에 차이는 없기 때문에 자신에게 더 편리한 형식으로 작성하시면 될 것 같습니다.