GSJun
서블릿의 데이터 접근과 통신 GET, POST 본문
웹 애플리케이션은 사용자가 데이터를 받기만 하지 않음 > 때에 따라 전송도 해야함
이때 입력하는 데이터를 폼 파라미터라고 부르며 요청 방식에 따라 파라미터 전송 방식이 다름
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>");
}
}