본문으로 바로가기

사용자 정의 서블릿 만들기


이 서블릿은 HttpServlet을 상속받고 3개의 생명주기 메서드를 차례대로 구현한다.

각 메서드는 호출 시 메시지만 출력한다.

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
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("/first") // 애너테이션을 이용한 서블릿 매핑
public class FirstServlet extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("FirstServlet init 메소드 호출");
	}

	public void destroy() {
		System.out.println("FirstServlet destroy 메서드 호출");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    		throws ServletException, IOException {
		System.out.println("FirstServlet doGet 메소드 호출");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    		throws ServletException, IOException {
		System.out.println("FirstServlet destroy 메소드 호출");
	}

}

   

브라우저에서 서블릿 요청하기

웹 브라우저에서 서블릿은 요청하려면 다음과 같이 웹 브라우저 주소창에 프로젝트 이름과 매핑이름을 입력한 후 요청한다.

  • http://IP주소:포트번호/프로젝트이름(컨텍스트이름)/서블릿매핑이름
  • ex) http://127.0.0.1:8090/firstServlet/first

이클립스에서 톰캣을 먼저 실행하고 브라우저에서 요청하면 다음과 같이 콘솔에 출력된다.

맨 처음 브라우저에서 /first로 요청하면 최초의 요청이기때문에 FirstServlet 클래스의 init()를 호출해 초기화한 후 메모리에 로드되어 doGet() 메서드를 호출하여 서비스한다. 이때 다시 한 번 브라우저에서 /first로 요청하게 되면 미리 메모리에 로드된 FirstServlet 서블릿이 재사용되므로 init()은 호출되지 않고 doGet()메서드만 호출한다.

이처럼 동일한 작업의 경우 서블릿은 메모리에 존재하는 서블릿을 재사용함으로써 훨씬 빠르고 효율적으로 동작한다.

  

  

서블릿 요청 수행


 요청이나 응답과 관련된 API는 모두 javax.servlet.http 패키지에 있다.

  • 요청과 관련된 API: javax.servlet.http.Request 클래스
  • 응답과 관련된 API: javax.servlet.http.Response 클래스

  FirstServlet 클래스는 요청이나 응답과 관련된 API가 서블릿의 doGet()이나 doPost() 메서드의 매개변수로 사용되는 예이다.

  1. 클라이언트가 서블릿에 요청을 하면 먼저 톰캣 컨테이너가 받는다.
  2. 사용자의 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 만들고 서블릿의 doGet()이나 doPost() 메서드를 호출하면서 이 객체들을 인자로 전달한다.
  3. 톰캣이 사용자의 요청에 대한 정보를 모든 HttpServletRequest 객체의 속성으로 담아 메서드로 전달하므로 각 HttpServletRequest에서 제공하는 메서드들은 매개변수로 넘어온 객체들을 이용하여 사용자가 전송한 데이터를 받아오거나 응답할 수 있다.

  

<form> 태그 이용하여 서블릿에 요청하기

서블릿과 JSP는 HTML, CSS, JavaScript에 자신의 기능을 추가하여, 즉 서로 연동하여 동작한다. 특히 사용자의 요청은 HTML <form> 태그나 JavaScript로부터 전송받아서 처리한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frmLogin" method="get" action="login" encType="UTF-8">
		아이디 : <input type="text" name="user_id"><br> 
		비밀번호: <input type="password" name="user_pw"><br> 
		<input type="submit" value="로그인"> <input type="reset" value="다시입력">
	</form>
</body>
</html>

사용자가 자신의 아이디나 비밀번호를 입력한 후 로그인을 클릭하면 <form> 태그의 action 속성은 데이터를 전송할 서블릿이나 JSP의 이름을 지정한다. 지정된 이름이 login인 서블릿으로 아이디와 비밀번호가 전송되는 것이다.

  

  

서블릿에서 클라이언트의 요청 얻기

HttpServletRequest 클래스에서 태그로 전송된 데이터를 받아오는데 사용하는 메서드가 있는데, 그 중에서 가장 많이 사용되는 것이 getParameter() 메서드다.

여러 개의 값을 전송할 때는 getParameterValues()를 이용하여 배열 형태로 받고, 전송된 데이터가 많아 일일이 name을 기억하기 힘들 때는 getParameterNames() 메서드를 이용한다.

