Что такое ResourceReferences в Wicket и как они работают? - PullRequest
6 голосов
/ 14 июля 2011

Я видел примеры, содержащие такие вещи:

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 каталоге, как вы «прикрепляете» ссылку на файл, его путь или даже поток байтов содержимого файла?Если бы в веб-приложении был способ чтения ресурсов, это может быть полезно, но вы не можете;это только в classpath.

Я хотел бы иметь возможность "смонтировать" содержимое, скажем, webapp/games/someGame.swf, чтобы к SWF в веб-приложении можно было получить доступ со страниц Wicket, или просто получить некоторыевид ручки на них.

Ответы [ 2 ]

10 голосов
/ 14 июля 2011

Ресурс, такой как изображение, обычно связан с определенной веб-страницей.Поэтому имеет смысл размещать это изображение в том же месте, что и файлы Java и HTML.

Параметр class служит основой для поиска вашего ресурса.Второй параметр конструктора ResourceReference - это имя ресурса относительно каталога, содержащего класс.

Так, например, вы могли бы иметь -

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

Физический ресурс назначается с помощьюпросто поместив этот ресурс в правильный каталог при развертывании вашего приложения.

В книге "Wicket in Action" есть глава об использовании ресурсов.

3 голосов
/ 11 августа 2011

Расширить ответ Андрея:

A ResourceReference само по себе является ничем иным, как ссылкой на ресурс, доступный через SharedResources. Любой тип Resource, который вы добавляете к SharedResources (обычно это делается в вашем Application#init()), имеет имя, которое вы определяете. Любой Component, который использует ресурс, может затем обратиться к этому общему ресурсу через ResourceReference с таким именем - отсюда и параметр, называемый «имя». В этом случае параметр области (класс) не требуется.

Это общий случай, если обратиться к любому виду ресурса.

Случай, показанный в примерах вашего и Эндрю, является более особым случаем: ваш ResourceReference name не относится к Resource, ранее добавленному к SharedResources. Здесь так называемая PackageResource лениво инициализируется и добавляется к SharedResources.

PackageResource - это то, что на самом деле выполняет весь процесс загрузки файла из класса.

Так что, если вы хотите просто обратиться к файлу, подобному изображению из вашего пути к классам, пример Эндрю - просто очень полезный ярлык, чтобы избежать создания этого PackageResource самостоятельно. Как отмечалось выше, ResourceReference - это больше, чем просто: -)

...