Back/Servlet

Servlet 요청 API

Hyeon_ 2021. 12. 28. 23:30

Servlet 요청 API

서블릿 요청 API

  • 서블릿 기본 기능
    1. 클라이언트로부터 요청을 받음
    2. 데이터베이스 연동과 같은 비즈니스 로직 처리
    3. 처리된 결과를 클라이언트에게 응답
  • 서블릿 요청과 응답 수행 API
    • javax.servlet.http 패키지에 포함
    • 요청과 관련된 API : javax.servlet.http.HttpServletRequest 클래스
    • 응답과 관련된 API : javax.servlet.http.HttpServletResponse 클래스
    • doGet() / doPost()메소드에서 request, response 객체 사용

<form> 태그로 서블릿 요청

  • <form> 태그를 이용해 브라우저에서 서블릿으로 사용자의 요청이나 데이터 전송
  • 서블릿 데이터를 웹 브라우저로 전송
  • <form> 태그
    • action 속성 : 서블릿 또는 JSP 이름 지정
    • method 속성 : GET 또는 POST (default GET)
  • <input> 태그
    • name 속성 사용
    • name 속성명과 속성값 쌍으로 전송
  • 서블릿에서 클라이언트 요청에 사용되는 메소드
    • HttpServletRequest 클래스의 여러 메소드를 이용해서 전송된 데이터를 얻음
    • <form> 태그로 전송된 데이터를 받아오는 메소드
    • String getParameter(String name) : name의 값을 알고 있을 때 그리고 name에 대한 전송 값을 받아오는 데 사용
    • String[] getParameterValues(String name) : 같은 name에 대해 여러 개의 값을 얻을 때 사용
    • Enumeration getParameterNames() : name 값을 모를 때 사용

<form> 태그 사용해서 HttpServletRequest 요청 처리 예제

login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" >
    아이디  :<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.java
ackage com.example.servlet4;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doProcess(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        String id =  request.getParameter("user_id");
        String pw =  request.getParameter("user_pw");
        System.out.println("아이디 : " + id);
        System.out.println("비밀번호 : " + pw);
    }
}

GET / POST

  • POST 방식 전송
    • http://localhost:8080/Servlet01/login
    • 서블릿에게 데이터 전송할 때 TCP/IP 프로코콜 데이터의 HEAD 영역에 숨겨진 채 전송
    • 보안에 유리
    • 전송 데이터 용량 무제한
    • 서블릿에서 처리 시 GET 방식보다 느림
    • 서블릿에서 doPost() 메소드를 이용해서 처리
  • GET 방식 전송
    • http://localhost:8080/Servlet01/login?user_id=abcd&user_pw=1111
    • 서블릿에게 데이터를 전송할 때 데이터가 URL 뒤에 name=value 형태로 전송
    • 여러 개의 데이터를 전송할 때는 &로 구분해서 전송
    • 보안에 취약
    • 전송할 수 있는 데이터는 최대 255자 (길이 제한)
    • 기본 전송 방식으로 쉬움
    • 웹 브라우저에서 직접 입력해서 전송 가능 (디폴트 GET 방식)
    • 서블릿에서는 doGet() 메소드를 이용해서 처리

<form> 태그를 활용 서블릿에 데이터 전송 및 출력

bookForm.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>bookForm 예제</title>
    </head>
    <body>
                <h2>도서정보 출력</h2>
            <form method="post" action="bookInsert">
                <table>
                    <tr>
                        <th>도서번호</th>
                        <td>
                        <input type="text" name="bookNo">
                    </tr>
                    <tr>
                        <th>도서명</th>
                        <td>
                        <input type="text" name="bookName">
                    </tr>
                    <tr>
                        <th>저자</th>
                        <td>
                        <input type="text" name="bookAuthor">
                    </tr>
                    <tr>
                        <th>가격</th>
                        <td>
                        <input type="text" name="bookPrice">
                    </tr>
                    <tr>
                        <th>발행일</th>
                        <td>
                        <input type="text" name="bookYear" size="4">년
                        <input type="text" name="bookMonth" size="2">월
                        <input type="text" name="bookDate" size="2">일
                    </tr>
                    <tr>
                        <th>재고</th>
                        <td>
                        <input type="text" name="qtyNo">
                    </tr>
                    <tr>
                        <th>출판사번호</th>
                        <td>
                        <input type="text" name="pubNo">
                    </tr>
                    <tr>
                        <td>
                            <input type="submit" name="submit" value="등록">
                            <input type="reset" name="reset" value="취소">
                        </td>
                    </tr>
                </table>
            </form>    
    </body>
