Я довольно новичок в Wicket, и у меня есть некоторые трудности с использованием ссылок на ресурсы.Я использую калитку 1.5.4 и имею следующую проблему: я храню изображения в файловой системе.У меня есть класс ImageElement, который содержит часть пути к файлу относительно настроенного rootFilePath (т.е. dir1 / dir2 / img1.png).На странице я добавляю изображение следующим образом:
new Image("id",ImagesResourceReference.get(), pageParameters)
, где в параметры страницы входит параметр пути к изображению (path = "/ dir1 / dir2 / img1.png").Мои вопросы:
- Это самый простой способ обслуживания изображений из файловой системы?
- Можно ли использовать ResourceReference статическим методом?или мне надо каждый раз строить новый ResourceReference?Я видел, что в предыдущей версии можно было использовать новый ResourceReference (globalId), но, похоже, это уже не так.Если да, то для чего нужен глобальный ресурс?Насколько я понимаю, ссылка на ресурс должна быть фабрикой для ресурсов, поэтому было бы довольно странно создавать новую фабрику для каждого запроса ресурса.
- Последний вопрос: как мне лучше передать путь к изображению, чтобы мне не приходилось объединять индексированные параметры для построения пути после вызова метода ответа в ImageResource.
- Какой был бы лучший сценарий, чтобы заставить его работать эффективно и просто, я видел пример в «Калитке в действии», но это предназначено для динамического генерирования изображений из БД, и я не уверен, подходит ли он для моего случая
Моя реализация ResourceReference, которую я смонтировал в приложении под путем "/ images", выглядит следующим образом:
public class ImagesResourceReference extends ResourceReference {
private static String rootFileDirectory;
private static ImagesResourceReference instance;
private ImagesResourceReference() {
super(ImagesResourceReference.class, "imagesResourcesReference");
}
public static ImagesResourceReference get() {
if(instance == null) {
if(StringUtils.isNotBlank(rootFileDirectory)) {
instance = new ImagesResourceReference();
} else {
throw new IllegalStateException("Parameter configuring root directory " +
"where images are saved is not set");
}
}
return instance;
}
public static void setRootFileDirectory(String rootFileDirectory) {
ImagesResourceReference.rootFileDirectory = rootFileDirectory;
}
private static final long serialVersionUID = 1L;
@Override
public IResource getResource() {
return new ImageResource(rootFileDirectory);
}
private static class ImageResource implements IResource {
private static final long serialVersionUID = 1L;
private final String rootFileDirectory;
public ImageResource(String rootFileDirectory) {
this.rootFileDirectory = rootFileDirectory;
}
@Override
public void respond(Attributes attributes) {
PageParameters parameters = attributes.getParameters();
List<String> indexedParams = getAllIndexedParameters(parameters);
if(!indexedParams.isEmpty() && isValidImagePath(indexedParams)) {
String pathToRequestedImage = getImagePath(indexedParams);
FileResourceStream fileResourceStream = new FileResourceStream(new File(pathToRequestedImage));
ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
resource.respond(attributes);
}
}
private boolean isValidImagePath(List<String> indexedParams) {
String fileName = indexedParams.get(indexedParams.size() -1);
return !FilenameUtils.getExtension(fileName).isEmpty();
}
private List<String> getAllIndexedParameters(PageParameters parameters) {
int indexedparamCount = parameters.getIndexedCount();
List<String> indexedParameters = new ArrayList<String>();
for(int i=0; i<indexedparamCount ;i++) {
indexedParameters.add(parameters.get(i).toString());
}
return indexedParameters;
}
private String getImagePath(List<String> indexedParams) {
return rootFileDirectory + File.separator + StringUtils.join(indexedParams, File.separator);
}
}
Любая помощь и советы приветствуются!Заранее спасибо.