2011-12-22 14 views

risposta

18

In Application.init():

mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class)); 

con la seguente classe Mapper:

public class MountedMapperWithoutPageComponentInfo extends MountedMapper { 

    public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) { 
    super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
    // do nothing so that component info does not get rendered in url 
    } 

    @Override 
    public Url mapHandler(IRequestHandler requestHandler) 
    { 
     if (requestHandler instanceof ListenerInterfaceRequestHandler || 
       requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) { 
      return null; 
     } else { 
      return super.mapHandler(requestHandler); 
     } 
    } 
} 
+1

Ha funzionato! Grazie mille. Modifico il tuo post per rappresentare l'intera soluzione. – rotsch

+0

Funziona davvero. Se si desidera questo comportamento per la propria home page, estendere invece HomePageMapper. –

+2

Solo per chiarezza, questo rende le tue pagine stateless quindi non usare questo se vuoi pagine statefull. –

3

Utilizzare il seguente programma di mappatura per montare le pagine, questo dovrebbe funzionare su qualsiasi pagina marcabile del libro tranne la homepage.

Ecco come utilizzare il mapper in Application.init()

mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class)); 

Ecco il mapper.

import org.apache.wicket.request.Url; 
import org.apache.wicket.request.component.IRequestablePage; 
import org.apache.wicket.request.mapper.MountedMapper; 
import org.apache.wicket.request.mapper.info.PageComponentInfo; 
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; 

public class MountedMapperWithoutPageComponentInfo extends MountedMapper { 

    public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) { 
    super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
    // does nothing so that component info does not get rendered in url 
    } 
} 
+0

ho provato il primo metodo, il numero di versione scompare ma tutti i link smette di funzionare. Il secondo metodo non elimina i numeri di versione. – rotsch

+0

Il primo metodo funziona per me, senza problemi. Anche la mia pagina ha link, tutto funziona bene. Vedi qualche errore? Anche la tua corretta sulla seconda soluzione, non funziona e l'ho tolto, mi dispiace. – Alinoor

+0

Sono riuscito a ricreare parzialmente il problema dei collegamenti non funzionanti, nel mio caso ci sono stati moduli che hanno smesso di funzionare.Ho usato la risposta da http://stackoverflow.com/questions/2178285/stateless-apache-wicket-stateless-pages-requests per verificare quale dei miei componenti fosse pieno di stato, per la maggior parte di essi avevo solo bisogno di sovrascrivere getStatelessHint () metodo per restituire true, per collegamenti e moduli ho usato la versione senza stato (StatelessLink, StatelessForm). Ho quindi smesso di utilizzare il codice precedente e ComponentInfo non ha più eseguito il rendering e le pagine sembrano funzionare con i test rapidi che ho fatto. – Alinoor

4

Se non si desidera il numero di versione, la pagina deve essere completamente senza stato, il numero di versione è pensato per pagine con stato. Ad esempio se la tua pagina include un modulo, dovresti utilizzare la variante senza stato del componente Form, che è org.apache.wicket.markup.html.form.StatelessForm. Se la tua pagina è già completamente stateless, puoi dare un consiglio a wicket invocando il metodo org.apache.wicket.Page # setStatelessHint.

+3

Hai ragione. Ma voglio pagine di stato senza un numero di versione, questo era possibile in wicket 1.4. – rotsch

3

Per me la soluzione con setStatelessHint non ha funzionato. Di seguito ha fatto il lavoro:

class MyApplication extends WebApplication { 
    @Override protected void init() { 
     getRequestCycleSettings().setRenderStrategy(
      IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER); 
     .... 
    } 
} 
+0

Questa soluzione funziona per me per Wicket versione 6.16.0. – Yuci

4

La soluzione utilizzando una classe MountedMapperWithoutPageComponentInfo auto-creato non funziona per Wicket 6.13+, la pagina non risponderà ai callback azioni dell'utente. (. Noti che ci sono più versioni di MountedMapperWithoutPageComponentInfo su Internet)

Una soluzione per 6.13+ (testato con 6.15) può essere trovato qui:

http://apache-wicket.1842946.n4.nabble.com/Delete-version-number-in-url-td4665752.html

https://svn.apache.org/repos/asf/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java

// Put this code in your WebApplication subclass 
import org.apache.wicket.core.request.mapper.MountedMapper; 
import org.apache.wicket.request.component.IRequestablePage; 
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; 
import org.apache.wicket.request.mapper.info.PageComponentInfo; 
import org.apache.wicket.request.IRequestHandler; 
import org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler; 

private static class NoVersionMapper extends MountedMapper { 
    public NoVersionMapper(final Class<? extends IRequestablePage> pageClass) { 
     this("/", pageClass); 
    } 

    public NoVersionMapper(String mountPath, final Class<? extends IRequestablePage> pageClass) { 
     super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
     //Does nothing 
    } 

    @Override 
    public Url mapHandler(IRequestHandler requestHandler) { 
     if (requestHandler instanceof ListenerInterfaceRequestHandler || requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) { 
      return null; 
     } else { 
      return super.mapHandler(requestHandler); 
     } 
    } 
} 

Quindi è possibile montare le pagine utilizzando:

// Put this in the init() method of your WebApplication subclass 
getRootRequestMapperAsCompound().add(new NoVersionMapper("urlPatternOfAPage", YourPage.class)); 
+0

Qual è la soluzione se si utilizza l'annotazione '@ MountPath' per montare una pagina? – Jon

0

Le soluzioni alternative suggerite potrebbero funzionare con versioni specifiche e avere effetti collaterali. Dovrebbero essere considerati hack. Ho usato questi hack e sono stati interrotti dalle nuove versioni. Pertanto ho creato una richiesta di supporto per framework generico qui (si prega di commentare/votare): setVersioned(false) should force single Page Version.

Un altro esempio di un effetto collaterale: Page Reload on Submit of non-versioned Page

+0

ricorda che ho postato una risposta 3 anni fa. molte cose sono cambiate in wicket in questi anni :) – Apostolos

Problemi correlati