2010-10-12 3 views
0

Ok, вот мой контроллер с помощью Wicket 1.5M2:Калитка: ListView не обновляется при использовании нескольких окон браузера в простой CRUD

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 (ложь) для всей страницы, почему это, что мой адрес бар показывает адреса, такие как: http://localhost:8080/wicket/bookmarkable/package.name.Users?2 Разве это не номер 2 версии страницы?

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

ответ

0

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

Заканчивать эту страницу о версионности, в частности, не отображаются номера версий: Wicket extreme consistent URLs

0

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

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

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

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

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