2010-11-01 53 views
6

網頁設計師給我的HTML看起來像:如何獲取Wicket共享資源的URL?

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

不幸的是,圖像xxx.png的內容是由軟件生成的,所以我做了它WebResource並使用以下策略來生成的URL然後我使用Wicket AttributeModifier將該資源嵌入style=屬性中。

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

當我測試它在本地使用Eclipse,但這個工作得很好:

  • 當我安裝此生產,我想有Apache作爲代理,碼頭使得上下文根ISN」 t可見,即Apache將/foo的請求轉發給Jetty,作爲/context-root/foo
  • 一般來說,我覺得這不是很優雅。我確定我在這裏複製Wicket代碼?

我知道Wicket通過僅使用相對URL解決了上下文根和Apache代理的這個問題。這將是我懷疑的最優雅的解決方案。但是如果我有例如一個IndexedParamUrlCodingStrategy然後URL可以是任意長度,我不知道有多少..包括回/resources

編輯:目前的解決方案是使用絕對URL如上述我的代碼示例,並且在Apache中的(a)重寫/context-root/*/*(b)中如在此之前的上下文根添加到所有請求(c)向到碼頭。這樣,大多數URL可以沒有上下文根,但一些URL(對我的資源)可以有上下文根,並且沒問題。但我不喜歡這個解決方案!

+1

這沒有按」 t回答這個問題,但是可以簡化最後一行:'new SimpleAttributeModifier(「style」,style)' – Jonik 2010-11-01 20:08:45

+0

@Jonik,太棒了,+1謝謝你的提示! – 2010-11-02 15:19:51

回答

12

如果代碼是由組分(或頁)的內部稱爲:

urlFor(new ResourceReference("sharedResourceName")); 

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

樣品下面的應用程序。我曾經爲了簡單起見,使用ByteArrayResource,但是任何資源的子類會做的事:

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

完美! Wicket如此深思熟慮。所以我知道它必須是可能的。非常感謝! :) – 2010-11-19 08:02:02

+0

謝謝,但。如果沒有與當前線程關聯的RequestCycle會怎麼樣? – 2014-09-09 14:52:49

+1

我正在使用Wicket 6,這似乎不再有效。 ResourceReference(字符串)構造函數不存在,ResourceReference類現在是Abstract,需要實現。有沒有其他簡單的方法來獲取共享資源的URL? – 2016-07-06 07:45:07

0

我認爲this answer用於創建動態圖片網址的策略適用於此。

+0

據我所知,用Wicket創建和註冊資源;這一點我可以做。但是我不知道如何才能訪問該資源的URL,除了像我的示例中那樣手動生成URL之外。我很擔心,如果Wicket有一天改變了資源URL的工作方式,我的代碼就會崩潰。Wicket必須有代碼才能找出資源的URL,所以我應該可以使用它而不是重新編碼它......? – 2010-11-02 15:23:26