2010-11-01 29 views
6

web tasarımcısı verdi bana HTML görünüyor ki gibi:URL, bir Wicket paylaşılan kaynağına nasıl alınır?

<div .... style="background: transparent url(xxx.png) 170px center no-repeat"> 
Maalesef görüntünün xxx.png içeriği yazılım tarafından oluşturulur

, bu yüzden bunu bir WebResource yaptı ve URL'sini oluşturmak için aşağıdaki stratejiyi kullanan yetkili Sonra bir Wicket AttributeModifier kullanarak style= özniteliğine yerleştirdiğim kaynak.

// 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))); 

Ben yerel olarak Eclipse kullanarak test ancak bu iyi çalışır: Ben üretimde bu yüklediğinizde

  • , ben öyle ki bağlam kök değilmi iskelesine vekil olarak Apache sahip olmak istiyorum' t görünür, yani Apache, /foo numaralı talebi Jetty üzerine /context-root/foo olarak iletir.
  • Genel olarak, bunun çok zarif olduğunu düşünmüyorum. Eminim Wicket kodunu burada kopyalarım?

Wicket'in yalnızca bağıl URL'leri kullanarak bu bağlam bağlamı ve Apache proxy sorununu çözdüğünü anlıyorum. Şüphelendiğim en zarif çözüm bu olurdu. Ama eğer ör. Bir IndexedParamUrlCodingStrategy sonra URL keyfi uzunluk olabilir ve /resources geri almak için kaç .. içerdiğini bilmiyorum.

Düzenleme: Mevcut çözüm ileri yukarıda benim kod örneğinde olduğu gibi mutlak URL'ler kullanmaktır ve Apache (a) /* içine /context-root/* (b) daha önce (c) tüm isteklere bağlam kök ADD yeniden İskeleye. Bu şekilde çoğu URL, içerik kökü olmadan olabilir, ancak bazı URL'ler (kaynaklara) bağlam köküne sahip olabilir ve tamamdır. Ama bu çözümü sevmiyorum!

+1

WicketApplication.java soruyu cevaplayın, ancak son satırı biraz basitleştirebilirsiniz: 'yeni SimpleAttributeModifier (" stil ", stil) – Jonik

+0

@Jonik, harika, +1 bahşiş için teşekkürler! –

cevap

12

: Aşağıdaki

urlFor(new ResourceReference("sharedResourceName")); 

veya

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

Örnek uygulama. Ben basitlik için bir ByteArrayResource kullanılan, ancak herhangi bir kaynak alt sınıf yapacağız: Bu kötü kokan

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

Mükemmel! Wicket çok iyi düşünülmüş. Yani bunun mümkün olduğunu biliyordum. Çok teşekkürler! :) –

+0

Teşekkürler ama. Geçerli iş parçacığı ile ilişkili bir RequestCycle olmasaydı ne olurdu? –

+1

Ben Wicket 6 kullanıyorum ve bu artık işe yaramıyor. ResourceReference (string) yapıcısı yok, ResourceReference sınıfı artık soyut ve uygulanması gerekiyor. Paylaşılan bir kaynağın URL'sini almanın başka kolay yolu var mı? –

0

Dinamik görüntü URL'leri oluşturmak için this answer'da kullanılan taktik burada uygulanacaktır. Kod bir bileşeni (veya sayfaya) içinden çağrılırsa

+0

Kaynağın Wicket ile oluşturup kaydettiğini görebildiğim kadarıyla; Bu biraz yapabilirim. Ancak, örneğimde olduğu gibi URL'yi manuel olarak oluşturmaktan başka, bu kaynağa nasıl URL'ye erişebileceğimi bilmiyorum. Wicket'in bir gün URL'lerin kaynaklarının işleyiş şeklini değiştirmesi durumunda endişeleniyorum, kodum kırılacak.Wicket, kodları kaynaklara yönlendirmek için bir yere sahip olmalı, bu yüzden onu yeniden kodlamak yerine kullanmam mümkün mü? –

İlgili konular