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