Request / Response

planted-ji·2023년 5월 1일
0
post-custom-banner

요청과 응답

▷ WAS는 웹 브라우저로부터 Servlet 요청을 받으면,
└ 요청할 때 가지고 들어온 다양한 정보를 HttpServletRequest 객체를 생성하여 저장한다.
└ 웹 브라우저에게 응답을 보낼 때 사용하기 위해, 정보를 담을 수 있는 객체에 HttpServletResponse 객체를 생성한다.
└ 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달한다.

└ 이렇게 전달한 객체는 service(), doGet(), doPost() 같은 메소드에 *파라미터로 전달되어 사용하게 된다.

HttpServletRequest

▷ HTTP 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
▷ 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다.
▷ Body의 Stream을 읽어 들이는 메소드를 가지고 있다.

HttpServletResponse

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


HttpServletRequest에게 들어오는 헤더 정보 읽기

(클라이언트가 요청했을 때 가지고 들어온 헤더 정보 알아내기)

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 {
		{
			// 브라우저가 응답을 받았을 때, 어떤 type인지 알 수 있도록 반드시 작성한다.
            response.setContentType("text/html");
            
            // 클라이언트에게 응답하기 위해 출력 스트림을 반환한다.
			PrintWriter out = response.getWriter();
            
            // 응답으로 보내줄 HTML 태그를 작성한다.
			out.println("<html>");
			out.println("<head><title>form</title></head>");
			out.println("<body>");

			// request는 doGet의 파라미터로, HttpServletRequest에 담긴 모든 정보를 가진다. request의 메소드인 getHeaderNames()는 모든 헤더 이름을 문자열 Enumeration 객체로 반환한다.
            Enumeration<String> headerNames = request.getHeaderNames();
            
            // Enumeration 객체로 반환한 정보를 while문을 통해 알아내고, out.println()을 통해 출력한다.
			while(headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();
			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);
	}

}

실행 결과


HttpServletResponse가 받은 정보 사용하기

(클라이언트가 넘겨준 정보를 읽어 사용하기)

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 {
		
        // 브라우저가 응답을 받았을 때, 어떤 type인지 알 수 있도록 반드시 작성한다.
        response.setContentType("text/html");
        
        // 클라이언트에게 응답하기 위해 출력 스트림을 반환한다.
		PrintWriter out = response.getWriter();
        
        // 응답으로 보내줄 HTML 태그를 작성한다.
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		// 요청할 때 가져오는 값에는 파라미터 정보도 있다. 그래서 request에게 getParameter() 메소드를 수행한다.
        String name = request.getParameter("name");
		String age = request.getParameter("age");

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

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

}

실행 결과

▷ URL을 통해 name, age에 값을 넣어주면 반영된다. (값을 넣지 않으면 null로 반환)

▷ 모든 파라미터가 반드시 URL을 통해서만 넘어오지는 않는다.

└ HTML form라는 태그가 존재하는데, 그 안에 있는 input 태그 내부의 값들도 똑같이 파라미터로 넘어온다.


requset가 가진 다양한 메소드를 이용해 출력하기

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();
		String remoteAddr = request.getRemoteAddr();

		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>");
	}


}

실행 결과

▷ uri : 도메인과 포트 이하에 있는 값.

▷ url : 요청 주소 전체.

▷ contentPath : WAS에서 웹 애플리케이션을 구분하기 위한 경로. 이클립스에 톰캣을 연동하면 프로젝트 생성 시 자동으로 server.xml에 추가된다. 현재 프로젝트명이 기본값으로 지정되며 변경이 가능하다.

▷ remoteAddr : 클라이언트의 주소 값.

이렇게 request는, 클라이언트가 요청할 때 보낸 수많은 정보를 추상화하여 간직하고 필요할 때 원하는 값을 사용할 수 있다.


*파라미터(parameter) : 매개변수. 메소드 수행에 필요한 입력값을 저장하는 변수이다. | 메소드와 파라미터

ex. http://localhost:8080/firstweb/param?name=kim&age=5

▷ ?를 기준으로 뒤에 있는 것들이 파라미터이다.

▷ &은 정보를 구분하는 기준점이다. 계속 사용해 더 많은 파라미터를 전달할 수가 있다.

▷ =를 기준으로 앞에 있는 건 파라미터 이름, 뒤에 있는 건 파라미터 값이다.

post-custom-banner

0개의 댓글