【发布时间】:2012-06-12 08:55:29
【问题描述】:
在 Wicket 1.4 应用程序中,我在 [project root]/WebContent/css 和 [project root]/WebContent/js 下分别有一些静态 CSS 和 JS 资源。
我的 Wicket HTML 文件位于 src/resources/fi/company/product/pages 中,对应的 Java 类位于 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 为例如 http://localhost:8080/report/42.4 或 http://localhost:8080/?wicket:interface=:6:::: ),资源引用显示为:
<link rel="stylesheet" type="text/css" href="../css/main.css"/>
但是,我们刚刚注意到,当应用程序部署在 (Tomcat) 根目录之外的其他位置时,资源会在非书签页面上中断。
换句话说,当 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)方法是什么?
我可以切换到专门使用可收藏的页面(这需要更改页面的构造函数),但我认为这不是必需的......
编辑:看起来我只需使用 <wicket:link>、as advised in this answer 就可以(在大多数地方)使用 CSS 资源:
<head>
<wicket:link>
<link rel="stylesheet" type="text/css" href="css/main.css"/>
</wicket:link>
</head>
但是,现在 CSS 引用在带有类似 http://localhost:8080/foobar/report/42.9 的 URL 的页面上被破坏了
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> 是否是正确的解决方案,因为这些资源文件不是“class path resources”。我想我的问题是,您能否在仍然使用网络上下文资源的同时完成这项工作(即,不使用这些类路径资源)?
【问题讨论】:
-
奇怪的是,如果没有任何更改,我似乎无法再重现该问题...现在 CSS 引用类似于
css/main.css,除了 /foobar/report/42 之类的 URL就像../css/main.css。
标签: css tomcat wicket static-resource