2010-03-23 5 views
36

Spring MVC 애플리케이션에 RESTful URL을 구현하려고합니다. 양식 제출을 처리하는 것 외에는 모두 잘합니다. 다시 원래 형식으로 보내거나 "성공"페이지로 리디렉션해야합니다. 나는 Spring documentation에서 읽을 리디렉션 경우Spring MVC 컨트롤러가 응답 대신 URL 매개 변수를 사용하여 리디렉션합니다.

@Controller 
@RequestMapping("/form") 
public class MyController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String setupForm() { 
     // do my stuff 
     return "myform"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String processForm(ModelMap model) {    
     // process form data 

     model.addAttribute("notification", "Successfully did it!"); 
     return "redirect:/form"; 
    } 
} 

그러나, 매개 변수는 URL에 투입 될 것입니다. 그리고 그것은 저를 위해 작동하지 않습니다. 이 주변에서 가장 우아한 방법은 무엇입니까?

+0

달성하려는 리디렉션 URL은 무엇입니까? – skaffman

+0

정말 중요하지 않습니다. 게시물 데이터를 페이지로 처리 한 후 사용자가 제출 한 내용이 성공적으로 처리되었음을 사용자에게 알린 후 리디렉션 만하면됩니다. 이것이 일반적인 요청이라고 생각됩니다 http://jira.springframework.org/browse/SPR-1294. 그러나 잠시 동안 고정되지 않을 수도 있습니다. – predhme

+0

두 개의 관련 티켓에 설명 된 픽스 중 하나가 특정 문제를 해결할 수있는 것처럼 보이지 않습니다. 그 중 하나는 쿼리 속성으로 노출되는 모델 속성을 제어하는 ​​것입니다 (그러나 일부는 계속 노출 될 것임). 다른 하나는 추가 문제입니다. url 경로의 일부로 속성 (ID에 대해 매우 안락하지만 말하지만 여전히 성공 메시지를 전달할 장소는 제공하지 않음). –

답변

7

http://jira.springframework.org/browse/SPR-6464 일을 처리하는 데 필요한 정보 Spring MVC가 기능을 제공 할 때까지 (잠재적으로 3.0.2 릴리스에서). 나는 단순히 클래스를 구현했지만 일시적으로 필터를 내 웹 응용 프로그램 컨텍스트에 추가했습니다. 위대한 작품!

+1

업데이트와 마찬가지로,이 기능은 Spring 3에 예정되어 있습니다.1 – predhme

+2

실제로 스프링 3.1에서 구현되었다. – praseodym

+1

링크가 끊어졌습니다. –

8

processForm()은보기 개체를 대신 반환하고 setExposeModelAttributes()에 대한 매개 변수가있는 구체적인 유형 RedirectView을 반환하도록 할 수 있습니다.

당신이 "redirect:"로 시작 뷰 이름을 반환, 스프링 MVC는 그냥 (I가 기본값으로 홀수 값 생각) true로 setExposeModelAttributes으로 그렇게, 어쨌든 RedirectView 객체에이 변환합니다.

+0

성공 메시지가 쿼리 문자열로 표시되지 않으면 어떻게 리디렉션 된보기로 이동합니까? –

+0

그게 내가 궁금해 한 것. – predhme

+0

어떻게 성공 페이지로 가고 싶습니까? 리디렉션을 원할 경우 요청 매개 변수로 전달해야하거나 세션에서 설정하고 다음 페이지에서 제거 할 수있는 것처럼 보입니다. 그러나 어느 정도 통과해야합니다. –

4

URL에 성공 메시지를 표시하지 않으려면 하나의 옵션을 processForm 메소드의 세션에 넣은 다음 setupForm 메소드에서 확인하고 제거하십시오.

수정 사항 : 수동으로해야 할 고통이 있다면 "message"속성을 추가하고 세션에 삽입하는 과정을 래핑하는 RedirectView의 하위 클래스를 작성할 수 있습니다. 세션에서 메시지를 다시 가져 오는 쉬운 방법이 있다면 확실하지 ...

솔직히 말해서 나는 쉬운 대답이 없다고 생각합니다. HTTP 리디렉션의 본질은 그 상태가 아닙니다. 이월되었습니다. 어쨌든 상태를 유지하려면 웹 응용 프로그램에서 상태, 쿠키, 쿼리 문자열을 유지 관리하는 다양한 일반적인 방법을 고수해야합니다. ...

+0

확실하게 가능 합니다만, 제 어플리케이션이 단순한 것보다 훨씬 크기 때문에, 모든 단일 폼에 대해서 그렇게하는 것이 꽤 힘들어집니다. – predhme

+0

Struts는 ActionMessages라고하는 것을 제공하는 것 같습니다. 나는 그것이 무엇인지 완전히 확신하지 못한다. 또한 Ruby On Rails에서는 플래시 [: 알림]을 제공합니다. 근본적으로 내가 성취하려고 노력하는 것입니다. 플래시 메시지는 다음 작업 (리디렉션 또는 결과)까지 저장됩니다. http://www.jroller.com/raible/entry/migrating_from_struts_to_spring에서이 문제를 해결하려고 시도한 것으로 보입니다. 그의 길은 흥미로운 것 같습니다. – predhme

+0

글쎄, 나는 그의 접근 방식이 기본적으로 세션을 포장하고 내가 생각한 라인을 따라 세션에 메시지를 넣는 것처럼 보인다. 그러나 그는 실제 코드를 제공하므로 확실히 유용합니다. –

30

나는 동일한 문제가있었습니다.

return new ModelAndView("redirect:/user/list?success=true"); 

을 그리고 내 컨트롤러 방법은 다음과 같이 : 이런 식으로 해결

public ModelMap list(@RequestParam(required=false) boolean success) { 
    ModelMap mm = new ModelMap(); 
    mm.put(SEARCH_MODEL_KEY, campaignService.listAllCampaigns()); 
    if(success) 
     mm.put("successMessageKey", "campaign.form.msg.success"); 
    return mm; 
} 

작품 완벽하게 당신이 간단한 데이터를 전송하지 않으려면이 아닌 컬렉션의 말을 보자. 그렇다면 세션을 사용해야합니다.

9

이 문제는 모델 문자열이 쿼리 문자열에 유지되는 방식으로 발생합니다 (일반적으로 바람직하지 않으며 우스꽝스러운 쿼리 문자열을 생성 할 위험이 있습니다).내 평소 솔루션 대신 모델 속성을 노출하지 않도록 구성 할 수있는 만약 RedirectView을 사용, 스프링 MVC에서 리디렉션에 대한 문자열을 사용하지 않을 것입니다 (참조 : http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/RedirectView.html를)

RedirectView(String url, boolean contextRelative, boolean http10Compatible, boolean exposeModelAttributes) 

그래서 나는을하는 폴더의 유틸리티 메소드가하는 경향이 같은 '안전 리디렉션'

public static RedirectView safeRedirect(String url) { 
    RedirectView rv = new RedirectView(url); 
    rv.setExposeModelAttributes(false); 
    return rv; 
} 

다른 옵션은 빈 구성 XML 사용하는 것입니다, 다시

<bean id="myBean" class="org.springframework.web.servlet.view.RedirectView"> 
    <property name="exposeModelAttributes" value="false" /> 
    <property name="url" value="/myRedirect"/> 
</bean> 

을에이 그럴 수 추상적의 반복을 피하기 위해 자신의 클래스. SafeRedirectView).


'모델 지우기'에 대한 참고 사항 - 모든 상황에서 '모델을 노출하지 않음'과는 다릅니다. 한 사이트에서 모델에 항목을 추가 한 많은 필터가 있었는데, 이는 리디렉션 전에 모델을 지우면 긴 쿼리 문자열을 막지 못한다는 것을 의미했습니다. 또한 '모델 속성 노출 안 함'은 '리디렉션 전에 모델 지우기'보다 의미 론적 인 접근 방식이라고 제안합니다.

+0

RedirectView - 안전한 리디렉션이 효과적입니다. 감사합니다 MatCarey! –

3

이봐, 당신은 그것을 작동 희망 단지 대신 매개 변수를 사용 HttpServletRequest의 객체를 전송하는 모델을 사용하는 간단한 일을하고 parametrs이 URL을 헤더에 표시되지 않습니다 지금이

HttpServletRequest request; 
request.setAttribute("param", "value") 

을 수행 할 수 있습니다 :

0
@RequestMapping(path="/apps/add", method=RequestMethod.POST) 
public String addApps(String appUrl, Model model, final RedirectAttributes redirectAttrs) { 
    if (!validate(appUrl)) { 
     redirectAttrs.addFlashAttribute("error", "Validation failed"); 
    } 
    return "redirect:/apps/add" 
} 

@RequestMapping(path="/apps/add", method=RequestMethod.GET) 
public String addAppss(Model model) { 
    String error = model.asMap().get("error"); 
} 
관련 문제