Как изменить расположение 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 Class getHomePage()
{
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 Class getHomePage()
{
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().