【问题标题】:Getting static web context resources to work on both bookmarkable and non-bookmarkable Wicket pages让静态 Web 上下文资源在可收藏和不可收藏的 Wicket 页面上工作
【发布时间】: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.4http://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)方法是什么

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


编辑:看起来我只需使用 &lt;wicket:link&gt;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:实际上我不确定&lt;wicket:link&gt; 是否是正确的解决方案,因为这些资源文件不是class path resources”。我想我的问题是,您能否在仍然使用网络上下文资源的同时完成这项工作(即,不使用这些类路径资源)?

【问题讨论】:

  • 奇怪的是,如果没有任何更改,我似乎无法再重现该问题...现在 CSS 引用类似于 css/main.css,除了 /foobar/report/42 之类的 URL就像../css/main.css

标签: css tomcat wicket static-resource


【解决方案1】:

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

我之前写过:

奇怪的是,如果没有任何改变,我似乎不能再 重现问题...

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

当我意识到这可以修复它时,我进行了更多测试,并且确实:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多