2010-08-07 27 views
13

Tôi đã làm việc với Wicket trong một hoặc hai tháng nay, làm cho các ứng dụng web đơn giản với nó và làm quen với các mô hình và vân vân. Bây giờ tôi muốn tiến lên phía trước và xem liệu tôi có thể đưa những gì tôi đã học được cho đến nay để sử dụng và tạo ra một ứng dụng web trung bình/lớn. Tuy nhiên, tôi đã không dành nhiều thời gian suy nghĩ về làm thế nào để làm cho các trang không trạng thái.Có khó khăn khi thực hiện một ứng dụng web chủ yếu là không quốc tịch với Wicket không?

Nếu tôi hiểu chính xác, làm cho trang không có quốc tịch đạt được bằng cách đặt trang có thể đánh dấu trang và đảm bảo rằng không có thành phần nào được thêm vào trang.

Đối với trang web tôi đang thực hiện, tôi muốn tránh thông báo "Đã hết hạn", cho phép người dùng đăng nhập qua cookie, tạo toàn bộ nội dung có sẵn mà không cần đăng nhập/tạo phiên và tôi muốn có chức năng như vậy khi phân trang thành quốc gia và có thể đánh dấu trang.

Điều này không có vấn đề gì với ví dụ: PHP, nhưng có vẻ như với tôi rằng toàn bộ rất nhiều thành phần Wicket hữu ích đều có trạng thái. Tôi có cho rất nhiều công việc, chẳng hạn như tạo ra các bộ thành phần riêng của tôi không có quốc tịch hay không phải là việc lớn?

Tôi hy vọng ai đó có thể giúp tôi bằng cách chỉ cho tôi đúng hướng.

EDIT: Cho phép nói rằng tôi muốn tạo blog. Duyệt các bài đăng, danh mục, v.v. có thể thực hiện được mà không phải lo lắng rằng trang sẽ hết hạn nếu người dùng quyết định đọc một bài viết trong 2 giờ và sau đó cố gắng điều hướng thêm thông qua ví dụ: phân trang. Tôi muốn cho phép người dùng duy trì trạng thái đăng nhập trong một tháng tại một thời điểm, nhưng tôi cũng không muốn lưu trữ phiên của họ trong một tháng.

Tôi đánh giá rất cao sự giúp đỡ về cách tôi có thể hoàn thành những gì tôi vừa mô tả, với Wicket.

+0

Có một trang web hẹn hò hoàn toàn được tạo với tất cả các trang công khai không quốc tịch. Nó đã được thực hiện một vài năm trước đây vì vậy các mục cũ hơn nhưng chúng vẫn có thể hữu ích. đặc biệt là "chống mẫu". http://letsgetdugg.com/tag/wicket/ – Raystorm

Trả lời

14

Khi xây dựng trang không có trạng thái với Wicket, bạn sẽ mất hầu hết các thành phần tích hợp 'thông minh', ví dụ như bảng và cây được phân trang.

Tôi nghĩ đây không phải là vấn đề đối với trang web, blog và các trang tương tự, thường có mô hình điều hướng khá đơn giản và không sử dụng loại thành phần 'phong phú' này, và sử dụng thân thiện với máy chủ, Javascript dựa trên các thành phần/hiệu ứng, như jQuery-UI hoặc YUI thay thế.

Một số điều bạn sẽ làm khác, như phân trang. Ví dụ, thay vì sử dụng built-in linh kiện pagination, bạn sẽ cần phải thực hiện cơ chế riêng của bạn, sử dụng các thông số trang và các liên kết không quốc tịch:

HomePage.html

<html xmlns:wicket="http://wicket.apache.org"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
    <div class="container"> 

    <div wicket:id="posts"> 
     <h2 wicket:id="title"></h2> 
     <p wicket:id="content"></p> 
     Posted on <span wicket:id="date"></span> 
    </div> 

    <div> 
     <a wicket:id="recentPosts">&lt;&lt; Recent posts</a> 
     <a wicket:id="previousPosts">Previous posts &gt;&gt;</a> 
    </div> 

    </div> 
</body> 
</html> 

Trang chủ.java

package wishminimal.ui.home; 

import java.util.Iterator; 

import org.apache.wicket.PageParameters; 
import org.apache.wicket.devutils.stateless.StatelessComponent; 
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider; 
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; 
import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.link.BookmarkablePageLink; 
import org.apache.wicket.markup.repeater.Item; 
import org.apache.wicket.markup.repeater.data.DataView; 
import org.apache.wicket.model.CompoundPropertyModel; 
import org.apache.wicket.model.IModel; 
import org.apache.wicket.spring.injection.annot.SpringBean; 

import wishminimal.dao.PostDAO; 
import wishminimal.entity.Post; 

@StatelessComponent 
public class HomePage extends WebPage { 

    @SpringBean 
    PostDAO postDAO; 

    ISortableDataProvider<Post> dataProvider = new SortableDataProvider<Post>() { 
     public Iterator<? extends Post> iterator(int first, int count) { 
      return postDAO.findAll(first, count).iterator(); 
     } 
     public int size() { 
      return postDAO.countAll(); 
     } 
     public IModel<Post> model(Post object) { 
      return new CompoundPropertyModel<Post>(object); 
     } 
    }; 

    public HomePage(PageParameters params) { 
     final int currentPage = params.getAsInteger("p", 0); 

     final DataView<Post> dataView = new DataView<Post>("posts", dataProvider, 10) { 
      @Override 
      protected void populateItem(Item<Post> item) { 
       item.add(new Label("title")); 
       item.add(new Label("content")); 
       item.add(new Label("date")); 
      } 
     }; 
     dataView.setCurrentPage(currentPage); 
     add(dataView); 

     add(new BookmarkablePageLink<Void>("recentPosts", getClass(), new PageParameters("p=" + (currentPage - 1))) { 
      @Override 
      public boolean isVisible() { 
       return currentPage > 0; 
      } 
     }); 
     add(new BookmarkablePageLink<Void>("previousPosts", getClass(), new PageParameters("p=" + (currentPage + 1))) { 
      @Override 
      public boolean isVisible() { 
       return currentPage < dataView.getPageCount(); 
      } 
     }); 
    } 
} 

Trong khi điều này là ít hơn nhiều thuận tiện hơn Wicket stateful, tôi vẫn thấy tốt hơn nhiều so với tiếng nói, JSF không quốc tịch hoặc Struts :)

+2

Cảm ơn bạn đã dành thời gian để viết một ví dụ vô cùng hữu ích! :-) – John

7

Để làm cho các trang không quốc tịch, tôi thực hiện như sau:

  1. sử dụng các trang bookmark
  2. sử dụng hình thức stateless trong mọi trường hợp
  3. Để truyền dữ liệu qua các trang, tôi sử dụng các thông số trang như các đối số nhà xây dựng chỉ trong p lứa tuổi
  4. Sử dụng liên kết có thể đánh dấu trang
Các vấn đề liên quan