-
redirect, forward,spring 서두JAVA 2021. 7. 26. 12:41
1. "뷰이름" // Control => view 2. "redirect:/컨트롤이름.do" //현재 컨트롤은 아무 수행하지 않고 넘어감(request 에 set은 되나 마지막구문을 실행하지 않아 forward 는 하지 않음)
현재 컨트롤러에서 할 작업없이 다른 컨트롤러에게 갈 때 = response.sendRedirect 사용
Control(값X) => Control(값O) => ...=> view3. "forward:/컨트롤이름.do" //현재 컨트롤의 request에 set하고 다음컨트롤도 같은 request 에 set하여 두 작업이 한번에 forward 됨 현재 컨트롤러의 값을 저장하고 다른 컨트롤러한테 갈 때 = 다 저장 후 request 의 forward 사용
Control(값O) => Control(값O) => ...=> view
FrontController 셋팅
@WebServlet("*.do") public class FrontController extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. uri path 만 제거 String uri= request.getRequestURI(); String 요청작업DotDo=uri.substring(5);//"/mvc/"5글자 다음 인덱스인 6째부터(zero base면 5가 6번째임) while(true) { // 2. 요청작업 구하기 int lastIdx=요청작업DotDo.indexOf(".do");//".do" 시작인덱스 String 요청작업=요청작업DotDo.substring(0,lastIdx);//".do"문자열 제거 // 3. 요청과 컨트롤 객체 매핑 IControl control= ControlProvider.getControlProvider().getControl(요청작업); //해당 커트롤러 요청처리 ModelAndView 모델과지정된뷰명 = control.process(request, response); Set<Entry<String,Object> > entry들= 모델과지정된뷰명.model.entrySet(); for(Entry<String,Object> entry : entry들 ){ request.setAttribute(entry.getKey(), entry.getValue()); } // 4. 경로에 따른 제어 if(모델과지정된뷰명.viewName.contains("redirect:/")) { 요청작업DotDo = 모델과지정된뷰명.viewName.substring("redirect:/".length());//"redirect:/"문자열 제거 response.sendRedirect(요청작업DotDo); break;//이미 제어권이 넘어가므로 큰 의미는 없다. } if(모델과지정된뷰명.viewName.contains("forward:/")) { 요청작업DotDo = 모델과지정된뷰명.viewName.substring("forward:/".length());//"forward:/"문자열 제거 System.out.println(요청작업DotDo); continue;//요청작업 구하기부터 다시함 } // 5. view로 forward RequestDispatcher rd =request.getRequestDispatcher(ViewResolver.getJspViewName(모델과지정된뷰명.viewName)); rd.forward(request, response); break;//포워드시 이미 제어권이 넘어가므로 큰 의미는 없다. } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response ); } }
1. "컨트롤이름.do" : 1번 -> 3번 -> 5번 수행 2. "redirect:/컨트롤이름.do" : "컨트롤이름.do" 의 control 이 setViewName("forward:/또다른컨트롤") 로 지정했을 때 .
3번 -> 4번 실행후 -> 해당 메서드드와 servlet 종료. 그리고 또다른컨트롤이 다시 servlet에 들어와 메서드 사용
따라서 '컨트롤이름.do' 에서 작업한 내용은 하나도 넘어가지 않는다.
(request,response. 여기서는 ModelAndView 에 setting 한 내용들이 넘어가지 않는다.)3. "forward:/컨트롤이름.do" : "컨트롤이름.do" 의 control 이 setViewName("forward:/또다른컨트롤") 로 지정했을 때.
3번 -> 5번 실행후 -> 또 다른 컨트롤 2번부터 시작. -> 3번 -> 5번
즉 3번의 작업이 쌓여 request 안에는 두 컨트롤의 작업결과가 남으며 마지막인 5번의 view 에 다 넘어간다.예시는 2가지.
1) /mvc/add_member.do
2) /mvc/add_member.do?no=1&k=v
2)번의 경우는
/mvc/ add_member .do?no=1&k=v
3등분으로 나눠야 한다.
.do? 때문에 쿼리문이 나뉘어도 request 는 이미 받아놓은 상태다.
response.sendRedirect()
response.sendRedirect(); v.s forward(request, response); 다른 jsp에 다시 연결하는것은 공통점이지만 그냥 jsp 페이지를 바꾸는 sendRedirect() 와 달리 forward() 는 값을 넘기면서 jsp 페이지를 바꾼다.
spring 서두
1. 하나의 클래스안에 여러개 집어넣도록 도와준다
Controller = 클래스
Control = 함수(메서드)2. @ = 어노테이션 으로 Controller 이라고 설정하고 각 Control 마다 RequestMapping("요청명") 하여 요청에 맞춰 일하도록 한다. 3. 어노테이션 설정방법
@Controller : 컨트롤러로 선언
@RequestControl("요청명") :"요청명" 을 제어하는 Control 으로 선언'JAVA' 카테고리의 다른 글
UML: ClassDiagram,SequenceDiagram, Servlet:Filter (0) 2021.07.26 로그인아웃, session (0) 2021.07.26 JSP: FrontController 직접 구현해보기 (0) 2021.07.26 이미지업로드: inputStream,outputStream, cos.jar-MultipartRequest (0) 2021.07.25 ModelAndView (0) 2021.07.25