728x90
반응형
Dispatcher Servlet
- 모든 요청을 맡아서 포워드 처리하는 포워드 전문 서블릿 (프론트 컨트롤러 디자인 패턴)
package chap06.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import chap06.process.GalleryProcess;
import chap06.process.HelloProcess;
import chap06.process.RequestProcess;
// 모든 요청을 맡아서 포워드 처리하는 포워드 전문 서블릿 (프론트 컨트롤러 디자인 패턴)
public class DispatcherServlet extends HttpServlet {
private Map<String, RequestProcess> processMapping = new HashMap<>();
@Override
public void init(ServletConfig config) throws ServletException {
// config에서 application scope를 꺼내 contextPath를 꺼냄
String contextPath = config.getServletContext().getContextPath();
// 어떤 주소 + 요청 방식으로 접속했을 때 어떤 처리를 할 것인지 등록
processMapping.put(contextPath + "/hello::GET", new HelloProcess());
processMapping.put(contextPath + "/gallery/index::GET" , new GalleryProcess());
}
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 1. 사용자의 요청을 받는다.
System.out.println("사용자가 요청한 URL: " + request.getRequestURL());
System.out.println("사용자가 요청한 URI: " + request.getRequestURI());
System.out.println("요청 방식: " + request.getMethod());
// 2. 요청 URI와 Method에 맞는 처리를 진행한다.
// -> url와 method로 알맞은 RequestProcess를 골라 process()를 실행시킨다.
// String nextPage = processMapping.get(request.getRequestURI() + "::" + request.getMethod())
// .process(request, response);
String nextPage = processMapping.get(request.getRequestURI() + "::" + request.getMethod())
.process(request, response);
// 3. 처리 후 알맞은 view 페이지로 포워드하거나 redirect한다.
if (nextPage.startsWith("redirect:")) {
response.sendRedirect(nextPage.substring("redirect:".length()));
} else {
// 포워드로는 WEB-INF 밑에 있는 페이지에 접근할 수 있다.
request.getRequestDispatcher("/WEB-INF/views" + nextPage + ".jsp")
.forward(request, response);
}
}
}
package chap06.process;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// http 요청에 대한 처리 인터페이스
public interface RequestProcess {
// 1. http 요청 처리는 request와 response를 받아 진행한다.
// 2. 모든 처리의 결과는 다음으로 가야할 forward 또는 redirect를 알 수 있다.
String process(HttpServletRequest request, HttpServletResponse response);
}
package chap06.process;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloProcess implements RequestProcess {
@Override
public String process(HttpServletRequest request, HttpServletResponse response) {
// 원하는 처리를 진행
System.out.println(request.getParameter("user") + "님이 접속하셨습니다.");
// 필요한 데이터가 있다면 여기에 실어서 view까지 보낼 수 있다.
// request.setAttribute("date", new Apple());
// 이 처리가 끝나고 다음으로 포워드 또는 리다이렉트 하고 싶은 곳
return "/hello";
}
}
728x90
반응형
'JAVA > JSP' 카테고리의 다른 글
[JSP] Cookie (0) | 2023.06.27 |
---|---|
[JSP] JSTL (0) | 2023.06.27 |
[JSP] XML (0) | 2023.06.23 |
[JSP] Context Path (0) | 2023.06.23 |
[JSP] Encoding (0) | 2023.06.23 |