JAVA

redirect, forward,spring 서두

docc 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 으로 선언