Калитка: ListView не обновляется при использовании нескольких окон браузера в простом CRUD - PullRequest
0 голосов
/ 12 октября 2010

Хорошо, вот мой контроллер, использующий Wicket 1.5M2:

public class Users extends WebPage {

private static final List<User> users = Collections.synchronizedList(new ArrayList<User>());

public Users() {

    final UserForm userForm = new UserForm("userForm");
    add(userForm);

    add(new ListView<User>("users", users) {

        @Override
        protected void populateItem(ListItem<User> item) {
            final User user = item.getModelObject();

            item.add(new Label("name", user.getName()));
            item.add(DateLabel.forDatePattern("dateOfBirth", new Model(user.getDateOfBirth()), "dd.MM.yyyy"));
            item.add(new Label("email", user.getEmail()));

            item.add(new Link("editLink") {

                @Override
                public void onClick() {
                    userForm.setModelObject(user);
                }

            });

            item.add(new Link("removeLink") {

                @Override
                public void onClick() {
                    users.remove(user);
                }

            });
        }

    });

    setVersioned(false);
}

private class UserForm extends Form<User> {

    public UserForm(String id) {
        super(id, new CompoundPropertyModel<User>(new User()));

        add(new TextField<String>("name"));
        add(DateTextField.forDatePattern("dateOfBirth", "dd.MM.yyyy"));
        add(new TextField<String>("email"));
    }

    @Override
    protected void onSubmit() {
        User user = getModelObject();
        users.remove(user);
        users.add(user);
        setModelObject(new User());
    }
}
}

Это работает, когда я использую только одно окно браузера за один раз для операций CRUD.Если я использую два окна, список пользователей не обновляется, если я снова не введу базовый адрес в поле адреса для перезагрузки страницы.

УТОЧНЕНИЕ: Использование разных браузеров одновременно на одном компьютере работает хорошо.Только при использовании нескольких окон в одном браузере это не работает.

  • Что происходит за кулисами?

  • Я устанавливаю setVersioned (false)для всей страницы, почему в моей адресной строке отображаются такие адреса, как: http://localhost:8080/wicket/bookmarkable/package.name.Users?2 Разве это не номер 2 - версия страницы?

  • Самое главное, что делатьМне нужно сделать так, чтобы это работало как настольное приложение с графическим интерфейсом, поэтому одно окно браузера == один экземпляр приложения.

Ответы [ 2 ]

0 голосов
/ 11 августа 2014

1) В вашей реализации есть страница statefull, и да, «? 2» - это версия страницы.Вы можете проверить это, открыв новые вкладки или отправив форму - это число увеличится.

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

Теперь, если вы отправите некоторую информацию в новую вкладку, это будет нормально, но если вы вернетесь на предыдущую вкладкуи представить некоторую информацию - Wicket обнаруживает, что эта версия страницы устарела и начинает поиск актуальной версии.По какой-то причине ваша информация о POST теряется в это время.

2) Чтобы избавиться от версии страницы, вам нужно установить страницу без состояния.Для этого вам нужно сделать ссылки и сформировать их без сохранения состояния: просто замените их объектами StatelessLink и StatelessForm.Кроме того, установите свою страницу setStatelessHint ( true );, и теперь ваши вкладки будут работать корректно и без версий.Разработчик пример .

3) Это ненормальное поведение, и вам необходимо управлять файлами cookie браузера.Подробнее об этом здесь .

0 голосов
/ 12 октября 2010

Я не уверен насчет вашей основной проблемы, но setVersioned(false) делает именно то, что вы думаете, и работает. Какими бы ни были 2, это не номер версии страницы Wicket; если бы это было так, 2 пришло бы через точку, а не знак вопроса.

Посмотрите на этой странице информацию о версиях, в частности, не отображаются номера версий: экстремальные непротиворечивые URL Wicket

...