Почему Wicket делает страницу с состоянием, если она ссылается на таблицу стилей CSS? - PullRequest
1 голос
/ 27 марта 2012

У меня есть несколько страниц 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, указывая, что страница не является состоянием без сохранения состояния. Однако единственное, что я добавил, - это ссылка, которая, насколько я могу судить, прочитав код , не содержит состояний.

Естественно, если я удалю тег <link> в HTML и инструкцию add () в AbstractWebPage, страница вернется к состоянию без состояния.

Что я делаю не так? В идеале я хотел бы, чтобы любой URL-адрес, который пользователь когда-либо видел, был без сохранения состояния, но, просто включив таблицу стилей на все страницы, внезапно все мои страницы без сохранения состояния были сохранены без видимой причины.

Ответы [ 3 ]

8 голосов
/ 27 марта 2012

Вместо добавления ResourceLink переопределите метод, предназначенный для таких (заголовочных) ссылок:

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

Это не должно сделать вашу страницу состоящей из состояний.И еще есть дополнительное преимущество: не нужно ничего добавлять в разметку.

Это работает и для компонентов и поведения, что позволяет инкапсулировать зависимости на более низком уровне.Wicket отфильтрует дубликаты (при условии, что вы добавите уникальный ключ к ссылке на ресурс).

К сожалению, он добавляет дополнительные ссылки в ваш головной раздел, поэтому будьте осторожны с добавлением 64 вариантов поведения и компонентов с их собственными ресурсами JavaScript и CSS.Это значительно замедлит работу вашего приложения (и вы столкнетесь с ограничениями браузеров - смотрите на вас, IE!)

1 голос
/ 29 марта 2012

Я предложу другой вариант, который я нашел. Я не уверен, что это лучше ...

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

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

Тогда используйте это вместо самого ResourceLink, и все работает разумно. Я не совсем уверен, почему ResourceLink не делает это сам ... но в качестве обходного пути, это довольно чисто.

0 голосов
/ 30 марта 2012

просто еще один намек, не совсем решение. Я нашел это полезным для работы с @StatelessComponent аннотацией от калитки devutils. Он генерирует исключение и сообщает вам, какой компонент сайта разбивает вашу страницу, чтобы быть полностью заполненным. в калитке 1.5 вы можете this.getComponentPostOnBeforeRenderListeners().add(new StatelessChecker()); в начале вашего заявления зарегистрировать StatelessChecker.

...