3

在 Wicket 1.4 应用程序中,我分别在[project root]/WebContent/css和下有一些静态 CSS 和 JS 资源[project root]/WebContent/js

在此处输入图像描述

我的 Wicket HTML 文件src/resources/fi/company/product/pagessrc/main/fi/company/product/pages. (在生成的 WAR 文件中,HTML 和属性文件当然与 Java 类位于相同的位置。)

HTML 文件包含对资源的引用,例如:

<head>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    <script type="text/javascript" src="js/calendar.js"></script>
</head>

这在任何地方都可以正常工作(或者我们直到最近才这么认为)。注意:我的 Java 代码根本没有引用这些资源。

查看呈现页面的来源(其 URL 为 eghttp://localhost:8080/report/42.4http://localhost:8080/?wicket:interface=:6::::),资源引用显示为:

<link rel="stylesheet" type="text/css" href="../css/main.css"/> 

但是,我们刚刚注意到,当应用程序部署在 (Tomcat) root 以外的其他位置时,资源会在非书签页面上中断。

换句话说,当 URL 例如

http://localhost:8080/foobar/?wicket:interface=:2::::

一个页面是指

<link rel="stylesheet" type="text/css" href="../css/main.css"/>

...浏览器尝试在无效 URL 处获取资源

http://localhost:8080/css/main.css

现在,不管部署路径如何,让这些静态资源正常工作的最简单(但非 hacky)方法是什么?

我可以切换到专门使用可书签页面(这需要更改页面的构造函数),但我认为这不是必需的......


编辑:看起来我只是通过使用 CSS 资源(在大多数地方)工作<wicket:link>正如这个答案中所建议的

<head>
    <wicket:link>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    </wicket:link>
</head>

但是,现在 CSS 引用在具有类似 URL 的页面上被破坏http://localhost:8080/foobar/report/42.9

Wicket 试图用“css/main.css”路径做一些奇怪的事情:

ERROR org.apache.wicket.RequestCycle - Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
    at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:212)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:89)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:305)

编辑2:实际上我不确定<wicket:link>这里是否是正确的解决方案,因为这些资源文件不是类路径资源”。我想我的问题是,您能否在仍然使用 Web 上下文资源的同时完成这项工作(即,不使用这些类路径资源)?

4

1 回答 1

1

对了,我解决了,结果结果很意外。

早些时候我写道:

奇怪的是,如果没有任何更改,似乎我无法再重现该问题...

这并不完全正确,因为我做了一个小改动(我认为这无关紧要):我删除了一个文件,该文件WebContent/index.jsp在我们的项目中是一个无用的残余。

一旦我意识到这可以解决它,我做了更多的测试,事实上:

要使静态资源按预期工作,您不能在根 Web 内容目录index.htmlindex.jsp(即 CSS 和 JS 资源目录的父级)中有or../文件,因为在某些情况下会破坏引用。

这甚至可能不是特定于 Wicket 的,但也许是特定于 Tomcat 的——如果有人知道更多,请随时插话。我怀疑这个问题是否对其他人有帮助,但仍然很高兴我让它工作了!

于 2012-06-12T12:59:01.620 回答