2010-04-24 1 views

답변

16

플래쉬 메시지를 사용하는 방법에 대한 우수한 포스트했다 Spring 3.1부터 RedirectAttributes를 사용하는 것이 가장 좋습니다. 블로그에 제공된 샘플에 i18n을 추가했습니다. 그래서 이것은 완전한 샘플이 될 것입니다.

@RequestMapping("/users") 
@Controller 
public class UsersController { 

      @Autowired 
      private MessageSource messageSource; 

      @RequestMapping(method = RequestMethod.POST, produces = "text/html") 
      public String create(@Valid User user, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest, Locale locale, RedirectAttributes redirectAttributes) { 
       ... 
       ... 
       redirectAttributes.addFlashAttribute("SUCCESS_MESSAGE", messageSource.getMessage("label_user_saved_successfully", new String[] {user.getUserId()}, locale)); 
       return "redirect:/users/" + encodeUrlPathSegment("" + user.getId(), httpServletRequest); 
      } 
    ... 
    ... 
} 

메시지 묶음에 적절한 메시지를 추가합니다 (예 : messages.properties).

label_user_saved_successfully=Successfully saved user: {0} 

을 편집하여 jspx 파일은 어떻게 난 단지 200 OK 메시지가있는 경우에 표시해야합니다 어떤 메시지를 알 수 관련 속성을

<c:if test="${SUCCESS_MESSAGE != null}"> 
    <div id="status_message">${SUCCESS_MESSAGE}</div> 
</c:if> 
+0

컨트롤러에서 ** messageSource ** 보류를 얻으려면 어떻게해야합니까? – ManuPK

+0

// Autowire messageSource. 이 변경 사항을 반영하도록 원래 응답이 수정되었습니다. @Autowired 비공개 MessageSource messageSource; – krishnakumarp

+1

나는 보통 컨트롤러에서 플래쉬 메시지를 렌더링하지 않고 단순히 플래시 컨텍스트에서 메시지 코드를 저장한다. 그런 다음 플래시 메시지를 렌더링하는보기에서 i18n'ed 메시지에 대한 해상도가 수행됩니다. –

0

단순하게 유지하고 특정 HTTP 1.1 상태 코드를 사용해야합니다. 따라서 성공적인 전화를 받으려면 200 OK를 반환합니다. 그리고 클라이언트 측에서는 컨트롤러가 200을 반환 할 때 사용자에게 특정 메시지를 보여주고 싶다면 거기에 보여줍니다.

+0

를 사용하지만 서로 다른 메시지를 표시 할 경우 상황에 따라 달라 하는가? – olegflo

+0

중요한 것은 상태가 정상인 경우에만 200을 반환한다는 것입니다. 무언가 발견되지 않으면 서버 오류가 500을 반환하면 무단으로 반환합니다. 403. –

0

일부 POST 후에 페이지가 다시로드된다는 것을 의미하는 경우보기에 플래그를 포함시킬 수 있습니다 (JSP 또는 속도 또는 사용하는 모든 것). 예 : 이

<c:if test="${not empty resultMessage}"> 
<spring:message code="${resultMessage}" /> 
</c:if> 

그리고 당신의 메시지 번들 같은 그 코드에 대한 메시지를 포함해야합니다. 당신이 AJAX POST 일부 데이터를 제출 할 (즉, 페이지를 다시로드하지 않고 당신이 메시지를 표시해야합니다) 경우

당신은

1)를 사용하면 JS 동적 (JSP 또는 속도, 다시) 및 삽입 파일을 만들 수 있습니다 이 <spring:message> 태그 (정말이 옵션을 좋아하지 않는다)

또는

2

) this link의 조언을 따라하고 JS에 상태 개체를 반환 @ResponseBody를 사용합니다. 객체 내부에 @ResponseBody으로 표시하면 상태와 메시지를 둘 다 넣을 수 있습니다. 예 : 메시지 번들을 this case처럼 사용하십시오.

0

JSP에 메시지를 표시하는 가장 간단한 방법은 표시 할 메시지가 포함 된 범위 지정 (어쩌면 세션, 어쩌면 요청) 대상을 갖는 것입니다. 예를 들어 다음을 할 수 있습니다.

... java stuff ... 
List messages = new ArrayList(); 
messages.add("some message"); 
messages.add("some other message"); 
request.addAttribute("NotableMessages", messages); 
... java stuff ... 

... jsp and JSTL stuff ... 
<c:if test="not empty NotableMessages"> 
<ul> 
<c:forEach items="${NotableMessages}" var="item"> 
<li>${item}</li> 
</c:forEach> 
</ul> 
</c:if> 
... jsp stuff ... 
0

적절한 상태 코드와 함께 원하는 특정 메시지가있는 머리글을 설정할 수 있습니다. 물론 컨트롤러를 사용하는 방법 (예 : 제 3 자 없음)을 제어 할 수 있다면이 방법이 실제로 좋은 아이디어입니다.

8

입증 된 접근법은 다음 GET 요청까지 유지되어야하는 메시지에 특별한 플래시 범위를 사용하는 것입니다.

public interface Flash { 
    void info(String message, Serializable... arguments); 
    void error(String message, Serializable... arguments); 
    Map<String, MessageSourceResolvable> getMessages(); 
    void reset(); 
} 

@Component("flash") 
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES) 
public class FlashImpl implements Flash { 
    ... 
} 

특별한 MVC 인터셉터가 플래시 개체에서 플래시 값을 읽고 요청 범위에 배치됩니다 : 이제

public class FlashInterceptor implements WebRequestInterceptor { 
    @Autowired 
    private Flash flash; 

    @Override 
    public void preHandle(WebRequest request) { 
     final Map<String, ?> messages = flash.getMessages(); 
     request.setAttribute("flash", messages, RequestAttributes.SCOPE_REQUEST); 

     for (Map.Entry<String, ?> entry : messages.entrySet()) { 
      final String key = "flash" + entry.getKey(); 
      request.setAttribute(key, entry.getValue(), RequestAttributes.SCOPE_REQUEST); 
     } 

     flash.reset(); 
    } 

    ... 
} 

내가 세션을 사용하려면

플래시 객체를 범위 컨트롤러에 간단히 "플래시 범위"에 메시지를 배치 할 수 있습니다 :

@Conteroller 
public class ... { 
    @Autowired 
    private Flash flash; 

    @RequestMapping(...) 
    public void doSomething(...) { 
     // do some stuff... 
     flash.info("your.message.key", arg0, arg1, ...); 
    } 
} 

를보기 y를에서 플래시 메시지를 반복합니다.

<c:forEach var="entry" items="${flash}"> 
    <div class="flash" id="flash-${entry.key}"> 
     <spring:message message="${entry.value}" /> 
    </div> 
</c:forEach> 

이 정보가 도움이되기를 바랍니다.

+1

이제 Spring 3.1이 GA가되었으므로 krishnakumarp의 대답을 내 것보다 선호하는 것으로 승격합니다. –

1

잠시 동안 머리를 두드리는 소리가 들린 후 마침내 작동하게 만들었습니다.

스프링 3.1을 사용하고 있으며 리디렉션을 통해 전달되는 requestFlashAttributes를 지원합니다.

내 문제를 해결하기위한 열쇠는 반환 유형을 ModelAndView 객체가 아닌 문자열로 변경하는 것이 었습니다.

이 사람은 muanis 언급 된 바와 같이 스프링 (http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31)

+0

위 링크가 깨졌습니다. 새 링크는 http://www.tikalk.com/redirectattributes-new-feature-spring-mvc-31/ – Stifler

관련 문제