불로구

[JSP 웹 프로그래밍] 서블릿(Servlet) 이란? 본문

프로그래밍/WEB

[JSP 웹 프로그래밍] 서블릿(Servlet) 이란?

맹이맹이 2021. 3. 10. 17:43
반응형

서블릿?

  • 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스
  • 자바의 일반적인 특징을 모두 가진다.
  • 독자적으로 실행 불가, 컨테이너에서 실행

동작과정
- 클라이언트가 웹 서버에 요청
- 웹 서버는 요청을 톰캣과 같은 웹 애플리케이션 서버에 위힘
- WAS는 각 요청에 해당하는 서블릿을 실행
- 서블릿은 요청에 대한 기능 수행
- 결과 반환
- 클라이언트에 전송

특징

  • 서버 쪽에서 실행되면서 기능 수행
  • 동적인 여러 가지 기능 제공
  • 스레드 방식
  • 객체지향, 컨테이너 종류에 상관없이 실행 (플랫폼 독립적)
  • 보안 기능 적용 쉬움

서블릿 기능 수행 과정

  • 클라이언트로부터 요청 받음
  • DB연동과 같은 비즈니스 로직 처리
  • 처리된 결과를 클라이언트에 돌려준다.

응답과 요청 수행 API

  • 요청 API : javax.servlet.http.HttpServletRequest 클래스
  • 응답 API : javax.servlet.http.HttpServletResponse 클래스

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

  • String getParameter(String name) : name의 값을 알고 있을 때 name에 대한 값 받기
  • String[] getParameterValues(String name) : 같은 name에 대해 여러 개의 값을 얻을 때 사용
  • Enumeration getParameterNames() : name 값을 모를 때 사용

회원가입처럼 여러개 값이 많아 기억하기 힘들 때

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Enumeration enu = request.getParameterNames();
		while(enu.hasMoreElements()) {
			String name=(String) enu.nextElement();
			String[] values = request.getParameterValues(name);
			for(String str : values) {
				System.out.println("name = " + name + ", value = " + str);
			}
		}
	}

서블릿의 응답 처리 방법

  • doGet()이나 doPost() 메서드 안에서 처리
  • javax.servlet.http.HttpServletResponse 객체 이용
  • setContentType()을 이용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE)를 지정
  • 클라이언트와 서블릿의 통신은 자바 I/O의 스트림 이용

MIME-TYPE

  • 톰캣 컨테이너에서 미리 설정해 높은 데이터 종류를 MIME-TYPE이라 한다.
  • ex) HTML로 전송 : text/html 일반 텍스트 : text/plain XML 데이터로 전송 : application/xml

서블릿이 클라이언트에 응답하는 과정

  • setContentType()을 이용해 MIME-TYPE을 지정
  • 데이터를 출력할 PrintWriter 객체 생성
  • 출력 데이터를 HTML 형식으로 생성
  • PrintWriter의 print()나 println()으로 데이터 출력

GET VS POST 방식

  • GET방식

    • 서블릿에 데이터 전송 시 데이터가 URL 뒤에 name=value 형식으로 전송
    • 여러 데이터를 전송 시 & 로 구분해서 전송, 보안 취약
    • 전송 데이터 최대 255자
  • POST방식

    • 서블릿에 데이터를 전송 시 TCP/IP 프로토콜 데이터의 HEAD 영역에 숨겨진 채 전송
    • 보안에 유리, 전송 데이터 용량 무제한
    • 전송 시 서블릿에서 또 다시 가져오는 작업을 하기 때문에 GET보다 처리속도가 늦다

예제

-HTML

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script type="text/javascript">
  	function fn_login(){
  		console.log("클릭됨");
  		var frmLogin = document.getElementsByName("frmLogin")[0];
  		var user_id = frmLogin.user_id.value;
  		var user_pw = frmLogin.user_pw.value;
  		
  		if((user_id.length == 0 || user_id == "") || (user_pw.length == 0 || user_pw == "")){
  			alert("아이디와 비밀번호는 필수입니다.");
  		}else{
  			frmLogin.method="post";
  			frmLogin.action="../login5";
  			frmLogin.submit();
  		}
  	}
  </script>
</head>
<body>
  	<form name="frmLogin" method="post" action="../login5" encType="UTF-8">
  		아이디 : <input type="text" name="user_id"><br>
  		비밀번호 : <input type="password" name="user_pw"><br>
  		<input onClick="fn_login()" type="button" value="로그인">
  		<input type="reset" value="리셋">
  		<input type="hidden" name="user_address" value="울산임">
  	</form>
</body>
</html>

-JSP

package sec01.ex03;

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 LoginServlet5
 */
@WebServlet("/login5")
public class LoginServlet5 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@Override
	public void init() throws ServletException {
		System.out.println("servlet5 init 호출");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String address = request.getParameter("user_address");
		System.out.println("아이디 : " + id);
		System.out.println("패스워드 : " + pw);
		System.out.println("주소 : " + address);
		PrintWriter out = response.getWriter();
		
		String data = "<html>";
		data += "<body>";
		data += "아이디 : " + id + "<br>";
		data += "패스워드 : " + pw + "<br>";
		data += "주소 : " + address;
		data += "</body></html>";
		
		out.print(data);
	}

}
반응형
Comments