[英]Why does Wicket make a page stateful if it links to a CSS stylesheet?
我有一些这样的Wicket页面:
(HomePage.html)
<html>
<head>
<title>Front</title>
<link wicket:id="applicationCss" rel="stylesheet" type="text/css"
href="stylesheets/application.css"/>
</head>
<body>
<!-- Content unnecessary -->
</body>
</html>
(HomePage.java)
public class HomePage extends AbstractWebPage {
public HomePage() {
// Nothing necessary (real application initialises some other links here.)
}
}
(AbstractWebPage.java)
public abstract class AbstractWebPage extends WebPage {
protected AbstractWebPage() {
setStatelessHint(true);
// *** the trouble-maker:
add(new ResourceLink<>(
"applicationCss",
new CssResourceReference(AbstractWebPage.class,
"stylesheets/application.css")));
}
}
当我通过/admin
访问主页时,浏览器会立即重定向到/admin?0
,表明该页面不是无状态的。 但是,我唯一添加的是一个链接, 据我阅读代码所知,该链接不是有状态的。
自然,如果删除HTML中的<link>
标记和AbstractWebPage中的add()语句,则页面将返回无状态。
我究竟做错了什么? 理想情况下,我希望用户看到的任何URL都是无状态的,但是仅通过在所有页面上包含样式表,突然所有我的无状态页面都是无状态的,没有明显的原因。
代替添加ResourceLink
,重写用于此类(标题)链接的方法:
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.renderCSSReference(new ResourceReference(AbstractWebPage.class, "stylesheets/application.css"));
}
这不应使页面有状态。 然后还有另一个好处,就是不必在标记中添加任何内容。
这也适用于组件和行为,使您可以封装较低级别的依赖项。 Wicket将过滤重复项(前提是您向资源引用中添加了唯一键)。
不幸的是,它确实向您的头部添加了额外的链接,因此请谨慎使用自己的JavaScript和CSS资源添加64个行为和组件。 这将大大降低您的应用程序运行速度(并且您会遇到浏览器的限制,例如IE)!
我将在那里找到另一个选择。 我不确定是否更好...
public class BookmarkableResourceLink<T> extends ResourceLink<T> {
public BookmarkableResourceLink(String id, ResourceReference reference) {
super(id, reference);
}
@Override
protected boolean getStatelessHint() {
return true;
}
}
然后使用它代替ResourceLink本身,一切正常。 我不确定确切为什么ResourceLink本身不执行此操作...但是作为一种解决方法,这很干净。
只是另一个提示,并不是真正的解决方案。 我发现它有用一起工作@StatelessComponent
从检票口devutils annotion。 它会引发异常,并告诉您该站点的哪个部分将您的页面破坏为全状态。 在小门1.5中,您可以this.getComponentPostOnBeforeRenderListeners().add(new StatelessChecker());
在您的应用程序的初始化中注册StatelessChecker。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.