【问题标题】:Why does Wicket make a page stateful if it links to a CSS stylesheet?如果 Wicket 链接到 CSS 样式表,为什么它会使页面有状态?
【发布时间】:2012-04-10 15:03:27
【问题描述】:

我有一些 Wicket 页面的布局如下:

(主页.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 中的 &lt;link&gt; 标记和 AbstractWebPage 中的 add() 语句,页面将恢复为无状态。

我做错了什么?理想情况下,我希望用户看到的任何 URL 都是无状态的,但只是通过在所有页面上包含样式表,突然间我所有的无状态页面都是有状态的,没有明显的原因。

【问题讨论】:

    标签: java wicket stateless


    【解决方案1】:

    不要添加ResourceLink,而是覆盖用于此类(标题)链接的方法:

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.renderCSSReference(new ResourceReference(AbstractWebPage.class, "stylesheets/application.css"));
    }
    

    这不应使您的页面有状态。然后还有一个额外的好处,那就是不必在标记中添加任何东西。

    这也适用于组件和行为,使您能够在较低级别封装依赖项。 Wicket 将过滤重复项(前提是您向资源引用添加了唯一键)。

    不幸的是,它确实为您的 head 部分添加了额外的链接,因此请小心添加 64 个行为和组件以及它们自己的 JavaScript 和 CSS 资源。这将大大降低您的应用程序的速度(并且您会遇到浏览器的限制 - 看看您,IE!)

    【讨论】:

    • doah,我刚开始写同样的答案;)
    • 这看起来就是答案,但是在标记本身中包含一些东西的好处是,当您在 Web 浏览器中打开它时,它将使用正确的样式表。 Wicket 吸引人的地方之一是 HTML 模板大多是纯 HTML,因此它们可以让设计人员在不启动应用程序的情况下预览编辑结果。
    • 工作,一旦 ResourceReference 被 CssResourceReference 替换。编辑帖子被 Stack Overflow 阻止,因为它只需要 3 个字符来修复,而他们想要 6 个。唯一的问题是我现在有两个链接标签 - 一个指向错误的位置,另一个指向正确的位置。该 API 非常防弹,所以我发现很难删除最初在标记中的那个。 :)
    • 您可以使用
    【解决方案2】:

    我将把我找到的另一个选项放在那里。我不确定它是否更好......

    public class BookmarkableResourceLink<T> extends ResourceLink<T> {
        public BookmarkableResourceLink(String id, ResourceReference reference) {
            super(id, reference);
        }
    
        @Override
        protected boolean getStatelessHint() {
            return true;
        }
    }
    

    然后使用它代替 ResourceLink 本身,一切正常。我不确定为什么 ResourceLink 本身不这样做......但作为一种解决方法,这很干净。

    【讨论】:

      【解决方案3】:

      只是另一个提示,并不是真正的解决方案。我发现使用来自wicket devutils 的@StatelessComponent 注释很有用。它会引发异常并告诉您网站的哪个组件将您的页面破坏为有状态的。在 wicket 1.5 中,您可以在应用程序的 init 中 this.getComponentPostOnBeforeRenderListeners().add(new StatelessChecker()); 注册 StatelessChecker。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 2015-04-14
        • 2019-09-17
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多