Servlet; doGet, doPost

🗓️

서블릿 기초

Servlet의 세가지 기본 기능

  • Servlet이 수행하는 세가지 주요 기능은 다음과 같다.
    • 클라이언트로부터 요청을 받는다.
    • 비즈니스 로직을 처리한다.
    • 처리된 결과를 클라이언트에게 응답으로 내려보낸다.
  • 초기 웹 프로그램 개발에서는 서블릿이 클라이언트로부터 요청을 받아 비즈니스 작업을 처리한 후 그 결과를 클라이언트의 브라우저로 전송하는 방식으로 작업했다.

Servlet 요청과 응답 API

  • 요청과 응답에 관련된 API는 모드 javax.servlet.http패키지에 있다.
    • HttpServletRequest
    • HttpServletResponse
    protected void doGet(HttpServletRequest request, HttpServletResponse response) //<<<<
        throws ServletException, IOException {
            //...
    }
  • 클라이언트가 서블릿에 요청을 하면 먼저 톰캣 컨테이너가 받는다.
  • 사용자의 요청이나 응답에 대한 HttpServletRequest객체와 HttpServleyResponse객체를 만들고 doXXX()메소드를 호출하면 이 객체들을 전달한다.
  • 톰캣이 사용자 요청에 대한 정보를 모든 HttpServletRequest 객체의 속성으로 담아 메소드로 전달하므로 HttpServletRequest에서 제공하는 메소드들은 매개변수로 넘어온 객체들을 이용해 사용자가 전송한 데이터를 받아오거나 응답할 수 있는 것이다.

Servlet에서 클라이언트의 요청을 얻는 방법

  • HttpServletRequest에서 <form>태그로 전송된 데이터를 받아오는데 사용되는 메소드
    • String getParameter(String name) : name의 값을 알고 있을때 전송된 값을 받아올때 사용된다.
    • String[] getParameterValues(String name) : 같은 name에 대해 여러개의 값을 얻을 때 사용된다.
    • Enumeration getParameterNames() : name 값을 모를때 사용

하나의 파라미터 요청처리; getParameter()

  • login.html파일을 만든다
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>로그인 창</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>
  • LoginServlet servlet을 만든다
@WebServlet("/login")
public class LoginServlet extends HttpServlet {


    public void init() throws ServletException {
        System.out.println("Call init method");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("ID: " + user_id);
        System.out.println("PW: " + user_pw);
    }
}
  • 아래는 localhost:8080/project/login.html을 실행 했을때 결과
Call init method
ID: null
PW: null
ID: asdf
PW: asd

여러개의 값을 전송할 때 요청 처리; getParameterValues()

  • input.html 코드
  • InputServlet 클래스 코드; getParameterValues()
@WebServlet("/input")
public class InputServlet extends HttpServlet {

    public void init() throws ServletException {
        System.out.println("Call init method");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("ID: " + user_id);
        System.out.println("PW: " + user_pw);
        String[] subject = request.getParameterValues("subject");
        for (String elem : subject) {
            System.out.println("select subject: " + elem);
        }

    }

    public void destroy() {
        System.out.println("Call destroy method");
    }
}
  • 실행결과
Call init method
ID: asdf
PW: asdf
select subject: java
ID: afs
PW: dfsa
select subject: jsp
ID: afs
PW: dfdfa
select subject: jsp
select subject: spring

파라미터 일괄조회; getParameterNames()

  • input_gpn.html 코드
  • InputGPNServlet 코드
@WebServlet("/input_gpn")
public class InputGPNServlet extends HttpServlet {

    public void init() throws ServletException {
        System.out.println("Call init method");
    }

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

    }

    public void destroy() {
        System.out.println("Call destroy method");
    }
}
  • 실행 결과
Call init method
name: user_id value: sdfafg
name: user_pw value: asdf
name: subject value: java
name: subject value: c언어
name: subject value: jsp

Servlet의 응답 처리 방법

  • 서블릿에서 응답을 처리하는 방법은 다음과 같다
    • doGet()이나 doPost() 안에서 처리한다
    • HttpServletResponse를 이용한다.
    • setContentType()을 이용해 클라이언트에게 전송할 MIME-TYPE을 지정한다.
    • 클라이언트와 서블릿 통신은 자바 I/O스트림을 이용한다.

HttpServletResponse를 이용한 서블릿 응답 실습

  • 응답하는 순서는 다음과 같다
    1. setContentType()을 이용해 MIME타입 지정
    2. 데이터를 출력할 PrintWriter 객체를 만든다
    3. 출력 데이터를 HTML형식으로 만든다
    4. PrintWriterprint()println()을 이용해 데이터를 출력한다.
  • login_response.html 코드
  • LoginResponseServlet 코드
@WebServlet("/login_response")
public class LoginResponseServlet extends HttpServlet {


    public void init() throws ServletException {
        System.out.println("Call init method");
    }

    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 user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");

        System.out.println("ID: " + user_id);
        System.out.println("PW: " + user_pw);

        String data = "<html><body>";
        data += "아이디: " + user_id + "<br/>";
        data += "비밀번호: " + user_pw + "<br/>";
        data += "</body></html>";
        out.print(data);
    }
}

웹브라우저에서 Servlet으로 데이터 전송하기

GET/POST 전송 방식

GET 방식

  • servlet에 데이터를 전송할 때는 데이터가 URL뒤에 name-value 형태로 전송된다.
  • 여래기의 데이터를 전송할 때는 &로 구분한다
  • 전송할 수 있는 데이터는 최대 255자
  • 기본 전송 방식이다
  • 웹브라우저에서 직접 입력해서 전송할 수도 있다.

POST 방식

  • servlet에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 HEAD영역에 숨겨서 전송된다.
  • 전송 데이터 용량이 무제한이다
  • 전송시 servlet에서 또 다시 가져오는 작업을 해야한다.

POST방식으로 servlet에 요청

  • login_post.html 코드
  • LoginPostServlet 코드
@WebServlet("/login_post")
public class LoginPostServlet extends HttpServlet {

    public void init() throws ServletException {
        System.out.println("Call init method");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("ID: " + user_id);
        System.out.println("PW: " + user_pw);
    }
}
  • 전송방식과 다른 메소드로 처리하면 405에러가 발생한다.

GET과 POST 요청을 동시에 처리하기

  • login_handle.html 코드
  • LoginHandleServlet 코드
@WebServlet("/login_handle")
public class LoginHandleServlet extends HttpServlet {

    public void init() throws ServletException {
        System.out.println("Call init method");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        System.out.println("Call doGet method");
        doHandle(request, response);
    }


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        System.out.println("Call doPost method");
        doHandle(request, response);
    }


    private void doHandle(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        System.out.println("Calll doHandle method");
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("ID: " + user_id);
        System.out.println("PW: " + user_pw);
    }
}

응용방안

  • servlet단에서 로그인 유효성 검사
  • servlet단에서 로그인시 관리자 화면 나타내기