2011-03-08 1 views
13

내가 사용하는 제 1 사용자를 제출 형태와 마지막 이름이 POST signin.htmlSpring MVC에서 Post/Redirect/Get 패턴 요청간에 데이터를 전달하는 방법은 무엇입니까?

@RequestMapping(value="/signin.html",method = RequestMethod.POST) 
public ModelAndView submit(@Valid User user){ 
    ModelAndView mv = new ModelAndView("redirect:signin.html"); 
    //Business logic with user account 
    return mv; 
} 

더블 해결 내가 GET 요청을 사용하여 동일한 매핑로 리디렉션하고있어 문제를 제출하기 위해.

@RequestMapping(value="/signin.html",method = RequestMethod.GET) 
public ModelAndView submitPRG(){ 
    ModelAndView mv = new ModelAndView("submitted"); 
    mv.addObject("message", "Submitted Correctly"); 
    return mv; 
} 

이 방식으로 두 가지 문제를 해결할 수 있습니다.

내가 몇 가지 질문이 있습니다

1) 나는 그 리디렉션에서 오는 /signin.html에 요청을 GET 알 수 및 브라우저에서 사용자가 요청하지 않은 방법? 나는 단지 사용자가 http://server/signin.html을 검색하고 "제출 완료"메시지를 받기위한 옵션을 닫고 싶습니다. 나는 /signin.html?submitted=true와 같은 것을 추가 할 수 있지만 더 깨끗하게하고 싶습니다.

2) ModelAndView 개체를 submit()에서 submitPRG()으로 전달할 수있는 방법은 무엇입니까?

또는이 경우 PRG를 사용하는 다른 방법이 있습니까?

답변

4

어떻게 그 리디렉션에서오고 가 브라우저에서 사용자가 요청하지 않은 /signin.html 에 요청을 GET 알 수 있습니까?

  • 당신은
  • 는 HTTP 헤더에 리퍼러에서 봐 자신의 세션에서 마커를 저장할 수

나는 "제출에 대한 세션 기반 메시징의 일종을 사용하는 것이 좋습니다 정확하게 "메시지. 이것은 때로는 "플래시"라고합니다. StackExchange는이 모든 것을 사용합니다 (화면 상단에 나타나는 메시지).

미리 감사드립니다. 어떻게해야합니까? HttpServletRequest에서 리퍼러를 가져올 수 있습니까?

HttpServletRequest.getHeader("Referer") 
+1

미리 감사드립니다. 그러나 HttpServletRequest에서 리퍼러를 얻으려면 어떻게해야합니까? –

17

원하는 동작을 "플래시 범위"라고합니다. 일반적으로 세션에서 리디렉션 한 후 표시 할 메시지를 저장하여 구현됩니다.

스프링 팀은 스프링 3.1 (SPR-6464)에서이를 구현할 것을 약속합니다. 그 사이에 mvc-showcase 샘플의 플래시 범위 구현을 살펴볼 수 있습니다. 매우 쉽기 때문에 직접 수행 할 수 있습니다.

대체 방법은 URL 리디렉션 매개 변수로 필요한 데이터를 추가하는 것입니다. 제출 메소드가 나중에 어떤 식별자로 액세스 할 수 있도록 모델 객체를 저장하면 해당 객체를 표시하는 페이지 (예 : /signin.html 대신 /users.html?userId=...)로 리디렉션하고 해당 "제출 완료 메시지"를 표시하는 것이 좋습니다 페이지를 플래시 범위에서.

따라서 플래시 범위는 일반적으로 모델 개체가 아닌 메시지를 전달하는 데 사용됩니다.

+2

당신은 시간적 일관성이 엄격하게 보장되지 않는, 그러나 플래시를 사용하여 조금 조심해야합니다.스프링 문서에서 : http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes 그것은 문제가되지 않지만 적어도 뭔가 알고 있어야합니다. – sanimalp

관련 문제