2011-07-13 56 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

相关问题