Cách tốt nhất để đạt được các thông báo flash giống như Rails như "Cập nhật thành công" http://api.rubyonrails.org/classes/ActionController/Flash.html) trong thế giới Java? Tôi đang sử dụng Spring MVC.Tin nhắn flash đường ray trong Java
Trả lời
Tôi khuyên bạn nên triển khai tính năng này dưới dạng HashTable toàn phiên, với ánh xạ khóa chuỗi cho các đối tượng FlashItem tùy chỉnh. FlashItem sẽ đơn giản chứa đối tượng hoặc chuỗi bạn đang lưu trữ cộng với một giá trị boolean, có thể được gọi là IsNew, nên được đặt thành true khi bạn chèn một mục mới vào HashTable.
Trên mỗi trang tải bạn sau đó lặp lại HashTable, đặt bất kỳ IsNew = mục đúng thành sai và xóa bất kỳ mục nào mà IsNew đã sai. Điều đó sẽ giúp bạn làm việc giống với tính năng flash của Rails.
Nếu bạn chưa đầu tư một lượng lớn công việc vào ứng dụng java mùa xuân của mình, bạn có thể xem các đường ray đang chạy trên jruby. Vẻ đẹp của chạy jRuby trên Rails là bạn có thể trộn và kết hợp đá quý ruby và libs java.
Nếu bạn đã đặt một lượng công việc hợp lý vào ứng dụng của mình thì điều này càng có nhiều khả năng không phải là một tùy chọn.
Tôi đã làm điều đó trong Spring MVC với phiên phạm vi đậu.
public class FlashImpl implements Flash, Serializable{
private static final long serialVersionUID = 1L;
private static final String ERROR = "error";
private static final String WARNING = "warning";
private static final String NOTICE = "notice";
private String message;
private String klass;
public void message(String klass, String message) {
this.klass = klass;
this.message = message;
}
public void notice(String message) {
this.message(NOTICE, message);
}
public void warning(String message) {
this.message(WARNING, message);
}
public void error(String message) {
this.message(ERROR, message);
}
public boolean isEmptyMessage() {
return message == null;
}
public void clear() {
this.message = null;
this.klass = null;
}
public String getMessage() {
String msg = message;
this.clear();
return msg;
}
public void setMessage(String message) {
this.message = message;
}
public String getKlass() {
return klass;
}
public void setKlass(String klass) {
this.klass = klass;
}}
Bí quyết là tiêu thụ thư khi thư được đọc lần đầu tiên. Bằng cách này, nó có thể tồn tại để chuyển hướng sau bài đăng.
Tôi giả định rằng sẽ chỉ có một loại thông báo cho yêu cầu. Nếu bạn không muốn điều này, bạn có thể tạo một hashmap như đã được đề xuất.
Tôi tiêm hạt này vào bộ điều khiển của mình (thực ra tôi bơm nó vào bộ điều khiển cơ sở được thừa kế bởi tất cả các bộ điều khiển khác).
Trong JSP của bạn, bạn cần phải thêm một số mã như thế này:
<c:if test="${!flash.emptyMessage}" >
<div class="${flash.klass}">${fn:escapeXml(flash.message)}</div>
</c:if>
Tôi đã sử dụng ví dụ Manolo Santos' với với Spring MVC như sau:
Annotate lớp Flash với @Component, và thêm một biến boolean để cho biết liệu thông báo có còn sống cho một yêu cầu nữa không.
@Component public class Flash { private static final String INFO = "info"; private static final String SUCCESS = "success"; private static final String ERROR = "error"; private static final String WARNING = "warning"; private static final String NOTICE = "notice"; private final Map msgs = new HashMap(); private boolean isKept; // keep msg for one more request (when the controller method redirects to another) private void message(String severity, String message) { msgs.put(message, severity); } public void info(String message) { this.message(INFO, message); } public void success(String message) { this.message(SUCCESS, message); } public void notice(String message) { this.message(NOTICE, message); } public void warning(String message) { this.message(WARNING, message); } public void error(String message) { this.message(ERROR, message); } public boolean isEmptyMessage() { return msgs.isEmpty(); } public void clear() { msgs.clear(); isKept = false; } public Map getMessage() { return msgs; } public boolean isKept() { return isKept; } public void keep() { isKept = true; } public void unKeep() { isKept = false; } }
Sử dụng trình chặn để thêm thông điệp flash vào đối tượng mô hình.
public class FlashMessageInterceptor extends HandlerInterceptorAdapter { @Resource Flash flash; @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if (!flash.isKept()) { modelAndView.addObject("flash", flash); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { if (flash.isKept()) { flash.unKeep(); } else { flash.clear(); } } }
Trong bộ điều khiển, nếu bạn có phương pháp chuyển hướng sang phương pháp khác bạn có thể nói; flush.keep(), để hiển thị thông báo flash.
@Controller public class ComputerCampLove { @Resource private Flash flash; @RequestMapping(method = RequestMethod.GET) public String takeMeToAnotherPlace(Model model) { flash.info("Fa-fa-fa!"); flash.keep(); return "redirect:somewhere"; } }
này đã được thêm vào Spring MVC 3.1.RC1:
3.1.15 Flash Attributes and RedirectAttributes
flash thuộc tính bây giờ có thể được lưu trữ trong một FlashMap và lưu trong phiên HTTP để tồn tại một chuyển hướng. Để biết tổng quan về hỗ trợ chung cho thuộc tính flash trong Spring MVC, hãy xem Section 16.6, “Using flash attributes”.
Trong bộ điều khiển chú thích, phương thức @RequestMapping có thể thêm thuộc tính flash bằng cách khai báo đối số phương thức thuộc loại RedirectAttributes. Đối số phương thức này giờ đây có thể được sử dụng để kiểm soát chính xác các thuộc tính được sử dụng trong kịch bản chuyển hướng. Xem Section 16.3.3.10, “Specifying redirect and flash attributes” để biết thêm chi tiết.
(JIRA vấn đề: SPR-6464)
- 1. BackboneJS Tin nhắn flash
- 2. thực hiện tin nhắn tức thời cho đường ray?
- 3. đường ray: ngăn thông báo flash hiển thị hai lần
- 4. Tin nhắn của Flash trong Partials (Rails 3)
- 5. Tin nhắn Java tới Erlang
- 6. Thông báo flash với redirect_to bị hỏng trong đường ray
- 7. Hiệu ứng mờ dần của tin nhắn flash
- 8. Các tin nhắn flash được lưu ở đâu?
- 9. Rails trang bộ nhớ đệm và tin nhắn flash
- 10. Rails Vô hiệu hóa phát tin nhắn flash
- 11. Đường ray, mất đèn flash sau khi chuyển hướng_to
- 12. Định dạng lỗi.full_messages trong đường ray 3
- 13. Tin nhắn flash trong Rails được chuyển sang trang tiếp theo
- 14. Nhắn tin nhẹ (lời gọi không đồng bộ) trong Java
- 15. Java đường dẫn tập tin trong Linux
- 16. làm thế nào để thay đổi đèn flash của devise [: thông báo] trong đường ray
- 17. nhắn Flash trong chuyển hướng không làm việc
- 18. Gửi tin nhắn đến một trò chơi Flash với C# và AutoIt
- 19. Devise/Rails - Cách xóa một tin nhắn flash cụ thể? (Đã đăng nhập thành công)
- 20. Ruby on Rails: tại sao tôi nhận được tin nhắn cho javascript và css sau khi đường ray s?
- 21. f.hidden_field trong đường ray 3.2
- 22. Đọc Tin nhắn Protobuf trong C#
- 23. # TODO trong đường ray
- 24. Có thể thêm liên kết vào tin nhắn flash khi được xác nhận không?
- 25. Kiểm tra chức năng cho tin nhắn flash sau khi chuyển hướng
- 26. Gửi tin nhắn SMS/Tin nhắn văn bản qua PHP
- 27. tùy chỉnh máy nhắn tin trong psql
- 28. Kích thước tin nhắn JMS
- 29. Hiển thị tin nhắn flash mà không cần chuyển hướng (ví dụ như chuyển tiếp). Tin nhắn được hiển thị hai lần
- 30. Đường ray lưu trữ thông tin tổng hợp
Đáng tiếc là tôi khá cam kết mùa xuân. – wachunga