2010-11-01 10 views
6

Il web designer mi ha dato HTML che assomiglia a:Come ottenere l'URL per una risorsa condivisa di Wicket?

<div .... style="background: transparent url(xxx.png) 170px center no-repeat"> 

Purtroppo il contenuto dell'immagine xxx.png viene generato dal software, così ho fatto un WebResource e utilizzare la seguente strategia per generare l'URL per la risorsa che ho poi incorporato nell'attributo style= utilizzando un Wicket AttributeModifier.

// App initialization code 
String resourceName = ....; 
getSharedResources().add(resourceName, myWebResource); 

// Creating the widget 
String url = getServletContext().getContextPath() 
    + "/resources/org.apache.wicket.Application/" + resourceName ; 
String style = "background: transparent url(" + url + ") 170px center no-repeat"; 
div.add(new AttributeModifier("style", new Model<String>(style))); 

Questo funziona bene quando prova a livello locale con Eclipse, ma:

  • Quando si installa questo nella produzione, voglio avere Apache come proxy per pontile in modo tale che l'isn root di contesto' t visibile, cioè Apache inoltra una richiesta di /foo su Jetty come /context-root/foo.
  • In generale, non penso che sia molto elegante. Sono sicuro che sto duplicando il codice Wicket qui?

Capisco che Wicket risolva questo problema di proxy di contesto e Apache utilizzando solo URL relativi. Questa sarebbe la soluzione più elegante che sospetto. Ma se ho per es. a IndexedParamUrlCodingStrategy quindi l'URL potrebbe essere di lunghezza arbitraria e non so quanti .. da includere per tornare a /resources.

Edit: La soluzione attuale è quella di utilizzare URL assoluti come nel mio esempio codice di cui sopra, e in Apache (a) riscrivere /context-root/* in /* (b) come prima quindi aggiungere il root di contesto a tutte le richieste (c) in avanti al molo. In questo modo la maggior parte degli URL può essere senza la root di contesto ma alcuni URL (alle mie risorse) possono avere la root di contesto ed è OK. Ma non mi piace questa soluzione!

+1

Questo doesn' t rispondere alla domanda, ma potresti semplificare un po 'l'ultima riga: 'new SimpleAttributeModifier (" style ", style)' – Jonik

+0

@Jonik, ottimo, +1 grazie per il suggerimento! –

risposta

12

Se il codice viene chiamato dall'interno di un componente (o pagina):

urlFor(new ResourceReference("sharedResourceName")); 

o

RequestCycle.get().urlFor(new ResourceReference("sharedResourceName")); 

Esempio di applicazione qui sotto. Ho usato un ByteArrayResource per semplicità, ma ogni sottoclasse Resource farò:

WicketApplication.java

package app1; 

import org.apache.wicket.protocol.http.WebApplication; 
import org.apache.wicket.request.target.coding.IndexedParamUrlCodingStrategy; 
import org.apache.wicket.resource.ByteArrayResource; 

public class WicketApplication extends WebApplication { 
    @Override 
    protected void init() { 
     super.init(); 
     getSharedResources().add("testResource", new ByteArrayResource("text/plain", "This is a test".getBytes())); 
     mount(new IndexedParamUrlCodingStrategy("home/very/deep/folder", getHomePage())); 
    } 
    public Class<HomePage> getHomePage() { 
     return HomePage.class; 
    } 
} 

HomePage.java

package app1; 

import org.apache.wicket.PageParameters; 
import org.apache.wicket.ResourceReference; 
import org.apache.wicket.behavior.SimpleAttributeModifier; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.WebPage; 

public class HomePage extends WebPage { 
    public HomePage(final PageParameters parameters) { 
     CharSequence resourceHref = urlFor(new ResourceReference("testResource")); 
     add(new Label("link", "Click me!") 
      .add(new SimpleAttributeModifier("href", resourceHref))); 
    } 
} 

homepage.html

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" > 
    <body> 
     <a wicket:id="link"></a> 
    </body> 
</html> 
+1

Perfetto! Wicket è così ben pensato. Quindi sapevo che doveva essere possibile. Grazie mille! :) –

+0

Grazie ma. e se non ci fosse un RequestCycle associato al thread corrente? –

+1

Sto usando Wicket 6 e questo non sembra funzionare più. Il costruttore ResourceReference (string) non esiste, anche la classe ResourceReference è astratta e deve essere implementata. C'è un altro modo semplice per ottenere l'URL di una risorsa condivisa? –

0

Penso che la tattica utilizzata in this answer per la creazione di URL immagine dinamici verrà applicata qui.

+0

Per quanto posso vedere, crea e registra la risorsa con Wicket; questo po 'che posso fare Tuttavia, non so come posso accedere all'URL di quella risorsa, a parte la generazione manuale dell'URL come nel mio esempio. Sono preoccupato che se un giorno Wicket cambi il modo in cui funzionano gli URL delle risorse, il mio codice si romperà.Wicket deve avere il codice da qualche parte per calcolare gli URL delle risorse, quindi dovrebbe essere possibile usarlo piuttosto che ricodificarlo ...? –

Problemi correlati