Java

[Servlet] GET/POST방식으로 데이터 전송하기

dearbeany 2022. 8. 31. 15:09

GET

form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="FormServlet" method="GET">
	<label>이름 : </label>
	<input type ="text" placeholder="이름을 입력하세요" name="name"> <br>
	<label>나이 : </label>
	<input type ="number" min="0" placeholder="나이를 입력하세요" name="age"> <br>
	<input type="radio" name="gender" id="man" value="man">
	<label for ="man">남자</label>
	<input type="radio" name="gender" id="woman" value="woman">
	<label for ="woman">여자</label>
	
	<input type="submit">
	</form>
</body>
</html>

- form은 FormServlet으로 보내는데, 전송방식은 GET이다.

- input태그 안을 적을 때 주의할 점: 반드시 name-value을 지정해주어야 한다. (name: value = key : value이 전송되도록)

 

 

 

 

Insert title here


 

 

 

 

- Form을 채운 후 제출하면?

http://localhost:8080/Back02_Servlet/FormServlet?name=%EC%9D%B4%EC%88%98%EB%B9%88&age=25&gender=woman

- name=이수빈&age=25&gender=woman

- 내가 form.html에서 입력한 값들이 URL로 넘어왔다!

- 즉, form.html에서 입력한 값들은 FormServlet.java 서블릿에서 request객체에 담겨있으므로 getParameter(name)을 통해 value값을 알 수 있다.

 

 

 

FormServlet.java

@WebServlet("/FormServlet")
public class FormServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("GET");
		System.out.println(request.getParameter("name"));
		System.out.println(request.getParameter("age"));
		System.out.println(request.getParameter("gender"));

		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String gender = request.getParameter("gender");
	}
    
}

 


POST

- POST방식으로 넘길 경우 form작성 후 제출한다면 URL의 모습은 다음과 같다.

http://localhost:8080/Back02_Servlet/FormServlet

- POST로 전송된 데이터는 구글 개발자도구에서 확인 가능하다.

 

 

- GET에선 잘 처리 되었는데, POST에서 다음과 같이 한글이 깨지는 이유?

- POST에선 Request에 인코딩방식을 설정해주어야

 

 

 

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8"); // 없으면 한글깨짐

		System.out.println("POST");

		System.out.println(request.getParameter("name"));
		System.out.println(request.getParameter("age"));
		System.out.println(request.getParameter("gender"));

		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String gender = request.getParameter("gender");

	}

 

 

 

- 결과적으로, GET이던 POST던 둘 다 key-value형태로 데이터를 보내기 때문에 request.getParameter(key) 방식으로 얻어오는 방식은 똑같다.

 

데이터 전송방식이 다를 뿐 GET/POST
데이터를 얻어오는 방식은 같다! request.getParameter(key)

 

 

 

 

 

- 하나의 서블릿으로 전체를 제어하겠다 => Front-Controller-Pattern

- 이 경우, form태그에서 input 타입을 hidden 으로 주어 name= "action" value를 다르게 주어 비밀스러운 정보를 사용자에겐 안 보이지만, 서버에게 같이 보내준다. 서블릿에서 action의 값을 switch문으로 분기시켜 처리한다.

 

 

 

 

*서블릿을 통해서 응답을 직접적으로 그림을 그려주어 웹서버에 던져주고, 웹서버는 그를 받아서 사용자에게 보여준다.

private void doRegist(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String gender = request.getParameter("gender");
		String[] hobbies = request.getParameterValues("hobby");

		Person p = new Person(name, age, gender, hobbies);

		PrintWriter writer = response.getWriter();

		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>PersonInfo</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>등록한 사람 정보</h1>");
		writer.append(p.toString());
		writer.append("</body>");
		writer.append("</html>");

	}