Страницы/запросы Apache Wicket без сохранения состояния

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

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


person Matt    schedule 01.02.2010    source источник
comment
stackoverflow.com/a/3441584/176897   -  person tetsuo    schedule 10.07.2013
comment
Приведенная выше ссылка не работает, попробуйте следующее: cwiki.apache.org/confluence/ display/WICKET/Stateless+pages   -  person snorbi    schedule 02.09.2013


Ответы (5)


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

person Geoff Reedy    schedule 01.02.2010
comment
Спасибо, Джефф. Теперь существование этих компонентов без гражданства... также имеет смысл. - person Matt; 01.02.2010

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

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

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

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

person Norbert Madarász    schedule 17.10.2010

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

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

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);
        }
    }
}
person kamiseq    schedule 07.01.2012

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

Он выдает предупреждение, если страница не имеет состояния.

дополнительную информацию см. здесь: страницы Wicket без сохранения состояния

person Raystorm    schedule 17.03.2011

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

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

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

person Volksman    schedule 11.01.2012