IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Problème de Scope : Request


Sujet :

JSF Java

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut Problème de Scope : Request
    Bonjour,

    Dans mon appli web (JEE) , j'ai une page qui affiche des informations provenant de ma base de données.
    Je souhaite qu'à chaque appel de cette page lors de la session utilisateur, les informations soient à nouveau recherchées dans la base.
    J'utilise RequestScope mais les informations affichées sont toujours celles du 1er appel de la page (comme en mode SessionScope).

    Merci pour votre aide.

    Mon code : appel de la page et méthode "init()" qui sélectionne les infos en base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:commandLink value="Contributeurs" action="pageTableauContributeur.xhtml" actionListener="#{contributeurManagerBean.init()}"/>
    Mon code : le bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import javax.enterprise.context.RequestScoped;
     
    @RequestScoped
    @Named
    public class ContributeurManagerBean implements Serializable {  
     
        @EJB
        private ColContributeurFacade colContributeurFacade;
     
        public ContributeurManagerBean() {
        }
     
        public void init() { 
     
            getColContributeurFacade().rechercherListeContributeur(getRefUtilisateurFacade().getUtilisateur().getRefCollectiviteFk());      <--- Recherche les infos dans la BDD
     
            initialiserContributeur();
     
            afficherTableauContributeur();

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ça ne serait pas un problème de cache ?

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Comment je peux vérifier çà ? Je n'ai jamais fait ce genre de chose.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Il y a différent moyen de vérifier mais dans ton cas, le plus simple serait de placer un point d'arrêt dans ton listener.
    S'il n'y va que la première fois, c'est qu'il a pris un résultat du cache.
    Dans ce cas, tu peux essayer d'ajouter l'attribut resetValues="true" à ton <p:commandLink>... sans garantie...

  5. #5
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Je n'ai pas ben saisi ce que tu souhaite car tu parle de page et de bean sans evoquer le controller.
    Je ne connais ton archi donc je ne pourrais pas etre precis dans ma reponse.

    Ce qui me semble être une solution:

    Si tu es dans un modele multicouche(....) ta page doit être liée à un controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ViewScoped
     @ManagedBean(name = "testController")
    qui doit contenir une methode init() annotée @postconstruct;ce qui voudra dire qu'a chaque chargement de la page la méthode init() sera appelée .Tu pourra donc à partir de la charger les beans que tu veux peut être dans des lazydatamodels ou autre ou faire des appels de fonction etc...

    J’espère avoir partiellement contribué à la résolution de ton problème


  6. #6
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Dans ce cas, tu peux essayer d'ajouter l'attribut resetValues="true" à ton <p:commandLink>... sans garantie...
    Je pense que la faiblesse de jsf (un bugg connu) est lorsqu'il y a une mise en place de validation de formulaire par exemple et que la validation echoue;
    dans ce cas il y a sauvegarde de l'etat (ex:dialogue de creation ou autre) pour restituer les donnée valides afin que le user complete sa saisie .
    Il y a donc un problème de rafraichissement des données car le state management se fait de la sorte:
    on peut alors utiliser le resetValues pour vider les données saisies mais pas pour lancer une nouvelle requete à la base.

    il faut voir dans ce cas si le backtracking est ta solution mais je pense qu'il faut une annotation postconstruct qui, à chaque chargement de la page, appelle la méthode init() qui se chargera de faire ce que tu souhaites et t'afficher les nouvelles données.

    Bon courage,

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Bonjour et merci pour tes réponses.

    En fait j'ai déjà essayé avec une annotation postConstruct sur la méthode init() de mon bean, mais ça ne marche pas mieux!

    PS : j'ai omis de préciser que j'utilise Primefaces 6.1.2 et JSF 2.2

  8. #8
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Ce n'est pas un managedBean!
    Il faut que ta page connaisse le managedBean en viewscope qui lui connaitra tes bean et pourra les manipuler pour les transmettre aux autres couches .

    Dans ce cas a chaque chargement de la page, ta fonction postconstruct se lancera automatiquement.

    Je te recommende de lire cela et prendre les decisions qui te sembleront etre les meilleur pour ce que tu veux mettre en place.
    https://dzone.com/articles/named-vs-...laquo-glenware

    Bon courage

  9. #9
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Si je remplace Named par ManagedBean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @ViewScoped
    @SessionScoped
    @ManagedBean
    public class NoteManagerBean implements Serializable {
     
        @ManagedProperty(value = "#{accueilManagerBean}")
        private AccueilManagerBean acm = new AccueilManagerBean();
     
        public NoteManagerBean() {
        }
     
        @PostConstruct
        public void init() {
     
            System.out.println(acm.getPageHauteur());
        }
    ...
     
     
    @ViewScoped
    @SessionScoped
    @ManagedBean
    public class AccueilManagerBean implements Serializable {
     
        private String pageLargeur;                    
        private String pageHauteur; 
    ...
    + getter/setter 
    ...

    J'obtiens l'erreur suivante :

    Grave: JSF ne pourra pas créé le bean géré «accueilManagerBean» lorsqu’il sera demandé. Les problèmes suivants ont été détectés*:
    - La classe de bean ou de propriété «AccueilManagerBean» du bean géré «accueilManagerBean» est introuvable.
    FATAL: JSF1073 : javax.faces.view.facelets.TagAttributeException intercepté durant le traitement de RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=/pageAccueilSite.xhtml @48,73 test="#{accueilManagerBean.affichageBonjour}" Impossible de créer le bean géré «accueilManagerBean». Les problèmes suivants ont été détectés*:
    - La classe de bean ou de propriété «AccueilManagerBean» du bean géré «accueilManagerBean» est introuvable.
    FATAL: /pageAccueilSite.xhtml @48,73 test="#{accueilManagerBean.affichageBonjour}" Impossible de créer le bean géré «accueilManagerBean». Les problèmes suivants ont été détectés*:
    - La classe de bean ou de propriété «AccueilManagerBean» du bean géré «accueilManagerBean» est introuvable.

  10. #10
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     @ManagedBean(name = "testController")
    La page va être liée à un seul managedBean auquel tu donnera un nom que tu utilisera au niveau de la page.

    Ce managedBean contiendra tes bean et des variables globales etc que tu pourra utiliser au niveau de ta page.

    Ainsi que la methode init() annotée postconstruct.

    Pas la peine d'utiliser managedProperty.

    TA PAGE NE CONNAIT PAS "NoteManagerBean" donc ton bean AccueilManagerBean que tu a annoté managedBean ne pourra pas etre géré.

    Le modele contiendra tes bean
    Au niveau du web il faut lié ta page a un controller(manageBean) qui contiendra des entités du model donc ta page connaitra un seul managedBean qui communiquera au service etc...

    Bon courage,

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/12/2010, 11h56
  2. Probléme avec le scope request
    Par Esil2008 dans le forum JSF
    Réponses: 8
    Dernier message: 19/02/2010, 19h09
  3. Problème avec scope "request"
    Par lion13 dans le forum JSF
    Réponses: 4
    Dernier message: 27/10/2008, 12h53
  4. Réponses: 5
    Dernier message: 16/07/2007, 11h00
  5. [JSP SERVLET]Moment d'expiration des objets du scope Request
    Par Little_Goldo dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 25/08/2005, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo