GSJun

서블릿의 데이터 접근과 통신 GET, POST 본문

카테고리 없음

서블릿의 데이터 접근과 통신 GET, POST

GSJun 2023. 7. 7. 20:35

웹 애플리케이션은 사용자가 데이터를 받기만 하지 않음 > 때에 따라 전송도 해야함

이때 입력하는 데이터를 폼 파라미터라고 부르며 요청 방식에 따라 파라미터 전송 방식이 다름

 

GET방식은 메시지의 URL에 포함되어 데이터가 전송됨

POST방식은 URL이 아닌 요청 메시지 바디에 포함되어 전송됨

 

GET 방식 요청

POST 방식 요청

GET 방식을 사용하는 경우

  - 동일한 요청에 대해 동일한 응답 결과를 가져와야 하는 경우

  - 데이터의 양이 적을 경우

  - 즐겨찾기에 등록되게 하고 싶은 경우

(정적 처리나 데이터 양이 적거나)

 

POST방식을 사용하는 경우

  - 요청의 처리가 데이터베이스에 데이터를 저장하는 것 처럼 서버를 변경하는 경우

  - 데이터의 양이 많을 경우

  - 비밀번호 필드 등 데이터 내용이 URL을 통해 보이면 안되는 경우

(동적 처리나 데이터 양이 많거나 보안 상 이슈가 있을 때)

 

get 방식 / post 방식

<form> 태그의 기본 형식

<form method="get/post" action="호출할 서블릿">

<form> 태그의 주요 속성

method 어떤 방식으로 데이터를 넘겨 줄 것인지 결정 / get, post

get : 사용자가 입력한 결과를 알 수 있도록 내용을 공개

post : 사용자가 입력한 내용을 발송할 때 내용을 공개하지 않음
action 전송(submit) 버튼을 누르면, action속성 다음에 기술한 URL이 지정한 파일로 이동

전송버튼(submit)

<input type="submit" value="전송" />

<form> 태그만으로 action 속성에 기술된 서블릿으로 데이터를 전송하기 위해서는 전송버튼이 클릭되어야 한다.

 

취소버튼(reset)

<input type="reset" value="취소" />

취소버튼을 누르면 데이터를 다시 입력할 수 있도록 이전에 입력한 내용이 깨끗하게 리셋됨

 

get과 post전송 방식의 폼과 서블릿 테스트

1. JSP 파일 생성

2. JSP 파일 작성

3. 새로운 서블릿 생성

4. 코드 작성

5. 코드 실행

doGet과 doPost는 HttpServletRequest 객체와 HttpServletResponse 객체를 파라미터 변수로 받음

따라서 이 둘의 인터페이스에 정의되어 있는 API를 사용할 수 있음

 

Request API

String getParameter(String name)

  - name에 해당하는 파라미터의 값을 변환한다

  - name 값은 폼의 요소들의 name 속성의 값과 일치해야 함

 

Eumeration getParameterNames()

  - 파라미터의 이름 목록을 반환함

 

String[] getParameterValues(String name)

  - name에 해당하는 파라미터들의 값을 반환

  - 같은 이름의 파라미터가 여러 개의 값을 가지고 있을 경우 사용

    ex) form에 checkbox, list

 

Map(String, String[]) getParameterMap()

  - 요청 파라미터 정보를 Map 형식으로 반환함

 

Void setCharacterEncoding(String charset)

  - 요청 데이터의 인코딩 처리

 

Void setAttributer(String name, Object value)/Object getAttribute(String name)

  - 데이터를 request 객체에 묶고 / 받아올 수 있는 메서드 (데이터 바인딩)


  - 서블릿에서 파라미터 값을 처리할 때는 모든 파라미터 값이 문자열로 전달 됨

    ex) 정수 사용을 원하면 Integer.parseInt(String data)로 형변환해야 함

 

  - 요청 파라미터의 파라미터 이름을 모를 경우 getParameterMap() 메서드를 통해 모든 요청 파라미터 조회 가능

 

  - GET방식 요청 시 파라미터에 한글을 포함하고 싶은 경우 request.setCharacterEncoding("utf-8");

    로 요청객체의 인코딩만 설정해서는 불가능 함

    - tomcat conf 폴더 안 server.xml에서 <Connecter> 태그에 URLEncoding="utf-8" 속성을 추가해야 함

 

Post 방식 예제

form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>폼 테스트</title>
</head>
<body>
	<h1>입력값 테스트</h1>
    <form action="PostServlet" method="post">
        아이디 : <input type="text" name="id" size="10" maxlength="10" value="user01"><br>
        비밀번호 : <input type="password" name="pw" size="10"><br>
        좋아하는 과일(여러개 선택 가능): 
        <input type="checkbox" name="fruit" value="10">사과
        <input type="checkbox" name="fruit" value="20" checked>귤
        <input type="checkbox" name="fruit" value="30">감<br>
        성별 :
        <input type="radio" name="sex" value="M" checked>남성
        <input type="radio" name="sex" value="F" checked>여성<br>

        직업 :
        <select name="job" size="2">
            <option value="학생">학생</option>
            <option value="회사원" selected>회사원</option>
            <option value="변호사">변호사</option>
            <option value="의사">의사</option>
            <option value="감사">감사</option>
        </select><br>
        <textarea name="data" cols="30" rows="5">
            기본값은 여기에 넣습니다.
            공백도 나타냅니다.
        </textarea><br>
        <input type="file" name="file"><br>
        <input type="submit" value="저 장">
        <input type="reset" value="취 소">
    </form>
</body>
</html>

 

PostServlet.java

package unit01;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String[] fruit = request.getParameterValues("fruit");
		String sex = request.getParameter("sex");
		String job = request.getParameter("job");
		String data = request.getParameter("data");
		
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		out.println("<HTML>");
		out.println("<HEAD><TITLE>태그결과출력화면</TITLE></HEAD>");
		out.println("<BODY>");
		out.printf("아이디: %s <BR>", id);
		out.printf("비밀번호: %s <BR>", pw);
		out.print("과일: ");
		
		for(String val : fruit) {
			out.printf("%s ", val);
		}
		
		out.print("<BR>");
		out.printf("성별: %s <BR>", sex);
		out.printf("직업: %s <BR>", job);
		out.println("--------<BR>");
		out.printf("<PRE>%s</PRE>", data);
		out.println("--------<BR>");
		out.println("저장되었습니다.");
		out.println("</BODY>");
		out.println("</HTML>");
	}
}

실행 화면

 

GET 방식 예제

formEx02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>개인 정보 입력</h2>
	<form action = "GetServlet" method = "get">
		이름 : <input type=text name=name><br>
		아이디 : <input type=text name=id><br>
		패스워드 : <input type=password name=password><br><br>
		성별:
		남<input type=radio name=gender value=Male>
		여<input type=radio name=gender value=Female><br><br>
		연락처 : <input type=tel pattern="^\(?\d{3}\)?[-\s]\d{3,4}[-\s]\d{4}$" name=phone><br>
		메일 수신 여부:
		공지메일<input type=checkbox name=notice value="공지">
		광고메일<input type=checkbox name=notice value="광고">
		배송 확인 메일<input type=checkbox name=notice value="배송"><br><br>
		날짜<input type="date" name="date"><br>
		직업:
		<select name=job>
			<option>회사원</option>
			<option>학생</option>
			<option>기타</option>
		</select>
		<br><br>
		<input type=reset value="취소">
		<input type=submit value="확인">
	</form>
</body>
</html>

 

GetServlet.java

package unit01;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		String name = request.getParameter("name");
		String id = request.getParameter("id");
		String password = request.getParameter("password");
		String phone = request.getParameter("phone");
		String gender = null;
		
		if(request.getParameter("gender").equals("Male")) 
		{
			gender = "남";
		}
		else 
		{
			gender = "여";
		}
		
		String[] notice = request.getParameterValues("notice");
		String date = request.getParameter("date");
		String job = request.getParameter("job");
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("<head><title>Get 방식 요청 처리</title></head>");
		out.println("<body>");
		out.printf("이름 : %s <br>", name);
		out.printf("아이디 : %s <br>", id);
		out.printf("비밀번호 : %s <br>", password);
		out.printf("연락처 : %s <br>",phone);
		out.printf("성별 : %s <br>", gender);
		
		for(String s : notice) {
			out.printf("메일 수신 여부 : %s <br>", s);
		}
		
		out.printf("날짜 : %s <br>", date);
		out.printf("직업 : %s <br>", job);
		out.println("</BODY>");
		out.println("</HTML>");
	}

}

formEx.jsp
PostServlet.java

 

 

 

formEx02.jsp
GetServlet.java