Czy trudno jest zrobić z Wicket aplikację internetową głównie bezstanową?

Pracuję z Wicket od miesiąca lub dwóch, tworząc z niego proste aplikacje internetowe, przyzwyczajając się do Modeli i tak dalej. Teraz chciałbym iść do przodu i zobaczyć, czy Mogę umieścić to, czego nauczyłem się do tej pory, aby użyć i stworzyć średnią / dużą aplikację internetową. Nie spędziłem jednak zbyt wiele czasu na rozmyślaniu o tym, jak sprawić, by strony stały się bezpaństwowe.

Jeśli dobrze rozumiem, Tworzenie strony bez stanu jest osiągane przez uczynienie strony bookmarkable i upewnienie się, że żadne komponenty stanowe nie są dodany do strony.

Dla strony, którą tworzę chcę uniknąć komunikatów "wygasła strona", pozwolić użytkownikom być zalogowanym za pomocą Plików cookie, udostępnić całą masę treści bez konieczności logowania/tworzenia sesji, i chcę, aby funkcjonalności takie jak paginacja były bezpaństwowe i bookmarkable.

To nie problem np. z PHP, ale wydaje mi się, że cała masa użytecznych komponentów Wicket jest stanowa. Czy mam dużo pracy, np. stworzenie własnego zestawu komponenty, które są bezpaństwowe, czy to nic wielkiego?

Mam nadzieję, że ktoś mi pomoże, wskazując mi właściwy kierunek.

EDIT: powiedzmy, że chciałem stworzyć bloga. Przeglądanie postów, kategorii itp. powinno być możliwe bez obawy, że strona wygaśnie, jeśli użytkownik zdecyduje się na przeczytanie artykułu przez 2 godziny, a następnie spróbuje przejść dalej poprzez np. paginację. Chcę, aby użytkownicy pozostawali zalogowani przez miesiąc na raz, ale nie dokładnie chcą przechowywać swoją sesję przez miesiąc albo.

Byłbym bardzo wdzięczny za każdą pomoc w tym, jak mogę osiągnąć to, co właśnie opisałem, z Wicket.

Author: John, 2010-08-07

2 answers

Budując bezstanowe strony za pomocą Wicket, tracisz większość "inteligentnych" wbudowanych komponentów, na przykład paginowanych tabel i drzew.

Myślę, że jest to mniej problem dla witryn, blogów i tym podobnych, które zwykle mają dość prostszy model nawigacji i nie używają tego rodzaju "bogatego" komponentu, a zamiast tego używają bezstanowych serwerów, opartych na JavaScript komponentów / efektów, takich jak jQuery-UI lub YUI.

Niektóre rzeczy, które zrobisz inaczej, jak paginacja. Na przykład, zamiast korzystając z wbudowanych komponentów paginacji, będziesz musiał stworzyć własny mechanizm, używając parametrów strony i linków bezstanowych:

Strona główna.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>

Strona główna.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();
            }
        });
    }
}

Chociaż jest to znacznie mniej wygodne niż stateful Wicket, i tak uważam, że znacznie lepiej niż powiedzmy, stateless JSF lub Struts :)

 14
Author: tetsuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-21 12:52:45

Aby strony stały się bezpaństwowe, wykonuję następujące czynności:

  1. Użyj bookmarkable pages
  2. używaj form bezstanowych we wszystkich przypadkach
  3. aby przekazać dane między stronami, używam parametrów strony jako jedynego argumentu konstruktora na stronach
  4. Użyj linków bookmarkable
 7
Author: joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 18:50:15