@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name"); // name 에 해당하는 값을 가져옴 "?name=value 에서 value
request.setAttribute("name", name); // JSP에 전달할 데이터
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/hello.jsp");
dispatcher.forward(request, response); // JSP로 포워딩
}
}
HttpServlet을 상속받아야 한다.RequestDispatcher 은 인터페이스에 해당하는데 구현체는 Tomcat에서 알아서 주입해준다고 한다. (org.apache.catalina.core.ApplicationDispatcher 을 주입해준다)사실 여기부터가 포스팅의 이유라고 할 수 있는데, Dispatcher Servlet가 1개라고 해서 스프링에 서블릿이 1개인가? 라고 생각했는데 아니라고 한다. 강사님께서는 필터와 인터셉터에 대해서 생각해보라고 하셨고, 이에 대해 정리를 해보았다.
@WebFilter + @ServletComponentScan 을 사용하면 스프링 빈으로 등록할 수 있다 )OncePerRequestFilter 을 상속받게 해서 쉽게 빈으로 등록할 수 있다.HttpServletRequest와 HttpServletResponse 객체를 생성하고, 이를 Filter에 전달한다. Filter는 요청을 검사하여 문제가 없으면 FilterChain 을 통해 DispatcherServlet으로 전달하고, 문제가 있다면 응답을 직접 처리하고 요청 흐름을 차단한다.public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 다른 request와 response를 넣어줄 수 있음
chain.doFilter(request, response);
}}
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// Request, Response를 교체할 수 없고 boolean 값만 반환 가능
return true;
}}
개인적인 궁금증이었던 Filter, Interceptor 모두 서블릿인가? 에 대한 대답은 No인 듯 하다.. 2개 모두 Servlet을 보조해줄 뿐 Servlet 은 아니라는 생각이 들었다. 엄격히 말하자면 (서블릿은 HTTP 요청을 처리해 응답을 만드는 것이라는 개념만 보면) Filter 는 서블릿이라고 볼 수 있을 거 같다.
뭔가 찜찜한 마무리? 하지만 정리는 좋았죠?