如何正确加载Wicket CSS和Icon资源?

问题描述 投票:0回答:1

我正在寻找有关如何使用 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
    的数量
  • “神奇”的是,在任何 Wicket 代码中都没有明确提及的情况下找到了图标精灵表
  • undertow 在 META-INF 目录 (https://issues.redhat.com/browse/UNDERTOW-2186) 中提供内容时遇到问题,如果应用程序在 JBOSS 服务器中运行,这会导致问题

因此,我现在想要重构CSS和图标精灵资源的交付方式。 在 Wicket 中执行此操作的首选方式是什么?

我想为我的资源保留一个单独的 JAR 文件,但我可以随意将资源移动到不同的文件夹/包。使用Wicket的共享资源机制有意义吗?

java css wicket sprite-sheet
1个回答
0
投票

如果类 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
!或者您喜欢的任何其他自定义名称

© www.soinside.com 2019 - 2024. All rights reserved.