簡體   English   中英

使用Wicket制作一個主要是無狀態的Web應用程序是否很困難?

[英]Is it difficult to make a mainly stateless web application with Wicket?

我已經和Wicket合作了一兩個月,用它制作簡單的Web應用程序並習慣模型等等。 現在我想繼續前進,看看我是否可以將迄今為止學到的東西用於創建中/大型Web應用程序。 但是,我沒有花太多時間思考如何使頁面無狀態。

如果我理解正確的話,通過使頁面可書簽並確保沒有向頁面添加有狀態組件來實現創建無狀態頁面。

對於我正在制作的網站,我想避免“頁面過期”消息,讓用戶通過cookie登錄,無需登錄/創建會話即可創建大量內容,我希望分頁等功能成為可能無國籍和可收藏。

這對於例如PHP來說沒有問題,但在我看來,很多有用的Wicket組件都是有狀態的。 我是否參與了很多工作,比如創建我自己的無狀態組件,或者它沒什么大不了的?

我希望有人能指出我正確的方向來幫助我。

編輯:讓我們說我想寫一個博客。 如果用戶決定閱讀文章2小時然后嘗試通過例如分頁進一步導航,則應該可以瀏覽帖子,類別等,而不必擔心頁面將過期。 我希望允許用戶一次保持登錄一個月,但我並不想將他們的會話存儲一個月。

我非常感謝任何有關如何使用Wicket完成我剛才描述的內容的幫助。

使用Wicket構建無狀態頁面時,您會丟失大多數“智能”內置組件,例如分頁表和樹。

我認為對於網站,博客等來說這不是一個問題,它通常具有相當簡單的導航模型,並且不使用這種“豐富”組件,並且使用無狀態服務器友好的基於Javascript的組件/效果,比如jQuery-UI或YUI。

你會做一些不同的事情,比如分頁。 例如,您不必使用內置的分頁組件,而是使用頁面參數和無狀態鏈接來創建自己的機制:

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>

HomePage.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();
            }
        });
    }
}

雖然這比有狀態的Wicket便宜得多,但我仍然發現比無狀態的JSF或Struts要好得多:)

為了使頁面無狀態,我執行以下操作:

  1. 使用可收藏的頁面
  2. 在所有情況下都使用無狀態表單
  3. 為了跨頁面傳遞數據,我使用頁面參數作為頁面中唯一的構造函數參數
  4. 使用可收藏的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM