Servlet-JSP

Request - Response

voider 2020. 9. 10. 13:18

서블릿의 기본 기능

톰캣과 같은 Web Application Server(이하 WAS)가 처음 나왔을 때 웹 브라우저 요청을 쓰레드 방식으로 처리하는 기술이 서블릿이었다. 서블릿은 자바로 웹 프로그래밍을 하는 데 있어서 가장 기초가 되는 내용이다.

  • 서블릿 기본 기능 수행 과정
  1. 클라이언트로 요청을 받는다.
  2. 데이터 베이스와 연동 하여 비즈니스 로직을 처리한다.
  3. 처리된 결과를 다시 클라이언트에게 돌려준다.

HttpServletRequest & HttpServletReponse

  • HttpServletRequest
    요청을 돕기 위한 클래스

  • HttpServletResponse
    응답을 돕기 위한 클래스

요청과 응답

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form name="login" method="post" action="login">
아이디 : <input type="text" name="id"><br>
비밀번호:<input type="password" name="password">
<button>확인</button>
</form>
</body>
</html>

LoginServlet.java

package com.controller;

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 {
    @Override
    public void init() throws ServletException {
        //한 번만 실행
        System.out.println("init()........");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet().........");

        //doGet을 호출하면 login.html을 띄운다.
        response.sendRedirect("/login.html");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //전송 받은 데이터를 UTF-8로 인코딩
        request.setCharacterEncoding("utf-8");

        //getParameter()는 input tag의 name을 입력하면 value값을 받아올 수 있다.
        String id = request.getParameter("id");
        String pw = request.getParameter("password");

        System.out.println("아이디 : " + id);
        System.out.println("비밀번호 : " + pw);
    }

    @Override
    public void destroy() {
        System.out.println("destroy().......");
    }

}
/*
결과 
init()........
doGet().........
아이디 : cocoLee
비밀번호 : 1234
*/

여러 값 전송할 때 요청 처리

login.html

<!-- 변경된 부분-->
<form name="login" method="post" action="login">
아이디 : <input type="text" name="id"><br>
비밀번호:<input type="password" name="password">
<input type="checkbox" name="subject" value="java" checked> Java
<input type="checkbox" name="subject" value="C언어"> C
<input type="checkbox" name="subject" value="JSP"> jsp
<input type="checkbox" name="subject" value="Android"> Android
<button>확인</button>

LoginServlet.java 변경된 부분

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //전송 받은 데이터를 UTF-8로 인코딩
    request.setCharacterEncoding("utf-8");

    //하나의 name으로 여러 값을 전송하는 경우 getParameterValues()를 이용해 배열로 반환한다.
    String[] subject = request.getParameterValues("subject");

    //하나씩 전송된 값은 getParameter()를 이용한다
    String id = request.getParameter("id");
    String pw = request.getParameter("password");

    System.out.println("아이디 : " + id);
    System.out.println("비밀번호 : " + pw);
    System.out.println("subject : " + Arrays.toString(subject));
}

/*
결과
init()........
아이디 : cocoLee
비밀번호 : 1234
subject : [java, JSP]
*/

서블릿 응답처리 방법

  1. doGet(), doPost() 안에서 처리
  2. javax.servlet.http.HttpServletResponse객체 이용
  3. setContentType()을 이용해 MIME-TYPE 지정
  4. 클라이언트와 서블릿 통신은 자바 I/O의 스트림을 이용

MIME-TYPE

웹은 기본적으로 I/O다. 웹 브라우저가 네트워크를 통해 서블릿 데이터를 보내는 경우, 서블릿은 네트워크로부터 데이터를 입력 받는다. 반대로 서블릿이 웹 브라우저로 데이터를 전송하는 경우, 서블릿은 네트워크로 데이터를 출력한다.
서버(서블릿)에서 브라우저로 데이터를 전송할 때, 어떤 종류의 데이터를 전송하는지 브라우저에게 알려줘야 한다. 그게 이미지인지, 텍스트인지 오디오인지 브라우저가 알고 있어야 더 빠르게 처리할 수 있다. 서블릿은 톰캣 컨테이너에서 제공하는 데이터 종류 중 하나를 지정해서 브라우저로 전송한다. 이처럼 미리 설정해놓은 데이터 종류를 MIME-TYPE이라고 한다.

  • text/html
    HTML로 전송할 때

  • text/plain
    일반 텍스트로 전송할 때

  • application/xml
    XML 데이터로 전송할 때

Response과정

  1. setContentType()으로 MIME-TYPE 지정
  2. 데이터를 출력할 PrintWriter객체 생성
  3. 출력 데이터 HTML형식으로 만들기
  4. PrintWriter의 print()나 println()을 이용해 데이터 출력

login.html body

<body>
<form name="login" method="get" action="login2">
아이디 : <input type="text" name="id"><br>
비밀번호:<input type="password" name="password">
<button>확인</button>
</form>
</body>

LoginServlet2.java

 package com.controller;

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("/login2")
public class LoginServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //인코딩 설정
        request.setCharacterEncoding("utf-8");
        //MIME-TYPE설정 응답할 데이터 종류가 html임을 미리 알림.
        response.setContentType("text/html;charset=utf-8");
        //HttpServletResponse객체의 getWriter()를 이용해
                 //출력 스트림 PrintWriter 객체를 받아온다.
        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");
        String pw = request.getParameter("password");

        String data = "<html>";
        data += "<body>";
        data += "아이디 : " +id;
        data += "<br>";
        data += "비밀번호 : " + pw;
        data += "</body>";
        data += "</html>";

        out.print(data);
    }

}

위와 같은 결과를 브라우저에서 확인할 수 있다.

'Servlet-JSP' 카테고리의 다른 글

Connection Pool  (0) 2020.09.10
포워드  (0) 2020.09.10
JDBC  (0) 2020.09.10
GET & POST  (0) 2020.09.10
Servlet  (0) 2020.09.10