6

我见过包含以下内容的示例:

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 页面可以访问 web 应用程序中的 SWF,或者只是对它们进行某种处理。

4

2 回答 2

10

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

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

因此,例如,您可以-

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

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

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

于 2011-07-14T08:36:24.890 回答
3

扩展安德鲁的答案:

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

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

您和 Andrew 的示例中显示的情况是一种更特殊的情况:您ResourceReference的 'sname不引用Resource以前添加到的SharedResources. 这里一个所谓的PackageResource被延迟初始化并添加到SharedResources.

PackageResource是整个“从类路径加载文件”的实际作用。

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

于 2011-08-11T11:51:39.310 回答