繁体   English   中英

如果Wicket链接到CSS样式表,为什么页面会变为有状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM