什么是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中读取资源,这可能很有用,但你不能; 它只在类路径中。

我希望能够“挂载” webapp/games/someGame.swf的内容,以便Wicket页面可以访问webapp中的SWF,或者只是对它们进行某种处理。

扩展Andrew的答案:

ResourceReference本身只是通过SharedResources可用资源的引用 。 您添加到SharedResources任何类型的Resource (通常在您的Application#init() )都有您定义的名称。 然后,任何使用资源的Component都可以通过具有该名称的ResourceReference引用此共享资源 – 因此该参数被称为“name”。 在这种情况下,不需要scope参数(类)。

这是一般情况,指的是任何类型的资源。

您和Andrew的示例中显示的案例是一个更特殊的情况:您的ResourceReferencename不是指之前添加到SharedResourcesResource 。 这里一个所谓的PackageResource被懒惰地初始化并添加到SharedResources

PackageResource实际上是整个“load-file-from-classpath”的东西。

因此,如果您只想从类路径中引用类似图像的文件,Andrew的示例只是一个非常有用的快捷方式,可以避免自己创建PackageResource 。 如上所述, ResourceReference不仅仅是:-)

诸如图像的资源通常与特定网页相关联。 因此,将该图像放在与Java和HTML文件相同的位置是有意义的。

class参数用作查找资源的基础。 ResourceReference构造函数的第二个参数是资源的名称,相对于包含该类的目录。

所以例如你可以 –

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

通过在部署应用程序时将该资源放在正确的目录中,可以分配物理资源。

在“Wicket in Action”一书中有一章使用资源。