2010-04-24 55 views

回答

16

正如muanis提到的,自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文件,以使用相關的屬性

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

如何獲得** messageSource **在控制器中的保留? – ManuPK 2012-04-06 11:00:38

+0

// Autowire messageSource。修改原始答案以反映此更改。 @Autowired private MessageSource messageSource; – krishnakumarp 2012-04-06 11:21:41

+1

我通常不會在控制器中呈現Flash消息,而只是將消息代碼存儲在Flash上​​下文中。然後,在渲染閃光消息的視圖中完成對國際化消息的解析。 – 2013-01-15 16:57:09

0

您應該保持簡單並使用特定的HTTP 1.1狀態代碼。因此,對於成功的通話,您將返回200 OK。而在客戶端,如果您想在控制器返回200時向用戶顯示特定的消息,那麼您在那裏顯示它。

+0

但是,如果我想顯示不同的信息取決於上下文,我怎麼會知道應該表現出什麼樣的信息,如果我只有200 OK消息? – olegflo 2010-05-02 15:45:02

+0

問題是,只有狀態正常時才返回200。如果沒有發現什麼東西返回404,如果服務器錯誤返回500,如果未經授權返回403。 – 2010-05-03 15:14:14

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的建議,使用@ResponseBody的狀態對象返回到您的JS。在標記爲@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

伴隨着適當的狀態代碼,你總是可以設置你想要的特定郵件的標題。當然,如果您可以控制控制器的使用方式(即沒有第三方),那麼這真的只是一個好主意。

8

一個經過驗證的方法是使用特殊的Flash範圍消息,應該保留到下一個GET請求。

我喜歡使用一個會話範圍的Flash對象:

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 ou迭代閃存消息:

<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的答案作爲我的首選答案。 – 2012-09-18 12:48:51

1

經過一段時間我的頭撞過頭後,我終於做到了。

我使用的是spring 3.1,它支持通過重定向傳遞的requestFlashAttributes。

解決我的問題的關鍵是將返回類型更改爲字符串而不是ModelAndView對象。

這個人作出了一個極好交有關使用閃光燈消息來與彈簧(http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31)

+0

上面的鏈接被破壞,新的鏈接是http://www.tikalk.com/redirectattributes-new-feature-spring-mvc-31/ – Stifler 2014-11-28 05:55:31

相關問題