使用註釋控制器在基於Spring MVC的站點上組織狀態消息(「您的數據已成功保存/添加/刪除」)的最佳方式是什麼?基於Spring MVC的站點(註釋控制器)上的狀態消息
所以,問題在於在控制器中從POST方法發送消息。
使用註釋控制器在基於Spring MVC的站點上組織狀態消息(「您的數據已成功保存/添加/刪除」)的最佳方式是什麼?基於Spring MVC的站點(註釋控制器)上的狀態消息
所以,問題在於在控制器中從POST方法發送消息。
正如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>
您應該保持簡單並使用特定的HTTP 1.1狀態代碼。因此,對於成功的通話,您將返回200 OK。而在客戶端,如果您想在控制器返回200時向用戶顯示特定的消息,那麼您在那裏顯示它。
但是,如果我想顯示不同的信息取決於上下文,我怎麼會知道應該表現出什麼樣的信息,如果我只有200 OK消息? – olegflo 2010-05-02 15:45:02
問題是,只有狀態正常時才返回200。如果沒有發現什麼東西返回404,如果服務器錯誤返回500,如果未經授權返回403。 – 2010-05-03 15:14:14
如果您的意思是頁面在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。
在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 ...
伴隨着適當的狀態代碼,你總是可以設置你想要的特定郵件的標題。當然,如果您可以控制控制器的使用方式(即沒有第三方),那麼這真的只是一個好主意。
一個經過驗證的方法是使用特殊的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>
我希望這可以幫助你。
現在Spring 3.1終於GA了,我推薦krishnakumarp的答案作爲我的首選答案。 – 2012-09-18 12:48:51
經過一段時間我的頭撞過頭後,我終於做到了。
我使用的是spring 3.1,它支持通過重定向傳遞的requestFlashAttributes。
解決我的問題的關鍵是將返回類型更改爲字符串而不是ModelAndView對象。
這個人作出了一個極好交有關使用閃光燈消息來與彈簧(http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31)
上面的鏈接被破壞,新的鏈接是http://www.tikalk.com/redirectattributes-new-feature-spring-mvc-31/ – Stifler 2014-11-28 05:55:31
如何獲得** messageSource **在控制器中的保留? – ManuPK 2012-04-06 11:00:38
// Autowire messageSource。修改原始答案以反映此更改。 @Autowired private MessageSource messageSource; – krishnakumarp 2012-04-06 11:21:41
我通常不會在控制器中呈現Flash消息,而只是將消息代碼存儲在Flash上下文中。然後,在渲染閃光消息的視圖中完成對國際化消息的解析。 – 2013-01-15 16:57:09