2009-04-07 36 views

Trả lời

5

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.

0

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.

+3

Đáng tiếc là tôi khá cam kết mùa xuân. – wachunga

6

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> 
2

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"; 
    } 
} 
4

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)

+0

Nghiêm túc, nhưng đó là cách để muộn! – momomo

+0

Tuyệt vời! Điều này giải quyết được các vấn đề của tôi được mô tả ở đây: http://stackoverflow.com/questions/11216550/how-should-i-send-resourcebundle-messages-across-controllers-in-spring-mvc – Tommy

Các vấn đề liên quan