오봉이와 함께하는 개발 블로그

Servlet - Servlet 요청 API 본문

BE/Servlet

Servlet - Servlet 요청 API

오봉봉이 2021. 12. 27. 19:57
728x90

서블릿 요청 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 (디폴트 GET)
  • <input>태그
    • name 속성 사용
    • name 속성명과 속성값 쌍으로 전송
  • 서블릿에서 클라이언트 요청에 사용되는 메소드
    • HttpServletRequest 클래스의 여러 메소드를 이용해서 전송된 데이터를 얻음
    • <form> 태그로 전송된 데이터를 받아오는 메소드
    • String getParameter(String name) : name의 값을 알고 있을 때 그리고 name에 대한 전송된 값을 받아오는 데 사용
    • String[] getParameterValues(String name) : 같은 name에 대해 여러 개의 값을 얻을 때 사용
    • Enumeration getParameterNames() : name 값을 모를 때 사용

<form> 태그를 사용해서 HttpServletRequest 요청 처리 예제 - login.html, LoginServlet.java

<!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>
package 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, BookServlet.java

<!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>
package com.example.servlet4;

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, InputServlet.java

<!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>
package com.example.servlet4;

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();
    }
}

여러 개의 값을 전송할 때 요청 처리 문제 - newMember.html, NewMemberServlet.java

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>회원가입 폼</title>
        <style>            
            #id, #pwd { width: 100px;}
            table { margin:0 auto; width:600px; }
        </style>

    </head>
    <body>
        <div id="wrap">
            <h3 align="center">회원 가입</h3>
            <hr>
            <form id="newMemberForm" name="newMemberForm" method="post" action="newMember">
              <table>
                  <tr><td> 성명</td><td><input type="text" id="name" name="name"></td></tr>
                <tr><td> ID</td><td><input type="text" id="id" name="id"></td></tr>
                <tr><td>비밀번호</td><td><input type="password" id="pwd" name="pwd"></td></tr>
                <tr><td>휴대폰 번호</td><td><input type="text" id="hp1" name="hp1" size="3"> 
                        - <input type="text" id="hp2" name="hp2" size="4">
                        - <input type="text" id="hp3" name="hp3" size="4"></td></tr>   
                <tr><td>학년</td><td><input type="radio" id="year1" name="year" value="1" >1학년
                                         <input type="radio" id="year2" name="year" value="2">2학년
                                         <input type="radio" id="year3" name="year" value="3">3학년
                                         <input type="radio" id="year4" name="year" value="4">4학년</td></tr>
                <tr><td>관심분야</td>
                      <td><input type="checkbox"  id="web" name="interest" value="웹 프로그래밍">웹 프로그래밍
                             <input type="checkbox"  id="design" name="interest" value="파이썬">파이썬
                             <input type="checkbox"  id="bigdata" name="interest" value="빅데이터">빅데이터
                             <input type="checkbox"  id="java" name="interest" value="자바">자바 프로그래밍</td></tr>
                <tr><td>학과</td>
                      <td><select id="department" name="department">
                                   <option value="">선택하세요</option>
                                   <option value="경영학과">경영학과</option>
                                   <option value="산업공학과">산업공학과</option>
                                   <option value="경제학과">경제학과</option>
                                   <option value="전자공학과">전자공학과</option>
                                   <option value="컴퓨터학과">컴퓨터학과</option>
                              </select></td></tr>
                 <tr>
                    <td colspan="2" align="center">
                        <br><input type="submit" value="완료">
                        <input type="reset" value="취소">
                    </td>
                </tr>             
              </table>
              </form>    
           </div>            
    </body>
</html>
package com.example.servlet4;

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("/newMember")
public class NewMemberServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void init(ServletConfig config) throws ServletException {

    }

    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 name = request.getParameter("name");
        String id = request.getParameter("id");
        String pwd = request.getParameter("pwd");
        String hp1 = request.getParameter("hp1");
        String hp2 = request.getParameter("hp2");
        String hp3 = request.getParameter("hp3");
        String year = request.getParameter("year");
        String[] interest = request.getParameterValues("interest");
        String department = request.getParameter("department");

        System.out.println("이름 : " + name);
        System.out.println("아이디 : " + id);
        System.out.println("비밀번호 : " + pwd);
        System.out.println("휴대폰 번호 : " + hp1+"-" + hp2+"-" + hp3 );
        System.out.println("학년 : " + year + "학년");

        System.out.print("관심분야 : ");
         for (String inter : interest ) { 
             System.out.print(inter + " ");
         }
         System.out.println();
         System.out.println("학과 : " + department);
    }
}

서블릿 응답 처리

  • 서블릿의 응답 처리
    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

서블릿의 응답 처리 예제 - login.html, LoginServlet.java

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

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

@WebServlet("/login2")
public class LoginServlet2 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);
            // 응답처리
            // 서버 - > 클라이언트로 setContentType
            response.setContentType("text/html;charset=utf-8");

            // 서버에서 클라이언트로 데이터 전송에 자바 IO스트림 이용
            PrintWriter out = response.getWriter();
            // HTML 문서 형식으로 데이터 전송
            out.println("<html><head></head><body>");
            out.println("아이디 :" + id + "<br>" +  "비밀번호 : " + pw);
            out.println("</body></html>");
        }
    }
728x90

'BE > Servlet' 카테고리의 다른 글

Servlet - 포워딩  (0) 2021.12.29
Servlet - Servlet DB연동(Connection Pool)  (0) 2021.12.28
Servlet - Servlet DB 연동(기본 JDBC)  (0) 2021.12.28
Servlet - DOM 객체, name 속성, jQuery 사용  (0) 2021.12.28
Servlet - Servlet 개요  (0) 2021.12.27
Comments