HttpServlet
HttpServlet을 상속하는 별도의 서블릿들을 정의하는데, 해당 클래스를 정의 할 때 HttpServlet 클래스를 상속해서 구현한다.
HttpServlet은 상위 클래스로 GenericServlet이라는 추상 클래스를 상속한다.
GenericServlet과 HttpServlet의 가장 큰 차이는 GenericServlet의 경우 HTTP 프로토콜에 특화 되지 않은 요청(Request)과 응답(Response)에 대한 기능을 정의하고 있다는 것이다.
GenericServlet은 HTTP가 아닌 요청과 응답을 의미하는 ServletRequest/ServletResponse라는 타입을 이용한다.
HttpServlet의 라이프사이클
서블릿은 기본적으로 요청(Request)을 처리해서 응답(Response)을 목적으로 설계되었다.
다만, 서블릿은 웹이라는 특수한 환경으로 인해 객체를 직접 생성하는 대신, 톰캣에서 객체들을 관리한다. => 서블릿 관점에서 톰캣은 서블릿 컨테이너로 볼 수 있다.
서블릿 클래스 처리 과정
위에서 중요한 점 2가지가 있는데, 하나는, 서블릿의 객체는 경로에 맞게 '하나만' 만들어 진다는 것이고, 두 번째는, 매번 호출 시에 자동으로 doGet()/doPost()를 이용해서 처리된다는 것이다.
HttpServletRequest의 주요 기능
서블릿 객체에서 최종적으로 요청(Request)을 처리하는 doGet()/doPost() 등은 HttpServletRequest와 HttpServletResponse를 파라미터로 전달받는다.
HttpServletRequest에서 가장 자주 사용하는 메소드 중 하나이다.
'?name=hwibin&who=ceo'과 같이 쿼리 스트링의 'name', 'who'라는 키(key)를 이용해 값(value)를 얻을 수 있다.
여기서 중요한 것은, getParameter()의 결과는 항상 String이라는 것이다! 문자열로 반환되기에 숫자 처리를 할 때는 예외가 발생할 수 있으므로 주의해야한다!
동일한 이름의 파라미터가 다수일 경우에 사용한다.
예를 들어, age라는 파라미터가 다수 존재한다면, getParameterValues()를 이용해 String[]타입으로 반환한다.
JSP로 전달할 데이터를 추가할 때 사용한다.
setAttribute()는 '키(ket)'와 '값(value)'의 형태로 데이터를 저장한다. 키(key)는 '문자열'로 지정하고, 값(value)은 모든 객체 타입 사용 가능하다.
웹 MVC 구조라면 HttpServletRequest의 getRequestDispatcher()를 이용해 RequestDispatcher 타입의 객체를 구할 수 있다.
RequestDispatcher는 현재의 요청을 다른 서버의 자원(서블릿 or JSP)에 전달할 때 사용한다.
1) forward() => 현재까지의 모든 응답(Response)을 무시하고, JSP가 작성하는 내용만을 브라우저에 전달
2) include() => 지금까지 만들어진 응답(Response)+JSP가 만든 내용을 브라우저로 전달
위 2개의 메소를 가지고 있다.
forward()와 include()가 있긴 하지만, 실제 개발에서는 거의 forward()만 사용한다.
HttpServletResponse의 주요 기능
HttpServletRequest가 '읽는' 기능을 제공한다면, HttpServletResponse는 '쓰는' 기능을 담당한다.
웹 MVC 구조에서 HttpServletResponse는 JSP에서 주로 처리된다. 따라서 서블릿 내에서 직접 사용되는 일은 많지 않고, 주로 sendRedirect()를 이용한다.
브라우저에 '이 곳으로 가라' 라는 응답(Response) 메시지를 전달한다.
senRedirect()를 이용하면 브라우저의 주소가 아예 변경되기 때문에 '새로고침' 요청을 방지할 수 있고, 특정 작업을 완전히 끝내고 새로운 흐름을 만들어낼 수 있다.