Servlet의 post 방식에 대해 알아보자
POST 방식
✔️ 특징 1. POST 방식으로 요청하는 건 URL의 Body 영역에 데이터를 포함시켜서 요청
=> 사용자가 입력한 값 (데이터)들이 URL에 노출되지 않음
=> 즉, 로그인이나 회원가입 같은 경우 POST 방식이 더 적합함
✔️ 특징 2. URL의 Body 영역은 전송하는 데이터의 길이에 제한이 없음
=> 즉, 게시판 작성 같은 경우 POST 방식이 더 적합함
✔️ 특징 3. 즐겨찾기는 가능하나 전달되는 데이터가 URL에 노출되어 있지 않음
(기존에 봤던 그 응답화면을 볼 수 없을 것)
=> 즉, 검색 기능에는 POST 방식이 부적합함
✔️ 특징 4. 최대 요청 받는 시간(Time out)이 존재해 페이지 요청 시 기다리는 시간이 있음
POST 방식으로 요청 후 응답 페이지 받아 보기
👉🏻 순서대로 진행
<index.xml>
// 영역을 잘 지정해 줘야 함
<h3><a href="views\requestTest_POST.html">POST 방식 테스트</a></h3>
<requestTest_POST>
1) Get 방식에서 썼던 form 복사
2) action, method 기입
<requestPostServlet>
3) controller 패키지에 Servlet Class name RequestPostServlet 생성 후 URL mapping 값 /test2.do로 수정
만약 이때 URL mapping 값 수정하는 걸 까먹었다면?
url에 경로가 그대로 노출되어 위험함!
👉🏻 생성된 클래스의 어노테이션 문구에서 수정 가능!
4) get 방식과 동일하게 각 변수에 request.getParameter(변수명) 담고, 파싱할 거 파싱해 주기
5) 폼 확인해 보기
6) 인코딩 세팅 (GET 방식과 유일하게 다른 과정)
POST 방식으로 요청할 경우 값을 뽑기 전에 우선 UTF-8 방식으로 인코딩 설정을 해야 함
POST 방식의 기본 인코딩 설정이 ISO-8859-1이기 때문
request.setCharacterEncoding("UTF-8");
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // doGET 영역 메소드 시작
// 자동완성 코드는 그냥 지워 버렸음!
// doGet() 메소드를 호출해도 정말 POST 메소드가 잘 실행이 되는지 확인
// System.out.println("잘 실행되나...?");
// POST 방식으로 요청할 경우 값을 뽑기 전에 우선 UTF-8 방식으로 인코딩 설정을 해야 함
// POST 방식의 기본 인코딩 설정이 ISO-8859-1이기 때문
// request.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
// 요청 시 전달값들은 request의 parameter 영역에 key-value 세트로 담겨 있음 (마치 Map처럼)
// request.getParameter("키값"): String 타입의 밸류값 리턴
// request.getParameterValues("키값"): String[] 타입의 밸류값들이 리턴
String name = request.getParameter("name"); // name이라는 변수에는 "홍길동" 같은 식으로 담겨 있을 것, 입력 안 했다면 빈 문자열!
String gender = request.getParameter("gender"); // gender라는 변수에는 "M" 또는 "F" 같은 식으로 담김, 라디오 버튼이므로 입력 안 했다면 null 값
int age = Integer.parseInt(request.getParameter("age")); // 20이 아닌 "20"이 받아와지므로 파싱해 줘야 함
// 주의할 점 "20a" 또는 빈 문자열 넘기면 => NumberFormatException 발생
String city = request.getParameter("city"); // "서울시"
double height = Double.parseDouble(request.getParameter("height")); // 170.5가 아닌 "170.5"가 담기므로 파싱해 줘야 함
String[] foods = request.getParameterValues("food"); // ["햄버거", "만두", "떡볶이", ...], 체크박스이므로 입력 안 한다면 null 값
// 출력
System.out.println("name: " + name);
System.out.println("gender: " + gender);
System.out.println("age: " + age);
System.out.println("city: " + city);
System.out.println("height: "+ height);
// System.out.println("foods: " + foods /* .toString() */); // 주소값 출력
if(foods == null) { // NullPointerException 방지
System.out.println("foods: 선택된 음식 없음");
} else {
System.out.println("foods: " + String.join(", ", foods));
// 배열에 있는 모든 값들을 구분자를 통해서 하나의 문자열로 연이어 반환해 주는 메소드
}
7) 응답 페이지 출력을 위해 JSP File 생성 후 떠넘기기
7-1) 응답하고자 하는 JSP 뷰 파일을 선택하면서 객체 생성
원래의 흐름: Cotroller -> Service -> DAO -> DB
result > 0 : 성공, else : 실패
위의 요청 처리를 다 했다라는 가정 하에 사용자가 보게 될 응답 페이지 출력
응답 페이지 출력하는 방법
1. 자바를 이용하는 방법: Java 코드 내에 HTML 코드를 기술
2. JSP를 이용하는 방법: HTML 내에 Java 코드를 기술
(Java Server Page: HTML 내에 Java 코드를 기술하여 동적인 페이지 구현 가능)
응답 페이지를 만드는 과정을 Java 코드로 직접 하는 것이 아니라 JSP에게 "위임"할 것(대신 응답 페이지 만들어 달라고 떠넘기기)
응답 페이지 위임을 해서 필요한 객체: RequsetDispatcher
// 1) 응답하고자 하는 JSP 뷰 파일을 선택하면서 객체 생성
RequestDispatcher view = request.getRequestDispatcher("views/responsePage.jsp");
7-2) 포워딩 작업
2) 포워딩 작업
view.forward(request, response); // url 주소는 변함이 없고 화면만 바꿔치기 됨
<responesePage.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>
<span id="name">xxx</span>님은
<span id="age">xxx</span>살이며,
<span id="city">xxxx</span>에 사는,
<span id=height>xxx.x</span>cm이고,
성별은
선택을 안 했습니다. <!-- case1 -->
<span id="gender">남자</span>입니다. <!-- case2 -->
<span id="gender">여자</span>입니다. <!-- case3 -->
<br>
좋아하는 음식은
없습니다. <!-- case1 -->
xx <!-- case2 -->
xx
xx
xx
</body>
</html>
단, 그 응답 화면 (JSP)에서 필요로 하는 데이터들을 request 객체에 담아서 보내 줘야 함
=> request의 attribute 영역 (key-value 세트로)
request.setAttribute("키", 밸류);
키값은 String 고정, 밸류 타입은 상관없음!
+여담으로 수화물 부치는 과정과 비슷함 (위임하기 전에 변수의 데이터들 그대로 넘기기)
+ 나중에 ResponsePage.jsp에서 수화물에 부쳤던 스티커(변수 이름)으로 값 찾을 것!
<RequestPostServlet>
request.setAttribute("name", name);
request.setAttribute("age", age);
request.setAttribute("gender", gender);
request.setAttribute("city", city);
request.setAttribute("height", height);
request.setAttribute("foods", foods);
// Object type으로 자동 upcasting 돼서 잘 들어간 꼴
<ResponsePage.jsp>
<% %> 이라는 스트립틀릿(html 문서 내에 JAVA 코드를 기술할 수 있는 영역) 내에 기술
현재 이 jsp에서 필요로 하는 데이터들 => request 객체의 attribute 영역에 (key-value 세트로) 담겨 있음
request.getAttribute("키값"): Object 타입의 밸류값 리턴
Object 타입은 모든 타입의 최상위 부모이기 때문에 "강제형변환" 해서 변수에 담으면 됨
=> 주의할 점: 다형성에 의해 잘못 DownCasting 하면 ClassCastException 발생!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 이 구문을 스트립틀릿이라고 해서 html 문서 내에 JAVA 코드를 기술할 수 있는 영역
String name = (String)request.getAttribute("name");
int age = (int)request.getAttribute("age");
String gender = (String)request.getAttribute("gender");
String city = (String)request.getAttribute("city");
double height = (double)request.getAttribute("height");
String[] foods = (String[])request.getAttribute("foods");
System.out.println(name + "/" + age + "/" + gender + "/"
+ city + "/" + height + "/" + String.join(", ", foods));
%>
<!DOCTYPE html>
<html>
7-3) 불러오기
<%= 변수명 %>: 출력문
그냥 변수명만 쓰면 문자열로 인식하기 때문에 출력문인 <%= %>을 써 줄 것
<body>
<h2>개인정보 응답화면</h2>
<span id="name"><%= name %></span> 님은
<span id="age"><%= age %></span>살이며,
<span id="city"><%= city %></span>에 사는,
<span id=height><%= height %></span>cm이고,
성별은
<% if(gender == null) { %>
선택을 안 했습니다. <!-- case1 -->
<% } else { %>
<% if(gender.equals("M")) { %>
<span id="gender">남자</span>입니다. <!-- case2 -->
<% } else { %>
<span id="gender">여자</span>입니다. <!-- case3 -->
<% } %>
<% } %>
<br>
좋아하는 음식은
<% if(foods == null) { %>
없습니다. <!-- case1 -->
<% } else { %>
<ul>
<% for(int i=0; i <foods.length; i++) { %>
<li><%= foods[i] %> </li>
<% } %>
</ul>
<% } %>
</body>
스타일도 넣어 보자
<style>
h2 { color : red;}
span { font-wight: bold;}
#name { color : orange;}
#age { color : yellow;}
#city { color : green;}
#height { color :blue;}
#gender { color : navy;}
li { color : purple;}
</style>
👉🏻 html, css 같은 코드만 건드린 경우에는 서버를 재시작하지 않고 페이지만 새로고침하면 적용됨