ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • redirect, forward,spring 서두
    JAVA 2021. 7. 26. 12:41
    1. "뷰이름" // Control => view
    2. "redirect:/컨트롤이름.do" //현재 컨트롤은 아무 수행하지 않고 넘어감(request 에 set은 되나 마지막구문을 실행하지 않아 forward 는 하지 않음)
    현재 컨트롤러에서 할 작업없이 다른 컨트롤러에게 갈 때 = response.sendRedirect 사용
    Control(값X) => Control(값O) => ...=> view
    3. "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 으로 선언

     

    댓글

Designed by Tistory.