고래씌

[Servlet] 1-2. Post 방식으로 전달 실습 본문

Server/JSP과 Servlet

[Servlet] 1-2. Post 방식으로 전달 실습

고래씌 2023. 12. 5. 14:59

▶ Get방식 전달 실습과 이어서 진행한다.

 

1. POST방식으로 요청 후 응답페이지 받아보기

특징1. POST방식으로 요청한 데이터는 url의 Body 영역에 데이터를 포함시켜서 요청 
=> 사용자가 입력한 값들이 url에 노출되지 않는다.
=> 보안유지가 가능함
=> 로그인이나, 회원가입같은 경우 post방식이 적합함

특징2. Body영역은 전송하는 길이에 제한이 없음
=> 즉, 게시판 작성같은 경우 Post방식으로 하는게 적합함

특징3. 즐겨찾기는 가능하나 전달되는 데이터가 URL에 노출되지 않음

특징4. 최대 요청 받는 시간이 존재해서 페이지 요청 및 대기시간이 있다.

 

 

■ index.html 파일

 

 

 

■ requestTest_POST.html 파일

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>POST방식으로 요청 후 응답페이지 받아보기</h1>
	
	<p>
		특징1. POST방식으로 요청한 데이터는 url의 Body 영역에 데이터를 포함시켜서 요청 
		=> 사용자가 입력한 값들이 url에 노출되지 않는다.
		=> 보안유지가 가능함
		=> 로그인이나, 회원가입같은 경우 post방식이 적합함
		
		특징2. Body영역은 전송하는 길이에 제한이 없음
		=> 즉, 게시판 작성같은 경우 Post방식으로 하는게 적합함
		
		특징3. 즐겨찾기는 가능하나 전달되는 데이터가 URL에 노출되지 않음
		
		특징4. 최대 요청 받는 시간이 존재해서 페이지 요청 및 대기시간이 있다.
	</p>
	
	<h2>개인정보 입력 - POST</h2>

	<form action='test2.do' method="post">
		<ul>
			<li>
				<!-- input 태그 사용시 key 값은 반드시 서버에 넘겨줘야하는데 key값 설정은 name 속성으로 한다. -->
				이름 : <input type="text" name="name">
			</li>
			<li>
				성별 :
				남자 <input type="radio" name="gender" value="M">
				여자 <input type="radio" name="gender" value="F">
			</li>
			<li>
				나이 : <input type='number' name='age'>
			</li>
			<li>
				사는 도시 :
				<select name="city">
					<option>서울시</option>
					<option>경기도</option>
					<option>강원도</option>
					<option>인천</option>
				</select>
			</li>
			<li>
				키 : <input type="range" name="height" min="140" max="200">
			</li>
			<li>
				좋아하는 음식(모두 고르시오) :
				한식 <input type="checkbox" name="food" value="한식">
				중식 <input type="checkbox" name="food" value="중식">
				일식 <input type="checkbox" name="food" value="일식">
				양식 <input type="checkbox" name="food" value="양식">
				분식 <input type="checkbox" name="food" value="분식">
			</li>
			<li>
				<input type="submit">
				<input type="reset">
			</li>
		</ul>
	</form>

</body>
</html>

 

 

2. Servlet 요청

■ RequestPostServlet.java

 

① Post방식 요청의 경우 값을 뽑기전에 UTF-8방식으로 인코딩을 변경해줘야함
- Post의 기본 인코딩 설정은 ISO-8859-1임.

 

 

② 요청 처리 : Service - DAO - SQL문 실행
- 위의 요청처리를 다 했다는 가정 하에 사용자가 보게될 응답 페이지 출력
- 순수 Servlet : Java코드 내에 html 코드를 작성
JSP(Java Server Page) : html내에 Java코드를 쓸 수 있는 기술
- 응답페이지를 만드는 과정을 jsp에게 위임(forward)

단, 응답화면에서 필요로 하는 데이터들을 꾸미기위해 jsp에게 필요한 데이터를 넘겨줘야함
=> request에 attribute 영역에 담아서 보내준다.

 

 

=> Object 자료형으로 값이 들어감

 

 

package com.kh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/test2.do")
public class RequestPostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public RequestPostServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8"); // 인코딩 변경
		
		String name = request.getParameter("name"); 
		String gender = request.getParameter("gender"); 
		int age = Integer.parseInt(request.getParameter("age"));  
		String city = request.getParameter("city");
		double height = Double.parseDouble(request.getParameter("height"));  
		String[] foods = request.getParameterValues("food");
		
		// request.setAttribute("키", "밸류");
		request.setAttribute("name", name);
		request.setAttribute("age", age);
		request.setAttribute("gender", gender);
		request.setAttribute("city", city);
		request.setAttribute("height", height);
		request.setAttribute("foods", foods); 
		// 모두 업캐스팅 되어 들어가서 하나의 함수로 다양한 자료형을 넣을 수 있는 이유이다!
		
		// 위임시 필요한 객체
		// 1) 응답하고자 하는 뷰를 선택하면서 RequestDispatcher 객체 생성
		RequestDispatcher view = request.getRequestDispatcher("views/responsePage.jsp");
		
		// 2) 포워딩
		view.forward(request, response);
	
	}

}

 

 

 

 

3. JSP 파일을 이용한 포워딩

 

 

▶ <% ~ %> 영역

- 이 구문은 스크립틀릿이라고해서 jsp문서 내에 자바코드를 쓸 수 있는 영역
- 현재 이 jsp에서 필요로 하는 데이터들 request의 atrribute에 담겨있음
- request.getAttribute("키값") : Object
- Object형식에서 내가 받고자 하는 자료형으로 강제형변환해서 담아주면된다.

 

 

■ responsePage.jsp 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	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");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<style>
	h2{color:red;}
	span{font-weight:bold;}
	#name{color:orange;}
	#age{color:yellow;}
	#city{color:green;}
	#height{color:blue;}
	#gender{color:naby;}
	li{color:purple;}

</style>
	<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) { %>
		선택을 안했습니다. <br>
	<% } else { %>
		<sapn id='gender'><%= gender.equals("M") ? "남자" : "여자" %></sapn>
	<% } %>
	
	좋아하는 음식은
	<% if(foods == null) {
		out.print("없습니다.");
	} else {
		for(String food : foods){
			out.print("<li>" + food + "</li>");
		}
	}
	%>

</body>
</html>