</html>
BookServlet.java
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("/bookInsert")
public class BookServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        String bookNo = request.getParameter("bookNo");
        String bookName = request.getParameter("bookName");
        String bookAuthor = request.getParameter("bookAuthor");
        String bookPrice = request.getParameter("bookPrice");
        String bookYear = request.getParameter("bookYear");
        String bookMonth = request.getParameter("bookMonth");
        String bookDate = request.getParameter("bookDate");
        String qtyNo = request.getParameter("qtyNo");
        String pubNo = request.getParameter("pubNo");

        System.out.println("도서 번호: " + bookNo );
        System.out.println("도서 명: " + bookName );
        System.out.println("저자: " + bookAuthor );
        System.out.println("가격: " + bookPrice );
        System.out.println("발행일: " + bookYear+"-"+ bookMonth +"-"+bookMonth);
        System.out.println("재고: " + qtyNo );
        System.out.println("출판사 번호: " + pubNo );
    }
}

여러 개의 값을 전송할 때 요청 처리

  • <input> 태그에서 text 또는 radio 버튼의 경우 1개의 값을 전송하지만, 체크박스인 경우 여러 개의 값을 선택해서 여러 개 전송
  • getParameterValues()메소드 사용해서 배열로 받음
input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>여러 가지 input 타입 표시창</title>
</head>
<body>
<form name="frmInput" method="post" action="input">
   아이디  :<input type="text" name="user_id"><br>
   비밀번호:<input type="password" name="user_pw"><br>
   이메일 수신 여부 : <input type="radio" name="emailRcv" value="yes" checked>예
           <input type="radio" name="emailRcv" value="no">아니오<br>
   <input type="checkbox" name="subject" value="java" checked >자바
   <input type="checkbox" name="subject" value="C언어">C언어
   <input type="checkbox" name="subject" value="JSP">JSP
   <input type="checkbox" name="subject" value="안드로이드">안드로이드 
   <br><br>
   <input type="submit" value="전송">   
   <input type="reset" value="초기화">
  </form>
</body>
</html>
inputServlet.java
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("/input")
public class InputServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        String id = request.getParameter("user_id");
        String pw = request.getParameter("user_pw");
        String emailRcv = request.getParameter("emailRcv");
        String[] subject = request.getParameterValues("subject");

        System.out.println("아이디 : " + id);
        System.out.println("비밀번호 : " + pw);
        System.out.println("이메일 수신 여부 : " + emailRcv);

        System.out.print("관심분야 : ");
        for(String sub : subject) {
            System.out.print(sub + " ");
        }
        System.out.println();
    }
}

서블릿 응답 처리

  • 서블릿의 응답 처리
    1. setContentType()을 이용해 MIME-TYPE 지정
    2. 데이터를 출력할 PrintWriter 객체 생성
    3. 출력 데이터를 HTML 형식으로 작성
    4. PringWriter의 print()나 println()을 이용해 데이터 출력(웹 브라우저로 전송되어 출력)
  • 서블릿 응답 처리 방법
    • doGet() 또는 doPost() 메소드 안에서 처리
    • javax.servlet.http.HttpServletResponse 객체 이용
    • setContentType()을 이용해서 클라이언트에게 전송할 데이터 종류(MIME-TYPE) 지정
      • response.setContentType(‘text/html;charset=utf-8”);
    • 클라이언트(웹 브라우저)와 서블릿 통신은 자바 I/O 스트림을 이용 (서버에서 클라이언트로 데이터 전송에 자바 I/O 스트림을 이용)
      • PrintWriter 클래스 사용
      • PrintWriter out = response.getWriter();
      • out.print(data);
      • data : 웹 브라우저로 보내는 데이터
        • HTML 형식으로 출력되어야 하므로
        • data에 HTML 태그 포함시켜서 전송
        • HTML 문서 형식을 제대로 작성해서 전송
        • 전송된 HTML 형식으로 출력
  • MIME-TYPE
    • 톰캣 컨테이너에 미리 지정해 놓은 데이터 종류로 서블릿에서 브라우저로 전송 시 설정해서 사용
    • HTML로 전송 시 : text/html
      • 웹 브라우저는 기본적으로 HTML을 인식하므로 text/html로 지정
    • 일반 텍스트로 전송 시 : text/plain
    • XML 데이터로 전송 시 : application/xml