2010-08-07 12 views
13

He estado trabajando con Wicket durante uno o dos meses, haciendo aplicaciones web simples con él y acostumbrándome a modelos y demás. Ahora me gustaría avanzar y ver si puedo poner lo que he aprendido hasta ahora para usar y crear una aplicación web media/grande. Sin embargo, no he dedicado mucho tiempo a pensar cómo hacer que las páginas sean sin estado.¿Es difícil hacer una aplicación web principalmente sin estado con Wicket?

Si entiendo correctamente, hacer una página sin estado se logra haciendo que la página sea favorita y asegurándose de que no se agreguen componentes con estado a la página.

Para el sitio web que estoy creando, quiero evitar los mensajes "Página caducada", permitir que los usuarios inicien sesión a través de cookies, crear una gran cantidad del contenido disponible sin necesidad de iniciar sesión/crear una sesión, y quiero funcionalidad como paginación para ser apátrida y marcable.

Esto no es un problema con p. PHP, pero me parece que muchos de los componentes útiles de Wicket son estables. ¿Debo hacer un montón de trabajo, como crear mi propio conjunto de componentes sin estado, o no es gran cosa?

Espero que alguien me pueda ayudar apuntando en la dirección correcta.

EDITAR: Digamos que quería hacer un blog. La exploración de publicaciones, categorías, etc. debe ser posible sin tener que preocuparse de que la página haya caducado si un usuario decide leer un artículo durante 2 horas y luego intenta navegar más lejos, por ejemplo. paginación. Quiero permitir que los usuarios permanezcan conectados por un mes a la vez, pero tampoco quiero almacenar su sesión por un mes.

Agradecería cualquier ayuda sobre cómo puedo lograr lo que acabo de describir, con Wicket.

+0

Hay un sitio de citas conjunto creado con todas las páginas públicas sin estado. Se realizó hace unos años, por lo que las entradas son más antiguas, pero podrían ser útiles. especialmente los "antipatrones". http://letsgetdugg.com/tag/wicket/ – Raystorm

Respuesta

14

Al construir páginas sin estado con Wicket, se pierden la mayoría de los componentes integrados 'inteligentes', por ejemplo, tablas y árboles paginados.

Creo que esto es menos un problema para sitios, blogs y similares, que generalmente tienen un modelo de navegación bastante más simple y no usan este tipo de componente 'rico', y usan un servidor sin estado, JavaScript- componentes/efectos basados, como jQuery-UI o YUI en su lugar.

Algunas cosas lo harán diferente, como la paginación. Por ejemplo, En lugar de utilizar una función de componentes de paginación, usted tiene que hacer su propio mecanismo, utilizando los parámetros de página y enlaces sin Estado:

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> 

página de inicio.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(); 
      } 
     }); 
    } 
} 

Si bien esto es mucho menos conveniente que Wicket estado, me sigue pareciendo mucho mejor que digamos, JSF sin estado o puntales :)

+2

¡Gracias por tomarse el tiempo de escribir ese ejemplo increíblemente útil! :-) – John

7

para hacer páginas sin estado, hago lo siguiente:

  1. Use páginas bookmarkable
  2. Use formas apátridas en todos los casos
  3. para pasar los datos a través de las páginas, utilizo los parámetros de página como los únicos argumentos de constructor en el p
  4. edades
  5. uso Links bookmarkable
Cuestiones relacionadas