Apache Wicket без сохранения состояния без страниц / запросов - PullRequest
5 голосов
/ 01 февраля 2010

Итак, я читал другой вопрос под тегом Wicket, сравнивая Apache Wicket и Apache Click . Краткое объяснение, на мой взгляд. Я больше знаком с миром калиток, чем с миром кликов.

Один из комментариев, которые я прочитал, заключался в том, что вы можете создавать страницы Wicket без сохранения состояния. Я начал думать об этом и не мог найти способ сделать запрос или запрос страницы для чего-то без сохранения состояния. Это, конечно, может пригодиться в некоторых ситуациях. Так как же начать использовать Wicket без состояния?

Ответы [ 5 ]

16 голосов
/ 17 октября 2010

Wicket по умолчанию не имеет состояния и переключается в режим с состоянием, когда это необходимо. Очень просто выйти из режима без сохранения состояния.

Я считаю полезным аннотировать страницы без сохранения состояния и компоненты без состояния с помощью @StatelessComponent, который находится в проекте wicket-devutils Я тогда добавляю StatelessChecker в моем WebApplication.init() методе, подобном этому:

protected void init(){
    ...
    this.addPostComponentOnBeforeRenderListener(new StatelessChecker());
    ...
}

Таким образом, я всегда получаю исключение из-за нарушающего состояния компонента.

8 голосов
/ 01 февраля 2010

Если страница является закладкой и не содержит компонентов / поведения, не связанных с состоянием, то страница автоматически не сохраняет состояния и не сохраняется в сеансе.Я думаю, что пока пользователь посещает только страницы без состояния, сеанс не будет создан.По большей части, если все, как отображается страница, может быть определено исключительно из конструктора без аргументов или конструктора, принимающего аргумент PageParameters.Обычные классы Link и Form не являются лицами без состояния, поэтому вместо них вам нужно будет использовать StatelessForm и StatelessLink.

4 голосов
/ 07 января 2012

Я предпочитаю проверить это в тесте.

поэтому каждый тест для перезаписи страницы без сохранения состояния

getStatelessWebPage()

, который по умолчанию возвращает ноль.

затем в базовом тесте у меня есть общий тест, который посещает все компоненты на странице и проверяет, является ли компонент без сохранения состояния или нет

@Test
public void checkForStateless()
{
    StatelessWebPage statelessPage = getStatelessWebPage();
    if (statelessPage != null)
    {
        Page page = (Page)statelessPage;
        if (!page.isPageStateless())
        {
            //find the reason
            Component statefulComponent = page.visitChildren(Component.class, new StatelessChecker());
            if (statefulComponent != null)
            {
                fail("Stateless page contains stateful component ["
                     +statefulComponent.getClass().getName()+" : "
                     + statefulComponent.getMarkupId() +"]");
            }
        }
    }
}

и

class StatelessChecker implements IVisitor<Component, Component>
{
    @Override
    public void component(Component component, IVisit<Component> iVisit)
    {
        if (!component.isStateless())
        {
            iVisit.stop(component);
        }
    }
}
3 голосов
/ 17 марта 2011

Если у вас есть страницы, которые вы намеренно хотите удостовериться, что они не имеют состояния, то метод setStatelessHint(boolean state) полезен.

Выдает предупреждение, если страница не без состояния.

для получения дополнительной информации см. Здесь: Wicket Pagesless

0 голосов
/ 11 января 2012

А как насчет ситуации, когда страница может быть без состояния или с состоянием в зависимости от того, аутентифицирован ли пользователь?

Примером может служить типичная панель «учетная запись», расположенная в верхней части большинства веб-страниц, на которой отображается имя пользователя, ссылка на профиль и т. Д.,

У большинства страниц сайта это будет вверху, что означает, что обе страницы должны быть как с состоянием, так и без состояния в зависимости от того, вошел ли пользователь в систему.

...