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

Servlets/JSP Java Discussion :

Le contexte d'une application web Java EE


Sujet :

Servlets/JSP Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Le contexte d'une application web Java EE
    Salut les javaciens,

    je travaille sur une application web java EE, et je me trouve face un problème hors de ma portée pour le moment ^^, bref, j'ai besoin de définir un attribut visible dans toute l'application ( joue le rôle d'une base de données), sauf que mon objet doit changer sa valeur régulièrement (via un thread qui lit à partir d'un fichier xml chaque 30 second).
    Donc c'est pas seulement visible partout, mais aussi il est à jour

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    Bonjour,

    c'est un attribut donc il est dans une classe.

    S'il est dans une classe il suffit que tu ais accès à la référence de l'objet et que cette classe ait un getter (pour la lecture) et un setter (pour la mise à jour) sur cet attribut.

    Après "il suffit" que tu gardes l'accès à cette référence dans tout ton programme mais c'est peut être ce point qui te pose problème

  3. #3
    Membre habitué

    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2011
    Messages : 115
    Points : 188
    Points
    188
    Par défaut
    Bonjour,

    je vais partir du modèle MVC pour l’expliquer, Tu veux une classe de gestion d'une base de donnée threadé, créer le d'abord. Puis instancier cette classe dans le C du MVC (Controle : Servlet par exemple), puis faire un forward pour partager les informations ( ici ton objet) pout toud les autres pages, en particuliers les Vues .Mais je sais si c'est vraiment ta question mais qui sait?
    Innovation = Blending of idea , science and practice engineering

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Merci fiberMan et stephane pour vos réponses, mais je pense que j'ai mal expliquer mon problème.
    Alors, ce que je souhaite faire est d'intégrer un programme Java classique qui tourne sans arrêt (une boucle infinie) tout au long de l'application web et qui lit à partir d'un fichier xml chaque 30 seconds puis il met à jour son attribut (un ArrayList) que je voudrais par la suite l'exploiter à travers mes servlets (une instanciation) puis afficher les informations récupérées des fichiers xml dans des pages jsp.
    Le programme est déjà fait, mais le problème est que je ne sais pas comment l'intégrer dans une architecture web J2EE

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    Ton programme java tourne sur le serveur ?
    Si c'est la cas le problème est que lorsque tu as transmis ta page web au client tu perds la liaison avec lui.
    Il faut donc un "truc" dans ta page qui une fois chez le client déclenche le son rafraichissement régulièrement.

    Je pencherais pour du javascript.

    Malheureusement je n'ai pas les infos pour t'aider plus mais ça te donne des pistes pour occuper ton week-end

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Pas forcement stephane, ce que je projette faire c'est que si l'utilisateur a besoin de réactualiser les données sur la page, une requête http vers le serveur va référencer la bonne servlet qui va instancier à son tour la classe qui contient l'attribut initialisé par mon programme (ou ça peut être une servlet) qui tourne sans arrêt, et comme ça je garantie à l'utilisateur les toutes dernières informations récupérés

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    La servlet est sur le serveur donc si l'utilisateur réactualise la page la servlet va être à nouveau exécuté.
    Si ta servlet remplit les conditions que j'ai donné dans ma première réponse je ne vois pas où est le problème.

    Peut être qu'avec un peu de code je comprendrais mieux

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    mon problème n'est pas le référencement de l'objet, mais c'est comment le mettre à jour chaque certain nombre de seconds, et pas seulement quand il soit instancier après une requête http.

    voici le programme java que je souhaite intégrer, il marche bien :

    Le programme principale "LireXML" qui crée n threads selon le nombre de fichiers xml qui existent dans un répértoir "data" :

    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
    package com.web;
     
     
    import com.model.*;
     
    import javax.xml.bind.*;
    import java.io.*;
    import java.util.*;
     
    public class LireXML {
    	public static void main(String[] args) {
    		int delay = 5000;
    		ArrayList<ThreadReadingXML> ThreadsList = new ArrayList<ThreadReadingXML>();
    		File repertory = new File("data");
     
    		System.out.println("Nombre de fichiers :" + repertory.list().length);
    		for(int i=0;i<repertory.list().length;i++){
    			ThreadsList.add(new ThreadReadingXML(repertory.list()[i], delay));
    			new Thread(ThreadsList.get(i)).start();
    		}
        }
    }

    Puis, chaque thread va ouvrir le fichier transmet en paramètre, il lit via une librairie JAXB et affiche les informations récupérées.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package com.web;
     
    import java.io.File;
     
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Unmarshaller;
     
    import com.model.*;
     
    public class ThreadReadingXML implements Runnable{
    	private String serverName;
    	private Server server;
    	private long delay;
     
    	public ThreadReadingXML(String pServerName,long pDelay){
    		this.serverName = pServerName;
    		this.delay = pDelay;
    	}
     
    	public void DisplayServer(){
    		System.out.println("Nom du serveur :" + server.getServerName());
    		System.out.println("La taille mémoire :" + server.getMaximumMemorySize());
    		System.out.println("La taille mémoire utilisée :" + server.getMemoryUsedPercentage());
    		System.out.println("Nombre de consommateurs :" + server.getNbConsumers());
    		System.out.println("Nombre de messages reçus :" + server.getNbReceivedMessages());
    		System.out.println("Nombre de messages envoyés :" + server.getNbSentMessages());
    		System.out.println("Nombre de messages en attente :" + server.getNbWaitingMessages());
    		System.out.println("*********************************************");
    	}
     
    	public void start(){
    		Thread t = new Thread(this);
    		t.start();
    	}
     
    	public void run(){
    		while(true){
    			try{
    				JAXBContext jc = JAXBContext.newInstance(Server.class,QueueModel.class);
    		    	Unmarshaller unmarshaller = jc.createUnmarshaller();
    		    	unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
     
    		    	File fileIn = new File("data/"+this.serverName);
    		    	this.server = (Server) unmarshaller.unmarshal(fileIn);
    		    	DisplayServer();
    			    Thread.sleep(delay);
    			}catch(InterruptedException e){} 
    			 catch (JAXBException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}	
     
     
    }

    L'étape suivante sera d'enregistrer ces informations dans un attribut pour que je puisse y accéder via une servlet.
    L'utilisation des threads n'est pas indispensable, je peux les virer puisque d'après une petite recherche sur le forum, l'utilisation des threads est non autorisée selon les spécifs J2EE

  9. #9
    Membre actif
    Profil pro
    Developpeur
    Inscrit en
    Avril 2004
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Avril 2004
    Messages : 160
    Points : 212
    Points
    212
    Par défaut
    Citation Envoyé par JavaGeek Voir le message
    mon problème n'est pas le référencement de l'objet, mais c'est comment le mettre à jour chaque certain nombre de seconds,
    Pour ça tu peux utiliser les Tasks (tâche) en java, une tache planifié à executer chaque xx secondes.

  10. #10
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Salut tu peux instancier ton programme au moyen d'un Filter

    ton Filter ça marche comme une servlet et ça se mappe sur "*" si tu veux que ce soit un point d'entré.

    Ensuite ton filter, à son instanciation, instancie ton programme.
    et les méthodes obligatoires de traitement de requêtes d'un Filter ne doivent rien faire si ce n'est continuer à lancer la chaine de traitement de la requête.

    Tiens un petit tutorial pour les filters :
    http://www.tidytutorials.com/2009/11...r-example.html

    Cela dit, normalement, en architecture JEE, aucun Thread hors de contrôle du serveur d'applications ne doit être instancié (pour un problème de stabilité). C'est un règle. Donc c'est possible comme astuce, mais un peu "hors clou".

    Bon courage.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  11. #11
    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
    Tu veux échanger des informations entre plusieurs jvm dont une serait le serveur d'application et l'autre ton process.
    Ton serveur est très certainement équipé d'un annuaire JNDI, tu peux l'utiliser...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    Voici ce qu'il en est de ma compréhenson de la demande.Il vous faut :
    - disposer d'une ressource, sorte de source de données, dont on extraiera les informations pour en faire un rendu via JSP.
    - que cette source de données puisse activer un traitement périodique de rafraîchissement.

    Ma proposition de mise en oeuvre:
    Une classe, de type ServletContextListener, qui va gérer le cycle de vie de cette "ressource", et l'exposer en tant qu'attribut de l'application ( voir javax.servlet.ServletContext.setAttribute() ).

    Ainsi, lorsque votre application Web va démarrer ( resp. s'arrêter ), votre processus périodique - java.util.Timer/java.util.TimerTask devrait suffire - pourra être activé ( resp. annulé ).

    Etant donné le code exposé précédemment, je pense qu'une phase de retravail sera nécessaire ( en découpant bien les responsabilités des classes ).

    Attention, en travaillant en environnement multi-thread, veuillez à bien définir vos conditions de concurrence sur ces données ( qu'est-ce qui est partagé? qui sont les participants? comment assurer la cohérence des données à un instant t? ... ).

    Enfin, une note sur "On ne doit pas créer de Thread en environnement JEE", je tiens à y apporter une nuance.
    Dans la spécification EJB, effectivement, cette règle est soutenue et ça a tout son sens sur ces objets "distribuables".
    Par contre, dans la spécification Servlet, elle n'est pas vraiment indiquée, et j'aurai tendance à dire qu'elle n'a pas forcément court.
    Document de référence utilisé: Spec Servlet 2.4
    Voir SRV2.3.3.3: implique que l'application puisse avoir créé des threads.
    Voir SRV9.3: indique que le conteneur pourrait fournir des lookups JNDI sur des Threads créés par le développeur, même si non encouragé.
    voir SRV14.2.1.1 ( method destroy() ) et SRV14.2.6.1 ( method destroy() egalement ).
    Cette règle est néanmoins une très bonne directive en général.

    Cordialement,
    Sébastien

Discussions similaires

  1. Comment integrer JWebMail dans une application web Java
    Par hajoura89 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 11/08/2010, 14h29
  2. Hebergement pour une application web Java
    Par raimus88 dans le forum JSF
    Réponses: 2
    Dernier message: 20/06/2010, 10h42
  3. gérer les erreurs dans une application web java
    Par flamant dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 22/06/2009, 12h10
  4. Réponses: 1
    Dernier message: 22/05/2009, 16h15

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