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

时间:2011-07-13 21:01:11

标签: java wicket resourcereference

我见过这样的例子:

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,或者只是对它们进行某种处理。< / p>

2 个答案:

答案 0 :(得分:10)

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

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

所以例如你可以 -

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

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

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

答案 1 :(得分:3)

扩展安德鲁的回答:

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

这是一般情况,用于引用任何类型的资源。

您和Andrew的示例中显示的案例更为特殊:您的ResourceReference name未引用之前添加到Resource的{​​{1}}。这里所谓的SharedResources被懒惰地初始化并添加到PackageResource

SharedResources实际上是整个“从类路径加载文件”的东西。

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