13

ここ 1、2 か月間 Wicket を使って簡単な Web アプリケーションを作成し、モデルなどに慣れてきました。ここから先に進み、これまでに学んだことを使用して中規模/大規模の Web アプリケーションを作成できるかどうかを確認したいと思います。ただし、ページをステートレスにする方法についてはあまり考えていませんでした。

私の理解が正しければ、ページをブックマーク可能にし、ステートフルなコンポーネントがページに追加されないようにすることで、ステートレスなページを作成できます。

私が作成しているWebサイトでは、「ページの期限切れ」メッセージを回避し、ユーザーがCookieを介してログインできるようにし、ログイン/セッションの作成を必要とせずに多くのコンテンツを利用できるようにし、ページネーションなどの機能を有効にしたいステートレスでブックマーク可能。

これは PHP などでは問題ありませんが、便利な Wicket コンポーネントの多くがステートフルであるように私には思えます。ステートレスなコンポーネントの独自のセットを作成するなど、大量の作業が必要ですか、それとも大したことではありませんか?

誰かが私を正しい方向に向けて助けてくれることを願っています。

編集:ブログを作りたいとしましょう。ユーザーが 2 時間記事を読むことを決定し、ページネーションなどを介してさらに移動しようとすると、ページが期限切れになることを心配することなく、投稿、カテゴリなどを閲覧できる必要があります。ユーザーが一度に 1 か月間ログインしたままにできるようにしたいのですが、セッションを 1 か月間保存したくありません。

Wicket を使用して、今説明したことをどのように達成できるかについて、助けていただければ幸いです。

4

2 に答える 2

14

Wicket でステートレス ページを構築すると、ページ分割されたテーブルやツリーなど、ほとんどの「スマートな」組み込みコンポーネントが失われます。

これは、通常、かなり単純なナビゲーション モデルを持ち、この種の「リッチ」コンポーネントを使用せず、ステートレス サーバー フレンドリーな Javascript ベースのコンポーネント/効果を使用するサイトやブログなどでは、それほど問題ではないと思います。 、代わりに jQuery-UI や YUI のように。

ページネーションなど、いくつかの変更を行います。たとえば、組み込みのページネーション コンポーネントを使用する代わりに、ページ パラメーターとステートレス リンクを使用して、独自のメカニズムを作成する必要があります。

ホームページ.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>

ホームページ.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 よりもはるかに優れていると思います :)

于 2010-08-09T15:29:01.070 に答える
7

ページをステートレスにするために、次のことを行います。

  1. ブックマーク可能なページを使用する
  2. すべてのケースでステートレス フォームを使用する
  3. ページ間でデータを渡すには、ページ内の唯一のコンストラクター引数としてページ パラメーターを使用します。
  4. ブックマーク可能なリンクを使用する
于 2010-08-11T06:30:24.550 に答える