2011-07-13 92 views
6

我所看到的例子包含這樣的事情:什麼是Wicket中的ResourceReferences,它們是如何工作的?

mountSharedResource("/images/logo.gif", new ResourceReference(ImageScope.class, 
    "logo.gif").getSharedResourceKey()); 

mountSharedResource("/resource", 
    Application.class.getName() + "/" + resourceKey); 

但Javadoc中說,這爲構造函數:

ResourceReference(java.lang.Class<?> scope, java.lang.String name); 

所以,當你創建一個ResourceReference,你給它一個類。爲什麼?通常你會想要全局作用域或你創建的ResourceReference對象的範圍,不是?

另外,什麼是name?是sharedResourceKey?如果不是,resourceKey從哪裏來?它是如何產生的,爲什麼不是它的名字?或者是name在類路徑中查找,然後神奇地加載(假設在類路徑中只有一個文件具有該名稱;如果有多個,會發生什麼?)?如果它確實加載了一個具有該名稱的文件,爲什麼不在Javadoc中這麼說呢?

你怎麼真的把物理資源分配給這個ResourceReference?有一個getResource(),但他們似乎錯過了setResource()。如果你在你的目錄中有一個圖像文件,你如何「附加」引用文件,它的路徑,甚至是文件內容的字節流?如果有一種方法可以讀取webapp中的資源,這可能是有用的,但是你不能;它只在類路徑中。

我希望能夠「掛載」webapp/games/someGame.swf的內容,以便webkit中的SWF可以通過Wicket頁面訪問,或者只是獲取某種類型的句柄。

回答

3

爲了擴大對安德魯的回答是:

一個ResourceReference本身不過是一個參考到可通過SharedResources的資源。您添加到SharedResources(通常在您的Application#init()中完成)的任何一種Resource都有您定義的名稱。任何使用資源的Component然後可以通過帶有該名稱的ResourceReference來引用該共享資源 - 因此該參數被稱爲「名稱」。在這種情況下,範圍參數(類)不是必需的。

這是一般情況下,請參考任何種資源。

在你和安德魯的示例中顯示的情況下是一個比較特殊的情況:你ResourceReferencename並不是指以前添加到SharedResources一個Resource。這裏所謂的PackageResource被懶惰地初始化並被添加到SharedResources

PackageResource實際上是整個「加載文件類路徑」的東西。

所以如果你想只從類路徑中引用一個像圖像這樣的文件,Andrew的例子只是一個非常有用的快捷方式,以避免自己創建PackageResource。如上所述,除ResourceReference之外還有更多:-)

10

圖像等資源通常與特定網頁相關聯。因此,將該圖像定位在Java和HTML文件所在的位置是很有意義的。

該類參數可用作查找資源的基礎。 ResourceReference構造函數的第二個參數是相對於包含該類的目錄的資源的名稱。

因此,例如,你可以有 -

new ResourceReference(AClass.class, "sub/directory/image.jpg"); 

您可以通過在應用程序部署簡單地把該資源在正確的目錄分配的物理資源。

在「Wicket in Action」一書中有關於使用資源的章節。

+1

這樣做很有意義,謝謝!那麼參數名稱是不正確的:它應該被稱爲「路徑」或「文件名」。如果路徑相對於類的位置(推測是/ com/something/package),那麼如何引用webapp中的文件,這是他們始終保存的位置(無論如何)。這是關鍵 - 我們想要在webapp的遊戲目錄中處理swf文件,並且沒有找到任何方法來完成此操作:因此,對ResourceReference最初的興趣。 – wingnut

+0

正確,'name'是相對於'範圍'(類)位置的路徑。這由類包名決定,它在物理上位於文件系統上。 name參數不支持使用'../ ..'表示法進一步向上瀏覽目錄樹的聰明事情。所以你的資源必須是相對於類文件的位置。 順便說一句,我真的建議抓住我提到的那本書,這很好。 –

+3

注意[ResourceReference](http://www.jarvana.com/jarvana/view/org/apache/wicket/wicket/1.5-M1/wicket-1.5-M1-javadoc.jar!/org/apache/wicket/request /resource/ResourceReference.html)是一個抽象類,不能實例化。 – TOUDIdel

相關問題