2010-10-12 24 views
0

Ok, voici mon contrôleur à l'aide Wicket 1.5M2:Wicket: ListView pas mis à jour lorsque vous utilisez plusieurs fenêtres de navigateur pour CRUD simples

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()); 
    } 
} 
} 

Il fonctionne quand j'utilise une seule fenêtre du navigateur à la fois pour les opérations CRUD. Si j'utilise deux fenêtres, la liste des utilisateurs ne se met pas à jour, à moins que j'insère à nouveau l'adresse de base dans le champ d'adresse pour recharger la page. CLARIFICATION: L'utilisation simultanée de différents navigateurs dans le même ordinateur fonctionne bien. Ce n'est que lorsque vous utilisez plusieurs fenêtres dans le même navigateur que cela ne fonctionne pas.

  • Que se passe-t-il dans les coulisses?

  • Je mis setVersioned (false) pour la page entière, pourquoi est-ce que ma barre d'adresse affiche les adresses comme: http://localhost:8080/wicket/bookmarkable/package.name.Users?2 est-ce pas le numéro 2 de la version de la page? Le plus important est que dois-je faire pour que cela se comporte comme une application GUI de bureau, donc une fenêtre de navigateur == une instance de l'application.

Répondre

0

Je ne suis pas sûr de votre principal problème, mais setVersioned(false) fait exactement ce que vous pensez qu'il fait et semble fonctionner. Quel que soit le 2, ce n'est pas le numéro de version de la page Wicket; si c'était le cas, les 2 seraient venus après une période, pas un point d'interrogation.

Consultez cette page à propos de versioning, pas spécifiquement l'affichage du numéro de version: Wicket extreme consistent URLs

0

1) Dans votre mise en œuvre il y a une page statefull, et oui, est une version de la page "2?". Vous pouvez le vérifier en ouvrant de nouveaux onglets, ou en soumettant un formulaire - ce nombre augmentera.

Lorsque vous ouvrez un nouvel onglet dans le même navigateur, vous utilisez la même session. WebApp pense que vous êtes le même utilisateur sur l'onglet précédent et crée une autre version de la page. Maintenant, si vous soumettez des informations dans un nouvel onglet, cela ira, mais si vous revenez sur l'onglet précédent et soumettez quelques informations - Wicket détecte, que cette version de la page est obsolète et commence à rechercher la version actuelle . Pour une raison quelconque, votre info POST perd en ce moment.

2) Pour vous débarrasser de la version de la page, vous devez configurer votre page sans état. Pour ce faire, vous devez faire vos liens et former sans état: il suffit de les remplacer par StatelessLink et StatelessForm objets. En outre, définissez votre page setStatelessHint (true); et maintenant vos onglets fonctionneront correctement et sans versions. Développeur example.

3) Ce comportement n'est pas normal et vous devez gérer les cookies du navigateur. Plus à ce sujet here.