我正在寻找有关如何使用 Wicket(版本 9)加载 CSS 文件和图标 spritesheet 的最佳实践方法。 我有几个 Java 项目,CSS 和图标 spritesheet 包含在
my-resources.jar
中。
之前,文件夹结构如下:
META-INF/resources/css/my.css
META-INF/resources/icons/spritesheet.png
CSS 包含在我的页面中,使用:
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(CssHeaderItem.forReference(new MyCssResourceReference()));
}
参考类在哪里:
package com.example.myapp.resources;
public class MyCssResourceReferenceextends CssResourceReference {
public MyCssResourceReference()
{
// number of .. corresponds to package this class is located in
super(MyCssResourceReference.class, "../../../../META-INF/resources/css/my.css");
}
}
在 CSS 内部,spritesheet 的引用如下:
.button {
background: url(../icons/spritesheet.png);
display: inline-block;
height: 20px;
width: 20px;
}
.button-close {
background-position: -40px 0px;
}
这样做的优点是可以隐式找到图标精灵表,无需将其作为资源安装。但它也有几个缺点:
..
移动到不同的包中,则需要调整路径中使用的 MyCssResourceReference
的数量因此,我现在想要重构CSS和图标精灵资源的交付方式。 在 Wicket 中执行此操作的首选方式是什么?
我想为我的资源保留一个单独的 JAR 文件,但我可以随意将资源移动到不同的文件夹/包。使用Wicket的共享资源机制有意义吗?
如果类 MyCssResourceReference 被移动到不同的包中,需要调整路径中使用的 .. 的数量
super(MyCssResourceReference.class, "../../../../META-INF/resources/css/my.css");
既然你想指向
root
,你可以这样做:
super(MyCssResourceReference.class, "/META-INF/resources/css/my.css");
Wicket 使用
java.lang.Class#getResource()
加载类路径资源。
“神奇”的是,在任何 Wicket 代码中都没有明确提及的情况下找到了图标精灵表
我不会说这是魔法!这就是相对路径的工作原理!浏览器计算绝对路径并发出 Wicket 处理的 HTTP 请求,不会出现任何问题。
undertow 在提供 META-INF 目录中的内容时遇到问题
您可以使用
/static
代替/META-INF
!或者您喜欢的任何其他自定义名称