2010-11-01 23 views
6

El diseñador de páginas web me ha dado HTML que se parece a:¿Cómo obtener la URL de un recurso compartido de Wicket?

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

Desafortunadamente el contenido de la imagen xxx.png es generado por el software, por lo que he hecho un WebResource y el uso de la siguiente estrategia para generar la dirección URL el recurso que luego incluyo en el atributo style= usando 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))); 

Esto funciona bien cuando lo pruebo localmente usando Eclipse, pero:

  • Cuando instalo esto en la producción, yo quiero tener Apache como un proxy para espigón tal que el ISN raíz de contexto' t visible, es decir, Apache reenvía una solicitud de /foo a Jetty como /context-root/foo.
  • En general, no creo que esto sea muy elegante. Estoy seguro de que estoy duplicando el código de Wicket aquí?

Entiendo que Wicket resuelve este problema de contexto y de proxys de Apache utilizando solo URL relativas. Esa sería la solución más elegante que sospecho. Pero si tengo, por ejemplo, a IndexedParamUrlCodingStrategy, entonces la URL podría ser de longitud arbitraria y no sé cuántos .. incluir para volver a /resources.

Editar: La solución actual es utilizar URLs absolutos como en mi ejemplo el código de seguridad, y en Apache (a) reescribir /context-root/* en /* (b) como antes a continuación, añadir la raíz de contexto a todas las peticiones (c) hacia adelante a Jetty. De esta forma, la mayoría de las URL pueden estar sin la raíz de contexto, pero algunas URL (a mis recursos) pueden tener la raíz de contexto y está bien. ¡Pero no me gusta esta solución!

+1

Esto no tiene' Responda la pregunta, pero podría simplificar un poco la última línea: 'nuevo SimpleAttributeModifier (" estilo ", estilo)' – Jonik

+0

@Jonik, genial, ¡+1 gracias por la sugerencia! –

Respuesta

12

Si el código se llama desde el interior de un componente (o página):

urlFor(new ResourceReference("sharedResourceName")); 

o

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

aplicación de muestra a continuación. He utilizado un ByteArrayResource por simplicidad, pero cualquier subclase de Recursos haré:

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

¡Perfecto! Wicket está muy bien pensado. Así que sabía que tenía que ser posible. ¡Muchas gracias! :) –

+0

Gracias pero. ¿Qué pasa si no hay RequestCycle asociado con el hilo actual? –

+1

Estoy usando Wicket 6 y parece que ya no funciona. El constructor ResourceReference (cadena) no está allí, y la clase ResourceReference ahora es Resumen y debe implementarse. ¿Hay alguna otra manera fácil de obtener la URL de un recurso compartido? –

0

Creo que la táctica utilizada en this answer para la creación de URL de imágenes dinámicas se aplicará aquí.

+0

Por lo que puedo ver que crea y registra el recurso con Wicket; este bit que puedo hacer. Sin embargo, no sé cómo puedo acceder a la URL de ese recurso, además de generar manualmente la URL como en mi ejemplo. Me preocupa si Wicket un día cambia la forma en que funcionan las URL a los recursos, mi código se romperá.Wicket debe tener el código en algún lugar para calcular las URL de los recursos, por lo que debería ser posible usarlo en lugar de volver a codificarlo ...? –

Cuestiones relacionadas