2010-02-01 24 views
5

Vì vậy, tôi đã đọc another question trong thẻ Wicket so sánh Apache WicketApache Click. Một lời giải thích ngắn gọn, theo ý kiến ​​của tôi. Tôi quen thuộc hơn với thế giới Wicket hơn thế giới Click.Các trang/yêu cầu không quốc tịch của Apache Wicket

Một trong những nhận xét tôi đọc là bạn có thể tạo trang Wicket không quốc tịch. Tôi bắt đầu nghĩ về điều này và không thể tìm ra cách để đưa ra yêu cầu hoặc yêu cầu trang cho một cái gì đó không quốc tịch. Điều này chắc chắn có thể có ích trong một số trường hợp. Vì vậy, làm thế nào để bắt đầu sử dụng Wicket mà không có nhà nước?

+0

http://stackoverflow.com/a/3441584/176897 – tetsuo

+0

Liên kết trên không hoạt động, hãy thử cách này: https://cwiki.apache.org/confluence/display/WICKET/Stateless+pages – snorbi

Trả lời

8

Nếu một trang có thể đánh dấu trang và không chứa bất kỳ hành vi/thành phần phi trạng thái nào thì trang đó sẽ tự động không trạng thái và không được lưu trữ trong phiên. Tôi nghĩ rằng miễn là người dùng chỉ truy cập các trang không trạng thái, một phiên sẽ không được tạo. Đối với hầu hết các phần, nếu tất cả mọi thứ về cách trang được hiển thị có thể được xác định chỉ từ một constructor no-args hoặc một constructor tham gia một đối số PageParameters. Các lớp Liên kết và Biểu mẫu bình thường không phải là không trạng thái, vì vậy bạn sẽ cần sử dụng StatelessForm và StatelessLink thay thế.

+0

Cảm ơn Geoff. Bây giờ sự tồn tại của những thành phần không trạng thái… cũng có ý nghĩa. – Matt

16

Wicket không có trạng thái theo mặc định và chuyển sang chế độ trạng thái khi cần. Nó rất dễ dàng để phá vỡ chế độ không trạng thái.

Tôi thấy hữu ích khi chú thích các trang không quốc tịch và các thành phần không quốc tịch với @StatelessComponent, được tìm thấy trong dự án wicket-devutils. Sau đó tôi thêm một StatelessChecker trong phương pháp WebApplication.init() của tôi như thế này:

protected void init(){ 
    ... 
    this.addPostComponentOnBeforeRenderListener(new StatelessChecker()); 
    ... 
} 

Bằng cách này tôi luôn có được một ngoại lệ về thành phần stateful vi phạm.

3

Nếu bạn có các trang bạn cố tình muốn đảm bảo là không quốc gia, phương pháp setStatelessHint(boolean state) hữu ích.

Cảnh báo sẽ xuất hiện nếu trang không có quốc tịch.

để biết thêm thông tin xem tại đây: Wicket Stateless pages

4

tôi thích để kiểm tra xem trong thử nghiệm.

nên mỗi bài kiểm tra cho trang stateless đè

getStatelessWebPage() 

mà theo mặc định trở thành vô giá trị.

sau đó trong thử nghiệm cơ bản tôi có kiểm tra tổng quát mà thăm tất cả các thành phần trên trang và kiểm tra xem thành phần là quốc tịch hay không

@Test 
public void checkForStateless() 
{ 
    StatelessWebPage statelessPage = getStatelessWebPage(); 
    if (statelessPage != null) 
    { 
     Page page = (Page)statelessPage; 
     if (!page.isPageStateless()) 
     { 
      //find the reason 
      Component statefulComponent = page.visitChildren(Component.class, new StatelessChecker()); 
      if (statefulComponent != null) 
      { 
       fail("Stateless page contains stateful component [" 
        +statefulComponent.getClass().getName()+" : " 
        + statefulComponent.getMarkupId() +"]"); 
      } 
     } 
    } 
} 

class StatelessChecker implements IVisitor<Component, Component> 
{ 
    @Override 
    public void component(Component component, IVisit<Component> iVisit) 
    { 
     if (!component.isStateless()) 
     { 
      iVisit.stop(component); 
     } 
    } 
} 
0

gì về tình hình nơi trang có thể được không trạng thái hoặc trạng thái tùy thuộc vào việc người dùng có tự động xác nhận không?

Một ví dụ có thể là điển hình 'tài khoản' bảng mà nằm ở phía trên cùng của hầu hết các trang web cho thấy hiện đang đăng nhập vào tên người dùng, liên kết hồ sơ vv

Hầu hết các trang trên trang web sẽ có điều này tại trên cùng có nghĩa là cả hai trang phải có cả trạng thái và trạng thái không phụ thuộc vào việc người dùng đã đăng nhập hay chưa.

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