본문 바로가기
○ WEB/19.07 BoostCourse_DB연결 웹앱

[웹기초 BE_Servlet] 10. Request, Response 객체 이해하기

by 0ver-grow 2019. 7. 9.
반응형

Request, Response 객체 이해하기

들어가기 전에

이번 파트를 학습하다 보면 '요청', '응답'이라는 용어가 많이 등장합니다.

이번 학습에서는 클라이언트가 서버에게 보낸 요청을 추상화한 객체 HttpServletRequest 와 서버가 클라이언트에게 응답하기 위한 정보를 추상화한 객체 HttpServletResponse에 대해서 알아봅니다.

 

핵심 개념

  • HttpServletRequest
  • HttpServletResponse

1. 웹 브라우저에 URL입력

2. 웹 브라우저는 도메인, 포트번호 이용하여 서버접속하고

3. 웹 브라우저는 패스정보, cli IP, 기타 요청 정보를 서버에 전송

 

객체지향에서

객체란 관련된 정보를 모아서 가지고 있는 것이 특징

cli로 부터 req들어오면 WAS는 2개의 객체(HttpServletRequest, HttpServletResponse)에서 반응한다.

 

a. HttpServletRequest객체

http프로토콜request정보를 서블릿에게 전달하기 위한 목적으로 사용

요청시 가져온 다양한 정보(헤더,파라미터,쿠키,URL,URI, 등)들을 읽어 들이는 메서드를 지닌 객체

Body의 Stream을 읽어 들이는 메소드 소유함

 

b. HttpServletResponse객체

WAS가 어떤 Cli가 요청을 보냈는지 앎,

해당 Cli에게 응답을 보내기 위한 HttpServletResponse객체(Content type, 응답코드)를 생성하여 서블릿에게 전달.

서블릿은 이 객체를 이용하여 content type, 응답코드, 응답 메시지 등의 응답을 전송할 수 있다.

 

현재 접속한 클라이언트에게 응답을 보내기 위해 정보 담은 객체 생성

이 2개의 객체를 요청 정보에 Path로 매핑된 서블릿에게 전달

이렇게 전달한 객체는 service(), doGet() 같은 메서드에 파라미터로 전달되어 사용됨

 

< Cli가 Server에게 req할 때 > 

굉장히 많은 정보를 함께 가지고 요청함

이때 들어오는 요청정보들이 뭐가있을까

 

웹 브라우저가 전송한 모든 헤더의 이름과 값들을 출력하는 HeaderServlet을 하나 만들어서 실습해보자.

http://localhost:8080/firstweb/header

package name : examples

class name : headerServlet

url mapping : /header

 

	// 요청정보가 들어왔을 떄 헤더정보가 무엇이 있을지를 출력하고자 한다.
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");// 응답 보내기 전에 컨텐츠타입에 대해 미리 알려줘야 한다.
		PrintWriter out = response.getWriter(); // 요청객체(response)로 부터 응답 보낼 통로를 알아온다. cli와의 연결통로 알아오기
		// 응답 보낼 HTML 태그들
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");
		// 알아보고픈 헤더에 대한 정보들을 작성해보자
		// 요청이 들어올 때 모든 정보들은 WAS가 HttpServletRequest라는 객체에 담아뒀다.
		// 근데 이를 doGet()의 파라미터로 가지고 들어왔다.고로 request에게 물어보면 요청시의 모든 정보들을 알 수 있다.
		Enumeration<String> headerNames = request.getHeaderNames();// request가 가진 메서드 중 getHeaderNames()메서드는 모든 헤더 이름을 문자열(Enumeration)로 반환해준다.
		while (headerNames.hasMoreElements()) {// Enumeration으로 반환받았기에 그 부분을 while문 통해 알아보면 headerName을 알 수 있고
			String headerName = headerNames.nextElement();
			String headerValue = request.getHeader(headerName);// headerName을 통해 getHeader()통해 헤더값을 알 수 있다.
			out.println(headerName + " : " + headerValue + " <br> ");// 이를 응답 결과에 담아 브라우저에 출력한다.
		}

		out.println("<//body>");
		out.println("<//html>");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response); // doPost()또한 doGet()을 호출하도록 되어있기에 doGET()에 구현한 것과 동일하게 실행된다.
	}

http://localhost:8080/firstweb/param?name=lee&age=25

?이후를 파라미터라고 한다.

& 앤퍼센트가 기준점

파라미터이름 = 파라미터값

지금은 클라이언트가 넘겨준 정보(name=lee, age=25)를 넘겨주고자 한다. 

이 정보를 읽어서 사용하면 된다. 

이를 사용할 서블릿 파일을 만들자. 

 

ParameterServlet.java

URLMappingName : param

doGet()메서드만 Override

 

 

	@Override
	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>parameter</title></head>");
		out.println("<body>");

		String nameVal = request.getParameter("name"); // getParameter("parameter name")
		String ageVal = request.getParameter("age"); // getParameter("parameter value") 숫자가 아닌 전부 문자열로 넘어오기에 String사용

		out.println("name : " + nameVal + "<br>");
		out.println("age : " + ageVal + "<br>");

		out.println("</body>");
		out.println("</html>");

Run as Server를 하면 하단처럼 나타난다.

URL에 직접 ?name=lee&age=25 를입력하면

입력값이 반영되어 응답 결과가 달라진 출력물을 확인할 수 있다.

이를 동적페이지라고 한다.

파라미터는 URL을 통해서 뿐만 아니라 HTML form태그의 input태그 안에 들어있는 값들도 파라미터로 넘어오기에 똑같은 방법으로 꺼내서 사용하면 된다.

 

 

반응형