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

Tre*_*kaz 1 java wicket stateless

我有一些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>
Run Code Online (Sandbox Code Playgroud)

(HomePage.java)

public class HomePage extends AbstractWebPage {
    public HomePage() {
        // Nothing necessary (real application initialises some other links here.)
    }
}
Run Code Online (Sandbox Code Playgroud)

(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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我访问我的主页时/admin,浏览器会立即重定向到/admin?0,表明该页面不是无状态的.但是,我唯一添加的是一个链接,据我所知,通过阅读代码,它不是有状态的.

当然,如果我删除<link>HTML 中的标记和AbstractWebPage中的add()语句,页面将返回无状态.

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

Mar*_*rst 8

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

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

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

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

不幸的是,它确实为您的头部添加了额外的链接,因此请谨慎使用自己的JavaScript和CSS资源添加64个行为和组件.这将大大减慢您的应用程序(并且您将遇到浏览器的限制 - 看着你,IE!)