Web : Request/Response

Request/Response

웹 브라우저에 URL을 입력하고 Enter를 입력하면 도메인과 포트번호를 이용해서 서버에 접속합니다. 그리고 나서 path정보, 클라이언트의IP, 클라이언트의 다양한 정보를 포함한 요청 정보를 서버에게 전송하게 됩니다.

img

요청과 응답

  • WAS는 웹 브라우저로부터 Servlet요청을 받으면 요청할 때 가지고 있는 정보를 HttpServletRequest객체를 생성하여 저장합니다.

  • 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse객체를 생성합니다.
  • 생성된 HttpServletRequest, HttpServletResponse 객체를 path로 매핑된 서블릿에게 전달합니다.
  • 이렇게 전달한 객체는 service(), doGet(), doPost()같은 메서드에 파라미터로 전달돼서 사용하게 됩니다.

HttpServletRequest

  • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용합니다.
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있습니다.
    • 요청할 때 가지고 있는 모든 정보들을 메서드로 담습니다. (심지어 요청한 사용자가 어떤 언어를 사용하고 있느냐 같은 정보들 까지)
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있습니다.

HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse객체를 생성하여 서블릿에게 전달합니다.
  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송합니다.

예제1

Request객체에 들어있는 모든 정보값을 가져와 출력합니다.

package examples;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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("/header")
public class HeaderServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public HeaderServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		Enumeration<String> headerNames = request.getHeaderNames();
		// getHeaderNames는 모든 헤더이름을 Enumeration객체로 반환해줍니다. 
		while(headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();
			// 헤더의 name을 가져오고
			String headerValue = request.getHeader(headerName);
			// 헤더의 이름을 통해서 값 정보를 가져올 수 있습니다.
			out.println(headerName + " : " + headerValue + " <br> ");
		}		
		
		out.println("</body>");
		out.println("</html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	// 기본적으로 doPost를 override하면 doGet을 호출하고 있기 때문에 Get에 다가 내용을 구현하면 Post를 해도 같은 내용이 나옵니다.
}
<!-- 결과를 보면 헤더 : 헤더의 값 형식으로 나오는 것을 볼 수 있습니다. -->
accept : image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */* 
 accept-language : ko 
 cache-control : no-cache 
 ua-cpu : AMD64 
 accept-encoding : gzip, deflate 
 user-agent : Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko 
 host : localhost:8080 
 connection : Keep-Alive 

예제2

URL주소의 파라미터 정보를 읽어 출력합니다.

만약 http://localhost:8080/firstweb/param?name=kim&age=5 이 있다면? 뒤에 있는 name=kim&age=5가 파라미터입니다. &를 계속 사용하면 더 많은 파라미터를 전달할 수 있습니다.

package examples;

import java.io.IOException;
import java.io.PrintWriter;

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("/Param")
public class ParameterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ParameterServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		String name = request.getParameter("name");
		String age = request.getParameter("age");
		
		out.println("name : " + name + "<br>");
		out.println("age : " +age + "<br>");
		// 그냥 실행하게 되면 값이 null이 나옵니다.
		// form의 input태그를 사용하거나 url에 파라미터를 넘겨주어야 값이 나옵니다.
		
		out.println("</body>");
		out.println("</html>");
	}
}

예제3

Request가 가지고 있는 다양한 값들을 출력합니다.

// firstweb프로젝트의 info.java
package examples;

import java.io.IOException;
import java.io.PrintWriter;

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("/Info")
public class InfoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public InfoServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>info</title></head>");
		out.println("<body>");

		String uri = request.getRequestURI();
		// 도메인과 포트 이하에(오른쪽) 있는 값을 가져옵니다.
		StringBuffer url = request.getRequestURL();
		// 요청 주소 전체를 볼 수 있습니다.
		String contentPath = request.getContextPath();
		// 웹 어플리케이션과 매핑된 path를 가져옵니다.
		String remoteAddr = request.getRemoteAddr();
		// 클라이언트의 IP주소값을 가져옵니다.
		
		
		out.println("uri : " + uri + "<br>");
		out.println("url : " + url + "<br>");
		out.println("contentPath : " + contentPath + "<br>");
		out.println("remoteAddr : " + remoteAddr + "<br>");
		
		out.println("</body>");
		out.println("</html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
<!-- 결과 -->
uri : /firstweb/Info
url : http://localhost:8080/firstweb/Info
contentPath : /firstweb
remoteAddr : 0:0:0:0:0:0:0:1

결과를 보면 uri와 url의 차이를 알 수 있습니다. 또, 기본적으로 현재 프로젝트 이름이contextPath로 지정이 되는 것을 볼 수 있습니다.

ip가 0:0 형식으로 나오고 있는 이유는 로컬 컴퓨터에서 접속했기 때문입니다. 실제 로컬 컴퓨터에서 접속하면 운영체제에 따라서 127.0.0.1 혹은 localhost 가 출력될 수도 있지만, 운영체제가 IPv6같은 경우는 지금 처럼 0:0:0:0:0:0:0:1 이 출력됩니다.


참고 : https://www.boostcourse.org/web326/lecture/258514?isDesc=false

댓글남기기