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 :

Calcul du nombre de visite sur mon site


Sujet :

JSF Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut Calcul du nombre de visite sur mon site
    Bonjour,
    Je voudrais savoir comment calculer le nombre de visite sur mon site, c a d, à l'ouverture d'une session, le compteur s'incrémente.
    J'ai essayé avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:outputText value="#{bean.welcome}" escape="false"/>
    Dans getWelcome() j'incrémente le nombre de visite sauvegardé dans un fichier txt.
    Cette procédure fonctionne, mais, le problème c'est que à chaque visite de la page qui contient bean.welcome la valeur s'incrément et donc j'obtiens une fausse valeur .

    Merci de m'aider
    There is more than one way to do it

  2. #2
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Points : 955
    Points
    955
    Par défaut
    mettez alors ton incrémentation dans la méthode login de votre site.
    Ce qu'on appelons le hasard n'est que notre incapacité à comprendre un degré d'ordre supérieur.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    En faite, j'ai pas mis de page de login pour mon site perso, c'est accessible à tous.
    J'ai l'idée de faire une page intermédiaire de redirection contenant un h:commandLink pour incrémenter mon compteur, mais je voudrais éviter l'ajout d'une autre page .

    Merci
    There is more than one way to do it

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    Tu as besoin de stats détaillées pour ton site, ou tu veux juste faire un compteur toi même dans ton code?
    Si tu es dans le premier cas de très bon outils existent, comme par exemple AwStats:
    http://awstats.sourceforge.net/

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    Si tu veux faire un traitement à chaque connexion d'un client, il doit y avoir un listener tomcat pour l'ouverture de session client.

    en cherchant vite fait sur google:

    javax.servlet.http. HttpSessionListener


    Session lifecycle changes :

    -Session creation

    -Session invalidation

    -Session timeout

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Bonjour,
    Merci Malone pour les réponses.

    1- pour AwStats, est ce que je peux l'utiliser avec jsf?

    2- pour l'interface javax.servlet.http. HttpSessionListener qui hérite de java.util.EventListener. Comment et quand je doit déclencher la méthode :
    void sessionCreated(HttpSessionEvent se)

    Thanks
    There is more than one way to do it

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    Ce n'est pas toi qui déclenche le traitement , un listener écoute (d'où le nom) , et ses méthodes sont appelées quand l'événement attendu est déclenché.
    Dans ton cas, l'interface http. HttpSessionListener a deux méthodes, une appelée à la création d'une session, et une autre à sa destruction.


    Pour pouvoir utiliser un listener, tu dois:

    -Créer une classe qui implémente l'interface désirée.


    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
     
    package fr.test.listeners;
     
    import javax.servlet.http.HttpSessionEvent;
     
    public class MaClasseListener implements javax.servlet.http. HttpSessionListener{
     
    	public void sessionCreated(HttpSessionEvent arg0) {
    		// c'est la méthode qui t"intéresse,
                   // c'est la que tu vas incrémenter ton compteur
                  // en base de donnée ou je ne sais quoi.
     
    	}
     
    	public void sessionDestroyed(HttpSessionEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    -Déclarer le listener dans le fichier web.xml , avec le chemin vers la classe que tu as crée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	<listener>
    		<listener-class>fr.test.listeners.MaClasseListener</listener-class>
    	</listener>
    Pour awStats avec tomcat c'est faisable mais ça à l'air assez chiant niveau config, je n'ai jamais essayé.
    Apparemment webalizer se configure assez facilement avec Tomcat:
    http://www.mail-archive.com/tomcat-u.../msg69842.html

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    J'ai suivie ces étapes pour l'utilisation du listener :
    - J'ai créé une classe qui implémente l'interface désiré ayant dans la méthode sessionCreated() le code qui incrémente mon compteur stocké dans un fichier texte :
    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
    30
    31
    32
    33
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.HttpSessionEvent;
    import javax.faces.context.FacesContext;
     
    public class fichiercompt implements javax.servlet.http.HttpSessionListener {
    	public void sessionCreated(HttpSessionEvent event) {
    		System.out.println(event.getSession().getId());
    		FacesContext context = FacesContext.getCurrentInstance();
    		ServletContext servletContext = (ServletContext)context.getExternalContext().getContext();
     
    		String webRoot = servletContext.getRealPath("/");
     
    		try {
    		BufferedReader fichier = new BufferedReader(new FileReader(webRoot + "files/source.txt"));
    		String ligne ;
    		ligne = fichier.readLine();
     
    		int nb = Integer.parseInt(ligne);
    		nb++;
    	PrintWriter fich = new PrintWriter(new FileWriter(webRoot + "files/source.txt"));
    fich.println(nb);
    fich.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
     
    	}
    	public void sessionDestroyed(HttpSessionEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
    la classe fichiercompt se situe dans le package par défaut

    - et j'ai ajouté ceci dans le web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <listener>
    		<listener-class>fichiercompt</listener-class>
    	</listener>
    Mais le compt ne s'incrémente pas et même l'affichage sur le console ne se produit pas

    Merci pour ton aide
    There is more than one way to do it

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    La déclaration dans web.xml doit être sur le nom complet de la classe, donc ses packages+nom de la classe (ex fr.toto.TaClasse).

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    je l'ai mis dans le default package

    J'ai redémarré tomcat et l'affichage sur le console s'est produit

    mais, j'ai obtenue une autre exception :
    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
    30
    31
    32
    33
    34
    35
    36
    37
     
    FCB10CBE2728CFCAA0E1A55ADFD74216
    20 juil. 2009 18:43:43 org.apache.catalina.session.StandardSession tellNew
    GRAVE: L'�couteur d'�v�nement de session (session event listener) a g�n�r� une exception
    java.lang.NullPointerException
    	at fichiercompt.sessionCreated(fichiercompt.java:13)
    	at org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:397)
    	at org.apache.catalina.session.StandardSession.setId(StandardSession.java:369)
    	at org.apache.catalina.session.ManagerBase.createSession(ManagerBase.java:829)
    	at org.apache.catalina.session.StandardManager.createSession(StandardManager.java:291)
    	at org.apache.catalina.connector.Request.doGetSession(Request.java:2312)
    	at org.apache.catalina.connector.Request.getSession(Request.java:2075)
    	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833)
    	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:844)
    	at org.apache.jasper.runtime.PageContextImpl._initialize(PageContextImpl.java:146)
    	at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:124)
    	at org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:107)
    	at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:63)
    	at org.apache.jsp.index_jsp._jspService(index_jsp.java:44)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Unknown Source)
    La ligne qui a généré cet exception est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ServletContext servletContext(ServletContext)context.getExternalContext().getContext();
    Avant l'utilisation de la classe du listener, j'ai pas eu cet exception
    There is more than one way to do it

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    A mon avis tu as un null pointer exception sur le FacesContext , vu que l'utilisateur vient de créer sa session, et n'est pas encore passé par la servlet de jsf, donc le cycle de vie de jsf est nul à ce stade.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Comment s'assurer que le servlet de jsf est créé??
    There is more than one way to do it

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    La servlet jsf est instanciée quand une requête lui est adressée , voir le mapping de FacesServlet dans web.xml .
    Enfin bref, à première vue la n'est pas ton problème, dans ton cas tu veux trouver le chemin absolu de ta webapp pour ton fichier.
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    System.out.println(event.getSession().getId());
    FacesContext context = FacesContext.getCurrentInstance();
    ServletContext servletContext = (ServletContext)context.getExternalContext().getContext(); 
    String webRoot = servletContext.getRealPath("/");
    tu peux récupérer le context via la session de l'event passé à ton listener.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println(event.getSession().getId());
    ServletContext context = event.getSession().getServletContext();
    String webRoot = context.getRealPath("/");
    Par contre:
    -Utiliser un fichier texte pour compter les visites, c'est à dire ouvrir/écrire/fermer à chaque fois que quelqu'un se connecte, c'est pas vraiment top niveau performances si tu reçois beaucoup de visites ^^
    -Pour le nommage des classes en java, pense aux bonnes pratiques, public class FichierCompt plutôt que public class fichiercompt (cf Faq Java - convention de nommage)

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Merci Malone pour cette réponse

    -Utiliser un fichier texte pour compter les visites, c'est à dire ouvrir/écrire/fermer à chaque fois que quelqu'un se connecte, c'est pas vraiment top niveau performances si tu reçois beaucoup de visites ^^
    Si je veux éviter la mise en place d'une base de donnée, quel est la solution la plus performante que l'utilisation de fichier?

    There is more than one way to do it

Discussions similaires

  1. [Word] Charger un document Word sur mon site et connaitre le nombre de page
    Par Shunparis dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/09/2011, 16h03
  2. Nombre de connectés sur mon site
    Par JCMANSION dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/06/2010, 10h22
  3. Nombre de visites sur un site
    Par Ontolingua dans le forum Statistiques
    Réponses: 1
    Dernier message: 11/06/2009, 19h05
  4. Visites bizarres sur mon site. Pirates?
    Par lysandre dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 04/03/2008, 20h07
  5. Calcul des visites sur un site
    Par inferno66667 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/11/2005, 10h46

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