2010-08-07 23 views
13

Je travaille avec Wicket depuis maintenant un mois ou deux, en faisant de simples applications web avec elle et en m'habituant à des modèles et ainsi de suite. Maintenant, je voudrais aller de l'avant et voir si je peux mettre ce que j'ai appris jusqu'à présent pour utiliser et créer une application web moyenne/grande. Cependant, je n'ai pas passé beaucoup de temps à réfléchir à la façon de rendre les pages apatrides. Si je comprends bien, la création d'une page sans état est réalisée en rendant la page bookmarkable et en s'assurant qu'aucun composant avec état n'est ajouté à la page.Est-il difficile de faire une application web principalement sans état avec Wicket?

Pour le site que je fais Je veux éviter les messages «Page expirée», laisser les utilisateurs connectés via des cookies, rendre beaucoup de contenu disponible sans avoir besoin de se connecter/créer une session, et je veux des fonctionnalités telles comme pagination d'être apatride et signable.

Ceci n'est pas un problème avec, par ex. PHP, mais il me semble que beaucoup de composants Wicket utiles sont dynamiques. Est-ce que je fais beaucoup de travail, comme créer mon propre ensemble de composants qui sont apatrides, ou est-ce que ce n'est pas grave?

J'espère que quelqu'un peut m'aider en me montrant dans la bonne direction.

EDIT: Disons que je voulais faire un blog. La navigation dans les publications, les catégories et ainsi de suite devrait être possible sans avoir à craindre que la page soit expirée si un utilisateur décide de lire un article pendant 2 heures et essaie ensuite de naviguer plus loin via, par exemple, pagination. Je veux permettre aux utilisateurs de rester connectés pendant un mois à la fois, mais je ne veux pas non plus stocker leur session pendant un mois non plus.

J'apprécierais grandement toute aide sur comment je peux accomplir ce que je viens de décrire, avec Wicket.

+0

Il y a un ensemble de site de rencontres créé avec toutes les pages publiques sans état. Cela a été fait il y a quelques années donc les entrées sont plus anciennes mais elles pourraient être utiles. surtout les "anti-patterns". http://letsgetdugg.com/tag/wicket/ – Raystorm

Répondre

14

Lors de la création de pages sans état avec Wicket, vous perdez la plupart des composants intégrés «intelligents», par exemple des tableaux et des arbres paginés. Je pense que c'est moins un problème pour les sites, les blogs et autres, qui ont généralement un modèle de navigation assez simple et n'utilisent pas ce type de composant «riche», et utilisent un langage JavaScript sans serveur. composants/effets basés, comme jQuery-UI ou YUI à la place.

Certaines choses que vous ferez différemment, comme la pagination. Par exemple, au lieu d'utiliser des composants de pagination intégrée, vous devrez faire votre propre mécanisme, en utilisant des paramètres de page et des liens sans état:

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

Bien que ce soit beaucoup moins pratique que stateful Wicket, je trouve encore beaucoup mieux que dire, JSF ou Struts sans état :)

+2

Merci d'avoir pris le temps d'écrire cet exemple incroyablement utile! :-) – John

7

rendre les pages sans état, je fais ce qui suit:

  1. Utilisez pages bookmarkable
  2. Utiliser des formulaires sans état dans tous les cas
  3. Pour transmettre des données sur plusieurs pages, j'utilise des paramètres de page comme les seuls arguments du constructeur dans la p âges
  4. Utilisez les liens Bookmarkable