▷ WAS는 웹 브라우저로부터 Servlet 요청을 받으면,
└ 요청할 때 가지고 들어온 다양한 정보를 HttpServletRequest 객체를 생성하여 저장한다.
└ 웹 브라우저에게 응답을 보낼 때 사용하기 위해, 정보를 담을 수 있는 객체에 HttpServletResponse 객체를 생성한다.
└ 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달한다.
└ 이렇게 전달한 객체는 service(), doGet(), doPost() 같은 메소드에 *파라미터로 전달되어 사용하게 된다.
▷ HTTP 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
▷ 헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다.
▷ Body의 Stream을 읽어 들이는 메소드를 가지고 있다.
▷ WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있어, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달한다.
▷ 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송한다.
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);
}
}
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 태그 내부의 값들도 똑같이 파라미터로 넘어온다.
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
▷ ?를 기준으로 뒤에 있는 것들이 파라미터이다.
▷ &은 정보를 구분하는 기준점이다. 계속 사용해 더 많은 파라미터를 전달할 수가 있다.
▷ =를 기준으로 앞에 있는 건 파라미터 이름, 뒤에 있는 건 파라미터 값이다.