在 Wicket 1.4 应用程序中,我分别在[project root]/WebContent/css
和下有一些静态 CSS 和 JS 资源[project root]/WebContent/js
。
我的 Wicket HTML 文件src/resources/fi/company/product/pages
与src/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.4
或http://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 上下文资源的同时完成这项工作(即,不使用这些类路径资源)?