[Servlet] GET/POST방식으로 데이터 전송하기
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이 전송되도록)
- 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>");
}