단순한 클래스가 서블릿 클래스가 되기 위해서는
1. init()
2. service()
3. destroy()
순서의 생명주기를 가져야한다. 해당 생명주기를 추상메소드로 갖는 인터페이스가 Servlet 인터페이스이다.
(아래 포스팅에서 자세히 다루었습니다.)
생명주기를 담은 Servlet 인터페이스 그리고 초기화를 담은 ServletConfig 인터페이스를 구현해야 Servlet 클래스가 될 수 있다. 그래서 구현을 위해 두 인터페이스를 implements 한 클래스가 있는데, 그것이 GenericServlet 클래스이다.
어떤 클래스를 서블릿 클래스로 만들려면 GenericServlet을 상속받아야 한다.
package jspday5;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
@WebServlet(
// 서블릿 매핑
urlPatterns = {
"/GenericServletStudy",
"/GSS"
},
// 서블릿 초기 파라미터
initParams = {
@WebInitParam(name = "url", value = "lordofkangs@naver.com")
})
//GenericServlet을 상속받아 오버라이딩하여 원하는 서블릿을 구현한다.
public class GenericServletStudy extends GenericServlet{
String url = null;
//서블릿 호출시 초기화 진행
public void init(ServletConfig config) {
url = config.getInitParameter("url");
}
// 서블릿 실행
public void service(ServletRequest request, ServletResponse response) throws IOException {
//브라우저 인코딩 세팅
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
//브라우저에 출력할 스트림 생성
PrintWriter out = response.getWriter();
//스크립트문 저장
out.println("<script>");
out.println("alert('나의 네이버 블로그 : " + url + "');");
out.println("</script>");
}
}
<출력 결과>
이와같이, 웹페이지에서 동작하는 서블릿을 만들었다. Servlet 인터페이스와 ServletConfig 인터페이스를 implements한 구현 클래스 GenericServlet 클래스는 클래스를 Servlet 클래스의 성격을 부여해주는 중요한 클래스이다.
하지만 GenericServlet 클래스는 잘 사용되지 않는다. GenericServlet 클래스의 자식 클래스인 HttpServlet 클래스가 일반적으로 사용된다. 그 이유는 HTTP 통신에 있어 더 특화되어 있기 때문이다.
HttpServlet
HttpServlet 클래스는 HttpServletRequest 클래스와 HttpServletResponse 클래스의 객체를 파라미터로 받는다. 그러므로 HTTP 통신과 관련된 많은 데이터를 처리할 수 있다.
GenericServlet은 service 메소드가 단순히 실행되지만 HttpServlet 메소드는 HTTP 요청에 따라 service 메소드의 실행이 8가지로 분기된다. 그 중 기본적으로 4가지가 자주 사용된다. 1. POST 2.GET 3.PUT 4.DELETE. 개발자는 4가지 요청에 따라 영역을 구분하여 개발할 수 있다.
1. doPost()
2. doGet()
3. doPut()
4. doDelete()
이 중 가장 기본인 doGet()과 doPost()를 살펴보자.
GET 방식
<JSP 파일>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import= "java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Start JSP!</title>
</head>
<body>
<form method = "get" action = "/HSS">
<div>
<h3> 반복 횟수를 입력해주세요! </h3>
</div>
<div>
<input type = "text" name = "cnt">
<button type = "submit"> 제출 </button>
</div>
</form>
</body>
</html>
<서블릿 클래스>
package jspday5;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 서블릿 매핑
@WebServlet(
urlPatterns = {
"/HttpServletStudy",
"/HSS"
}
)
public class HttpServletStudy extends HttpServlet{
//Get 요청 처리
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8"); //출력 인코딩 설정
response.setContentType("text/html; charset = UTF-8"); //MIME 설정
PrintWriter out = response.getWriter();
//request 객체로 전달된 데이터 변수에 저장
int cnt = Integer.parseInt(request.getParameter("cnt"));
//브라우저에 출력
for(int i =0; i<cnt; i++) {
out.println( (i+1) + "번 실행 <br/>");
}
}
}
<출력 결과>
GET 방식은 데이터를 URL 파라미터에 붙여서 전송한다. 간단한 데이터 전송 방식이어서 전송 속도는 빠르지만 많은 데이터를 전송하지 못하고 보안에도 취약하다. 그래서 많은 데이터를 보내고 보안이 필요한 경우, POST 방식으로 데이터 전송을 한다.
POST 방식
<JSP 파일>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import= "java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Start JSP!</title>
</head>
<body>
<form method = "POST" action = "/HSS">
<div>
<h3> 아이디와 비밀번호를 입력해주세요! </h3>
</div>
<div>
아이디 : <input type = "text" name = "id" ><br>
비밀번호 : <input type = "password" name = "password"><br>
<button type = "submit"> 제출 </button>
</div>
</form>
</body>
</html>
<서블릿 클래스>
package jspday5;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
urlPatterns = {
"/HttpServletStudy",
"/HSS"
}
)
public class HttpServletStudy extends HttpServlet{
//Get 방식
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
PrintWriter out = response.getWriter();
int cnt = Integer.parseInt(request.getParameter("cnt"));
for(int i =0; i<cnt; i++) {
out.println( (i+1) + "번 실행 <br/>");
}
}
//Post 방식
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset = UTF-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
String pw = request.getParameter("password");
out.println("제 아이디는 "+id +"<br>");
out.println("제 비밀번호는 " + pw);
}
<출력 결과>
Get 방식과는 달리, url에 파라미터를 붙여 전송되지 않음을 알 수 있다. post 방식은 로그인이나 회원가입 같이 전달 데이터가 많고 보안이 필요한 부분에서 사용된다.
이처럼 HttpServlet을 사용하면 HTTP 통신에 특화된 개발이 가능해진다. 요청에 따라 영역을 나누어 개발하니 가독성도 올라간다. 하지만 만약 GET과 POST 방식 둘다 똑같은 코드를 처리한다면 구분하지 말고 service 메소드를 이용하여 코드를 짜는 것이 좋다.
HttpServlet 클래스는 파라미터로 HttpServletRequest와 HttpServletResponse를 갖는다. 요청과 반응을 전달하는 객체가 HTTP에 특화되어 있어, 쿠키나 세션같은 HTTP와 관련된 많은 데이터를 처리할 수 있다.
정리
1. 서블릿 클래스가 되려면 Servlet 인터페이스와 ServletConfig 인터페이스를 구현한 GenericServlet 클래스를 상속해야한다.
2. 일반적으로 HTTP 통신에 특화된 HttpServlet이 GenericServlet보다 자주 사용된다.
3. HttpServlet은 service 메소드를 요청에 따라 분기하여 사용한다.
4. 보안과 많은 데이터를 보내려면 POST 방식으로 전송한다.
'Web언어 > JSP' 카테고리의 다른 글
[ JSP ] 인코딩(Encoding) 설정 (0) | 2021.06.21 |
---|---|
[ JSP ] 인코딩(Encoding)을 하는 이유 (3) | 2021.06.21 |
[ JSP ] Servlet 과 ServletConfig (0) | 2021.06.20 |
[ JSP ] 서블릿(Servlet) 등록 (web.xml 과 어노테이션) (1) | 2021.06.20 |
[ JSP ] JSP의 역할 (0) | 2021.06.20 |