웹 브라우저에 URL을 입력하고 엔터를 입력하면 도메인과 포트 번호를 통해 서버에 접속한다. 그리고 나서 path 정보, 클라이언트 IP, 클라이언트의 다양한 정보를 포함한 요청 정보를 서버에 전송한다.
WAS는 웹 브라우저로부터 Servlet 요청을 받으면 요청할 때 가지고 있는 정보를 HttpServletRequest 객체를 생성하여 저장한다. 또한 웹 브라우저에게 응답을 보낼 때 사용하기 위해 HttpServletResponse 객체를 생성하고, 생성된 두 객체를 서블릿에 전달한다.
HttpServletRequest
HttpServletResponse
클라이언트가 서버에게 요청을 보낼 때 굉장히 많은 정보들을 함께 가지고 요청을 하게 된다. 아래의 예제들을 통해 들어오는 요청 정보에는 어떤 것들이 있는지 알아보자.
위에서 설명 했듯이 요청이 들어오면 모든 정보들은 WAS가 HttpServletRequest라는 객체를 만들어 담아둔다. 즉, doGet 메서드의 파라메터인 request 변수를 활용하여 원하는 정보들을 추출해 낼 수 있다.
request의 메서드 중 헤더의 이름들을 추출해 내는 getHeaderNames()를 통해 모든 헤더의 이름을 문자열 형태로 저장하고, 반복문을 통해 모든 헤더의 이름을 저장한 문자열을 탐색하며 헤더의 이름과 값을 저장 및 출력해 준다. 이 때 헤더의 이름을 알고 있으면 getHeader()를 통해 해당 헤더의 값을 구할 수 있다.
실행 결과 다음과 같은 화면을 볼 수 있다.
헤더의 정보들이 잘 출력된 것을 확인할 수 있다.
코드
package example;
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;
/**
* Servlet implementation class HeaderServlet
*/
@WebServlet("/header")
public class HeaderServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HeaderServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
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();
while(headerNames.hasMoreElements())
{
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
out.println(headerName + " : " + headerValue + "<br>");
}
out.println("</body>");
out.println("</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
예제 1과 마찬가지로 요청할 때 들어온 값을 활용하는데, 이 값들 중 파라메터를 활용할 것이다. request변수의 getParameter() 메서드를 활용할 수 있는데, 이때 파라메터의 이름을 사용하여 해당 파라메터의 값을 변수에 저장하는 것이다. 예제에서는 파라메터의 이름이 name과 age이다.
그냥 실행해 보면 다음과 같은 화면을 확인할 수 있다.
name과 age에 null값이 들어간 것을 볼 수 있다. 이는 URL을 확인해 보면 파라메터가 넘어가지 않았기 때문이다. URL을 통해 파라메터의 값을 넘겨주면 아래와 같은 화면을 확인할 수 있다.
이런 파라메터들은 반드시 URL을 통해서만 넘어오는 것이 아니라 form 태그의 input 태그를 활용하여 넘길 수도 있다.
코드
package example;
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;
/**
* Servlet implementation class ParameterServlet
*/
@WebServlet("/param")
public class ParameterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ParameterServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
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>");
out.println("</body>");
out.println("</html>");
}
}
request 객체를 활용하여 위의 예제들 뿐만 아니라 많은 다양한 정보들을 얻을 수 있다. request 객체는 클라이언트가 요청할 때 보내준 정보들을 모두 추상화해서 가지고 있기 때문이다.
출처 : 부스트코스 웹 프로그래밍(풀스택)
https://www.boostcourse.org/web316/lecture/254279