Сложно ли создавать в Wicket веб-приложение в основном без учета состояния? - PullRequest
13 голосов
/ 07 августа 2010

Я работаю с Wicket уже месяц или два, создавая для него простые веб-приложения, привыкая к моделям и так далее. Теперь я хотел бы продвинуться вперед и посмотреть, смогу ли я использовать то, чему я научился до сих пор, для создания среднего / большого веб-приложения. Тем не менее, я не тратил много времени на размышления о том, как сделать страницы без состояний.

Если я правильно понимаю, создание страницы без сохранения состояния достигается за счет того, что страница становится закладкой и что на нее не добавляются компоненты с состоянием.

Для веб-сайта, который я создаю, я хочу избегать сообщений «Срок действия страницы истек», разрешать пользователям входить в систему с помощью файлов cookie, предоставлять доступ к большому количеству содержимого без необходимости входа / создания сеанса, и мне нужны такие функции, как нумерация страниц без учета состояния и добавление в закладки.

Это не проблема, например, PHP, но мне кажется, что множество полезных компонентов Wicket находятся в состоянии. Я занимаюсь большой работой, такой как создание собственного набора компонентов, которые не имеют состояния, или это не имеет большого значения?

Я надеюсь, что кто-то может помочь мне, указав мне правильное направление.

РЕДАКТИРОВАТЬ: Допустим, я хотел сделать блог. Просмотр сообщений, категорий и т. Д. Должен быть возможен, не беспокоясь о том, что срок действия страницы истечет, если пользователь решит прочитать статью в течение 2 часов, а затем попытается перейти далее, например, с помощью. нумерацией страниц. Я хочу разрешить пользователям оставаться в системе в течение месяца, но я также не хочу сохранять их сеанс в течение месяца.

Я был бы очень признателен за любую помощь в том, как я могу выполнить то, что я только что описал, с помощью Wicket.

Ответы [ 2 ]

14 голосов
/ 09 августа 2010

При создании страниц без сохранения состояния с помощью 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:)

7 голосов
/ 11 августа 2010

Чтобы сделать страницы не имеющими состояния, я делаю следующее:

  1. Использовать закладки для страниц
  2. Использование форм без сохранения состояния во всех случаях
  3. Чтобы передавать данные по страницам, я использую параметры страницы в качестве единственного аргумента конструктора на страницах
  4. Использовать закладки для закладок
...