什么是Wicket中的ResourceReferences,它们如何工作?

win*_*nut 6 java wicket resourcereference

我看过包含这样的事情的例子:

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

mountSharedResource("/resource",
  Application.class.getName() + "/" + resourceKey);
Run Code Online (Sandbox Code Playgroud)

但是Javadoc为构造函数说了这个:

ResourceReference(java.lang.Class<?> scope, java.lang.String name);
Run Code Online (Sandbox Code Playgroud)

因此,当您创建一个时ResourceReference,就会给它一个类.为什么?通常你会想要全局范围或ResourceReference刚刚创建的对象的范围,不是吗?

还有,是什么name?是sharedResourceKey吗?如果没有,它resourceKey来自哪里?它是如何产生的,为什么不是它的名字?或者name在类路径上查找并神奇地加载(假设在类路径中只有一个具有该名称的文件;如果有多个会发生什么?)?如果它确实加载了具有该名称的文件,为什么不在Javadoc中这样说呢?

你如何实际为此分配一个物理资源ResourceReference?有一个getResource(),但他们似乎错过了setResource().如果你的目录中有一个图像文件,你webapp如何"附加"对文件的引用,它的路径,甚至是文件内容的字节流?如果有一种方法可以在webapp中读取资源,这可能很有用,但你不能; 它只在类路径中.

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

And*_*den 10

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

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

所以例如你可以 -

new ResourceReference(AClass.class, "sub/directory/image.jpg");
Run Code Online (Sandbox Code Playgroud)

在部署应用程序时,只需将该资源放在正确的目录中即可分配物理资源.

在"Wicket in Action"一书中有一章使用资源.

  • 注意[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)是一个抽象类,无法实例化. (3认同)

Car*_*zel 3

扩展安德鲁的答案:

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

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

您和安德鲁的示例中显示的情况是一种更特殊的情况:您ResourceReferencename不是指Resource先前添加到 的SharedResources. 这里所谓的PackageResource被延迟初始化并添加到SharedResources.

PackageResource这实际上是整个“从类路径加载文件”的事情。

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