
클라이언트와 서버 사이의 요청과 응답 기초원리(form태그와 servlet)
- form태그의 action속성과 servlet의 annotation 일치
-> 즉, form태그의 action속성은 클라이언트의 요청을 보낼 servlet을 명시한다.- input태그의 name속성을 servlet의 getParameter()로 받아온다.
-> 클라이언트가 요청한 전달값을 name속성에 담아 보내면, 서블릿은 getParameter()로 받는다.- 클라이언트가 post방식으로 서버에 요청하면, request객체에 패킷(요청정보)를 담아 전달한다.
-> 또한, HttpServletRequest, HttpServletResponse 객체가 생성된다.(표1,2 참고)
HttpServletRequest(요청객체)에 패킷(요청정보)의 header와 body가 담긴다.
-> 따라서, 서버입장에서는 클라이언트의 소켓(IP, Port)과 전달값을 알 수 있다.
-> request.getParameter()로 클라이언트가 보낸 전달값을 얻어올 수 있다.
cf) 패킷의 header에는 브라우저의 버정정보, 한글 인코딩 정보, Cookie 정보 등도 담긴다.
| header | body |
|---|---|
| 클라이언트의 IP와 Port | parameter1 |
| - | parameter2 |
| (브라우저의 버전정보) | - |
| (한글 인코딩 정보) | - |
| (Cookie 정보) | - |
표1. request객체 내부의 패킷(요청정보) = header + body
HttpServletResponse(응답객체)에는 패킷의 header가 담긴다.
-> 클라이언트의 소켓을 알고 있으므로 요청한 클라이언트에게 요청 결과를 응답할 수 있다.
| header |
|---|
| 클라이언트의 IP와 Port |
표2. 패킷의 header
[Form (클라이언트)]
<form action="calc.do" method="post">
<table class="table table-bordered">
<tr>
<td>수1</td>
<td><input type="text" name="su1"></td>
</tr>
<tr>
<td>수2</td>
<td><input type="text" name="su2"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" class="btn btn-primary" value="전송">
<input type="reset" class="btn btn-warning" value="취소">
</td>
</tr>
</table>
</form>
[Servlet (서버)]
@WebServlet("/calc.do")
public class CalcController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int su1 = Integer.parseInt(request.getParameter("su1"));
int su2 = Integer.parseInt(request.getParameter("su2"));
int sum = 0;
for(int i = su1; i <= su2; i++ ) {
sum += i;
}
PrintWriter out = response.getWriter();
out.println("total = " + sum);
}
}