package sec01.ex01;

import java.io.IOException;
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("/login")
public class LoginServlet extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init 메서드 호출");
	}
	
	//웹 브라우저에서 전송한 정보를 톰캣 컨테이너가 HttpServletRequest 객체를 생성한 후 doGet()으로 넘겨준다.
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		// getParameter를 이용하여 <input> 태그의 name 속성 값으로 전송된 value를 받아 온다
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디:" + user_id);
		System.out.println("비밀번호:" + user_pw);
	}

	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}
}

  

프로젝트를 톰캣에 등록하여 실행한 후 브라우저에서 http://127.0.0.1:8090/LoginLogout/login.html을 요청한다. 그리고 텍스트 박스에 아이디와 비밀번호를 입력한 후 로그인을 클릭하면 이클립스에 아이디와 비밀번호가 출력된다.

  

  

서블릿 응답 처리 방법


  1. doGet()이나 doPost() 메서드 안에서 매개변수 HttpServletResponse 객체를 이용하여 처리한다.
  2. javax.servlet.http.httpServletResponse 객체를 이용한다.
  3. setContentType()을 이용해 클라이언트에게 전송할 데이터 종료(MIME-TYPE)를 지정한다.
  4. 클라이언트(웹 브라우저)와 서블릿의 통신은 자바 I/O의 스트림을 이용한다.

    

MIME-TYPE(마임 타입)

웹 애플리케이션은 클라이언트에 해당하는 웹 브라우저와 서버에 해당하는 서블릿이 서로 데이터를 주고받으며 실행한다. 웹 브라우저와 서블릿은 네트워크를 통해 데이터를 보내고 네트워크로부터 데이터를 입력 받는다. 네트워크에 대해 자바 I/O 스트림 클래스의 입출력 기능을 이용하면 쉽게 웹 애플리케이션의 네트워크 기능을 구현할 수 있다.

  

서버(서블릿)에서 웹 브라우저로 데이터를 전송할 때는 어떤 종류의 데이터를 전송하는지 웹 브라우저에게 알려줘야 하는데, 그 이유는 데이터의 종류를 알고있으면 더 빠르게 처리할 수 있기 때문이다. 따라서 서버(서블릿)에서 웹 브라우저로 데이터를 전송할 때는 톰캣 컨테이너에서 제공하는 여러 가지 전송 데이터 종류 중 하나를 지정해서 웹 브라우저에 전송한다. 이처럼 톰캣 컨테이너에서 미리 설정해 놓은 데이터 종류들을 MIME-TYPE(마임 타입)이라고 한다.

  • HTML로 전송 시: text/html
  • 일반 텍스트로 전송 시: text/plain
  • XML 데이터로 전송 시: application/xml

웹 브라우저는 기본적으로 HTML만 인식하므로 서블릿에서 전송하는 대부분의 데이터는 MIME-TYPE을 text/html로 지정한다.

  

서블릿 응답 과정

➡ setContextType()을 이용해 MIME-TYPE을 지정한다.

➡ 데이터를 출력할 PrintWriter 객체를 생성한다.

➡ 출력 데이터를 HTML 형식으로 만든다.

➡ PrintWriter의 print()나 println()을 이용해 데이터를 출력한다.

  

사용자가 입력한 ID와 비빌번호를 전송하면 서블릿이 다시 브라우저에게 응답한다.

package sec02.ex01;

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;

/**
 * Servlet implementation class LoginServlet2
 */
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		System.out.println("init 메서드 호출");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8"); // 웹 브라우저에서 전송된 데이터 인코딩 설정
		response.setContentType("text/html;charset=utf-8"); // 응답할 데이터 종류 설정
		PrintWriter out = response.getWriter(); 

		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");

		String data = "<html>"; // 브라우저로 출력할 데이터를 문자열로 연결해서 HTML 태그 생성
		data += "<body>";
		data += "아이디 : " + id;
		data += "<br>";
		data += "비밀번호 : " + pw;
		data += "</html>";
		data += "</body>";
		out.print(data); // HTML 태그 문자열을 웹 브라우저로 출력
	}

	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

}

해당 코드를 수행하면 서블릿이 ID와 비밀번호를 전달받아서 응답을 보내 브라우저에 다음과 같이 출력된다.