我见过这样的例子:
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>
答案 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
还有更多内容: - )