13.5.3. view로 redirect하기
이미 언급된것처럼, 컨트롤러는 대개 view결정자가 특정 view기술을 결정하는 논리적인 view명을 반환한다. Servlet/JSP 엔진을 통해 실질적으로 처리되는 JSP와 같은 view기술을 위해, 이것은 대개 Servlet API의 RequestDispatcher.forward() 나 RequestDispatcher.include()를 통해 내부 forward나 include를 이슈화하는것을 끝낼 InternalResourceViewResolver/InternalResourceView을 통해 다루어진다. Velocity, XSLT, 등등과 같은 다른 view기술을 위해, view자체는 응답 스트림에 컨텐츠를 생성한다.
때때로 view가 표현되기 전에 클라이언트로 HTTP redirect해서 돌아가는 것을 이슈화하는 것이 바람직하다. 이것은 하나의 컨트롤러가 POST된 데이터를 가지고 호출되고 응답이 다른 컨트롤러(폼서브밋으로부터 성공한 경우에)로 위임되었을때의 예제를 위해 바람직하다. 이 경우, 대개의 내부 forward는 다른 컨트롤러가 POST된 같은 데이터를 볼것이라는 것을 의미한다. 결과가 사용자가 폼 데이터의 이중 서브밋을 수행하는 것의 가능성을 제거할 것을 표시하기 전에 redirect하기 위한 다른 이유를 기대하는 것을 혼동할수 있다면 잠재적으로 문제의 소지가 있다. 브라우저는 초기 POST를 보낼것이다. 현재 페이지는 GET보다는 POST의 결과를 반영하지 않는다. 그래서 refresh를 통해 같은 데이터를 다시 POST할수 있는 방법은 없다. refresh는 결과페이지의 GET을 강제로 수행할뿐 아니라 초기 POST데이터를 다시 보내지는 않는다.
13.5.3.1. RedirectView
컨트롤러 응답의 결과처럼 redirect를 강제로 수행하기 위한 하나의 방법은 생성하기 위한 컨트롤러와 Spring RedirectView의 인스턴스를 반환하는 것이다. 이 경우, DispatcherServlet은 대개의 view결정 기법을 사용하지 않을것이지만 이미 주어진 view처럼 작동하기 위해 요청할것이다.
RedirectView는 HTTP redirect로 클라이언트 브라우저로 돌아갈 HttpServletResponse.sendRedirect()호 출을 이슈화하는것을 간단히 끝낸다. 모든 모델 속성은 HTTP쿼리 파라미터처럼 간단히 나타난다. 이것은 모델이 오직 문자열 형태 HTTP쿼리 파라미터로 변환될수 있는 객체만(대개 String이나 String으로 변환가능한)을 포함해야하는것을 의미한다.
만약 RedirectView을 사용하고 view가 컨트롤러 자체에 의해서 생성된다면, 최소한 redirect URL이 컨트롤러로 삽입되는것을 선호할것이다. 그래서 이것은 컨트롤러로 태울(baked into)뿐 아니라 view명과 함께 컨텍스트내 설정된다.
13.5.3.2. redirect: 접두사
RedirectView사용이 잘 작동하는 동안, 컨트롤러자체가 RedirectView를 생성한다면, 컨트롤러는 redirection이 발생하는것을 감지한다. 이것은 실제로 차선책이고 너무 타이트하게 커플링한다. 컨트롤러는 응답이 다루어지는 방법에 대해 다루지는 않을것이다. 이것은 대개 삽입되는 view명의 개념에서만 생각한다.
특수한 redirect: 접두사는 이것이 달성되도록 허용한다. 만약 view명이 접두사 redirect를 가지고 반환된다면, UrlBasedViewResolver(과 모든 하위클래스)는 redirect가 필요하다는것을 특별히 표시하는것처럼 이것을 인식할것이다. view명의 나머지는 redirect URL처럼 처리될것이다.
net 효과는 컨트롤러가 RedirectView를 반환하는 것과 같다. 하지만 컨트롤러 자체는 논리적인 view명의 개념에서 다루어진다. redirect:/my/response/controller.html과 같은 논리적인 view명은 현재 서블릿 컨텍스트에 상대적으로 redirect 될것이다. 반면에 redirect:http://myhost.com/some/arbitrary/path.html와 같은 이름은 절대경로의 URL로 redirect할것이다. 중요한 것은 redirect view명이 다른 논리적인 view명처럼 컨트롤러내로 삽입되는것이다. 컨트롤러는 redirection이 발생하는 것을 감지하지 않는다.
13.5.3.3. forward: 접두사
UrlBasedViewResolver와 하위클래스에 의해 해석될 view명을 위한 접두사인 특별한 forward:를 사용하는 것은 가능하다. 이 모든것은 URL을 고려하는 view명의 나머지에 InternalResourceView(궁극적으로는 RequestDispatcher.forward() 하는)를 생성한다. 그러므로, InternalResourceViewResolver/InternalResourceView를 사용할때 이 접두사를 결코 사용하지 않는다. 하지만 당신이 다른 view기술을 사용할때 잠재적으로 사용한다. 몇몇 경우 Servlet/JSP엔진에 의해 다루어지는 자원에 대해 발생하는 forward를 강요한다. 만약 당신이 많은 것을 할 필요가 있다면, 당신은 다중 view결정자를 묶을수 있다.
redirect: 접두사를 사용할때, 접두사를 가진 view명이 컨트롤러로 삽입된다면, 어떤 특별한 것을 감지하지 않는 컨트롤러는 응답을 다루는 개념에서 발생한다.
source : http://openframework.or.kr/framework_reference/spring/ver2.x/html/mvc.html#mvc-viewresolver
'Application Programing > java/jsp' 카테고리의 다른 글
Spring - ServletRequestUtils (0) | 2011.10.10 |
---|---|
java - ThreadLocal 클래스 (2) | 2011.04.12 |
JNDI (2) | 2011.04.05 |
Recent Comments