1

我有一些 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>

(主页.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,表明该页面不是无状态的。但是,我唯一添加的是一个链接,据我通过阅读代码可以看出,它不是有状态的。

自然,如果我删除<link>HTML 中的标记和 AbstractWebPage 中的 add() 语句,页面将恢复为无状态。

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

4

3 回答 3

8

而不是添加 a 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!)

于 2012-03-27T06:44:49.060 回答
1

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

public class BookmarkableResourceLink<T> extends ResourceLink<T> {
    public BookmarkableResourceLink(String id, ResourceReference reference) {
        super(id, reference);
    }

    @Override
    protected boolean getStatelessHint() {
        return true;
    }
}

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

于 2012-03-29T00:24:59.367 回答
0

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

于 2012-03-29T22:54:07.863 回答