2010-02-01 20 views
5

Quindi stavo leggendo another question sotto il tag Wicket che confronta Apache Wicket e Apache Click. Una spiegazione concisa, secondo me. Ho più familiarità con il mondo di Wicket che con il mondo di Click.Apache Stateless Apache Wicket pagine/richieste

Uno dei commenti che ho letto è che è possibile creare pagine Wicket senza stato. Ho iniziato a pensarci e non sono riuscito a trovare un modo per fare una richiesta o una richiesta di una pagina per qualcosa di stateless. Questo potrebbe certamente tornare utile in alcune situazioni. Quindi, come si inizia a utilizzare Wicket senza stato?

+0

http://stackoverflow.com/a/3441584/176897 – tetsuo

+0

Il collegamento precedente non funziona, prova questo: https://cwiki.apache.org/confluence/display/WICKET/Stateless+pages – snorbi

risposta

8

Se una pagina è disponibile come bookmark e non contiene componenti/comportamenti non statici, la pagina è automaticamente stateless e non archiviata nella sessione. Penso che finché un utente visita solo le pagine senza stato, non verrà creata una sessione. Per la maggior parte, se tutto ciò che riguarda il modo in cui la pagina viene visualizzata può essere determinato esclusivamente da un costruttore no-args o da un costruttore che prende un argomento PageParameters. Le normali classi Link e Form non sono stateless, quindi dovrai usare StatelessForm e StatelessLink.

+0

Grazie Geoff. Ora anche l'esistenza di questi componenti Stateless ... ha senso. – Matt

16

Wicket è stateless per impostazione predefinita e passa alla modalità stateful quando è necessario. È molto facile rompere la modalità senza stato.

Ho trovato utile annotare pagine stateless e componenti stateless con @StatelessComponent, che si trova nel progetto wicket-devutils. Ho quindi aggiungere un StatelessChecker nel mio metodo WebApplication.init() in questo modo:

protected void init(){ 
    ... 
    this.addPostComponentOnBeforeRenderListener(new StatelessChecker()); 
    ... 
} 

In questo modo ottengo sempre un'eccezione sul componente stateful incriminato.

3

Se si dispone di pagine che si desidera assicurarsi che siano stateless, il metodo setStatelessHint(boolean state) è utile.

emette un avviso se la pagina non è stateless.

Per ulteriori informazioni, vedere qui: Wicket Stateless pages

4

preferisco per controllare che in prova.

quindi ogni test per la pagina di apolide ignora

getStatelessWebPage() 

che di default restituisce null.

poi nel test di base che ho prova generica che visita tutti i componenti a pagina e controllare se componente è senza stato o no

@Test 
public void checkForStateless() 
{ 
    StatelessWebPage statelessPage = getStatelessWebPage(); 
    if (statelessPage != null) 
    { 
     Page page = (Page)statelessPage; 
     if (!page.isPageStateless()) 
     { 
      //find the reason 
      Component statefulComponent = page.visitChildren(Component.class, new StatelessChecker()); 
      if (statefulComponent != null) 
      { 
       fail("Stateless page contains stateful component [" 
        +statefulComponent.getClass().getName()+" : " 
        + statefulComponent.getMarkupId() +"]"); 
      } 
     } 
    } 
} 

e

class StatelessChecker implements IVisitor<Component, Component> 
{ 
    @Override 
    public void component(Component component, IVisit<Component> iVisit) 
    { 
     if (!component.isStateless()) 
     { 
      iVisit.stop(component); 
     } 
    } 
} 
0

cosa circa la situazione in cui la pagina può essere stateless o stateful a seconda che l'utente abbia o meno l'autenticità?

Un esempio potrebbe essere il tipico pannello di 'conto' che risiede nella parte superiore della maggior parte delle pagine web che mostra il nome utente attualmente connesso, profilo di collegamento ecc,

La maggior parte delle pagine del sito avrebbe questo al in alto, in modo che entrambe le pagine debbano essere in grado di essere allo stesso stato e apolidi a seconda che un utente abbia effettuato l'accesso.