Как изменить расположение html файла в Wicket
Wicket требует, чтобы файлы html и java располагались в одном каталоге пакета. Здесь мы покажем вам, как поместить файл java и html в другой каталог.
Например,
-
Index.java located at Project /src/main/java/com/example
-
Index.Html located at Project /src/main/webapp/pages , root context “/” at “/src/main/webapp”.
Согласно Wicket in Action
Метод Wicket по умолчанию для поиска ресурсов позволяет быстро переключаться между файлами Java и файлами разметки во время разработки, поскольку они находятся рядом друг с другом. Кроме того, с помощью этого алгоритма компоненты вашего пакета можно сразу повторно использовать без необходимости настраивать пользователям, откуда загружаются шаблоны; если класс компонентов может быть найден в пути к классам, их ресурсы тоже. Это мощный инструмент по умолчанию, и вы можете дважды подумать, прежде чем реализовывать что-то нестандартное.
Калитка 1.3
Если вы все еще настаиваете на настройке пути к ресурсам, здесь я предлагаю 2 способа сделать это в Wicket 1.3.
1. Найдите ресурс с веб-контекстом
Создайте класс, который расширяет классResourceStreamLocator, и переопределите следующую функцию
-
найти (Класс clazz, Строковый путь)
package com.example; import java.net.MalformedURLException; import java.net.URL; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.UrlResourceStream; import org.apache.wicket.util.resource.locator.ResourceStreamLocator; import org.apache.wicket.util.string.Strings; public class MyOwnStreamLocator extends ResourceStreamLocator { @Override public IResourceStream locate(Class> clazz, String path) { String location; String extension = path.substring(path.lastIndexOf('.') + 1); String simpleFileName = Strings.lastPathComponent(clazz.getName(), '.'); location = "/pages/" + simpleFileName + "." + extension; URL url; try { // try to load the resource from the web context url = WebApplication.get().getServletContext().getResource(location); if (url != null) { return new UrlResourceStream(url); } } catch (MalformedURLException e) { throw new WicketRuntimeException(e); } // resource not found; fall back on class loading return super.locate(clazz, path); } }
Класс приложения Wicket
package com.example; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.util.file.WebApplicationPath; public class MyApplication extends WebApplication { public ClassgetHomePage() { return Index.class; } @Override protected void init() { getResourceSettings().setResourceStreamLocator(new MyOwnStreamLocator()); } }
2. Найдите ресурс с помощью ResourceFinder
Создайте класс, который расширяет классResourceStreamLocator и переопределяет следующие две функции
-
locate (класс clazz, путь к строке, стиль строки, языковой стандарт локали, расширение строки)
-
locateByResourceFinder (класс clazz, путь к строке)
package com.example; import java.util.Locale; import org.apache.wicket.util.file.IResourceFinder; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.locator.ResourceStreamLocator; import org.apache.wicket.util.string.Strings; public class MyOwnFinderStreamLocator extends ResourceStreamLocator { private IResourceFinder resourceFinder; public void addFinder(IResourceFinder resourceFinder) { if (resourceFinder != null) { this.resourceFinder = resourceFinder; } } @Override public IResourceStream locate(Class> clazz, String path, String style, Locale locale, String extension) { String simpleFileName = Strings.lastPathComponent(clazz.getName(), '.') + "." + extension; IResourceStream stream = locate(clazz, simpleFileName); if(stream!=null) return stream; else return super.locate(clazz, path,style,locale,extension); } @Override protected IResourceStream locateByResourceFinder(Class> clazz, String path) { IResourceStream resourceStream = null; resourceStream = resourceFinder.find(clazz, path); if (resourceStream == null) { // try by using class loader resourceStream = locateByClassLoader(clazz, path); } return resourceStream; } }
Класс приложения Wicket
package com.example; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.util.file.WebApplicationPath; public class MyApplication extends WebApplication { public ClassgetHomePage() { return Index.class; } @Override protected void init() { //resource finder MyOwnFinderStreamLocator resourceStreamLocator = new MyOwnFinderStreamLocator(); WebApplicationPath webContainerPathFinder = new WebApplicationPath(getServletContext()); webContainerPathFinder.add("/pages/"); resourceStreamLocator.addFinder(webContainerPathFinder); getResourceSettings().setResourceStreamLocator(resourceStreamLocator); } }
Готово.
Скачать -Wicket-1.3-Resource-Loading.zip (7 КБ)
Калитка 1.4
Для Wicket 1.4 все проще. См. Следующую структуру каталогов:
-
Hello.java in /src/main/java/com/example/hello
-
Hello.html in /src/main/webapp/pages/com/example/hello
Вы можете настроить, где html загружается в методеinit() следующим образом:
package com.example; import org.apache.wicket.Page; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.settings.IResourceSettings; import com.example.hello.Hello; public class MyApplication extends WebApplication { @Override public Class extends Page> getHomePage() { return Hello.class; //return default page } @Override protected void init() { super.init(); IResourceSettings resourceSettings = getResourceSettings(); resourceSettings.addResourceFolder("pages"); } }
Скачать -Wicket1.4-resource-loading.zip (8 КБ)
Maven ways
В качестве альтернативы вы можете контролировать, куда загружаются файлы HTML, с помощью тега ресурсов Maven следующим образом:
Файл: pom.xml
WicketExamples src/main/resources src/main/webapp/pages
В Maven нет необходимости переопределять метод WebApplicationinit().