什么是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的示例中显示的案例是一个更特殊的情况:您的ResourceReference
的name
不是指之前添加到SharedResources
的Resource
。 这里一个所谓的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”一书中有一章使用资源。