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

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Récupérer le contexte d'exécution et ses ressources


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut Récupérer le contexte d'exécution et ses ressources
    Bonjour,

    j'utilise dans mes servlets l'annotation @WebServlet.

    Celle-ci remplace désormais l'utilisation du Web.xml et déclare les servlets comme ressources dans JNDI si j'ai tout bien compris.

    J'essaie depuis une servlet de construire la liste des servlets déclarées et connues par mon serveur Tomcat. Je devrais pouvoir récupérer cette info depuis le JNDI.

    Pour y accéder, j'essaie d'utiliser ce code trouvé sur le site d'Apache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    A partir de là, j'ai l'espoir de construire une collection de servlets.

    Sauf que j'obtiens une erreur :

    org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: "Servlet.service()" pour la servlet servlets.CentralStation a généré une exception
    java.lang.ClassCastException: javax.naming.InitialContext cannot be cast to javax.naming.Name

    Avez-vous une idée du pourquoi de cette erreur (au-delà du fait que je ne peux pas caster le context) alors que c'est la méthde indiquée par Apache eux-mêmes ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il n'y a pas de Name dans ces deux lignes, donc j'en conclue que l'erreur n'est pas là mais dans du code que tu ne nous montre pas...

  3. #3
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    merci pour ton aide.

    Je ne montre pas la suite du code parce qu'elle n'existe pas encore

    Je voudrais pouvoir m'appuyer sur ce début de code de la fondation Apache (on retrouve ce même début un peu partout dans les forums) afin d'étudier comment je pourrais constituer une liste/collection d'objets vu comme des ressources par le Context de Tomcat.

    Je ne maîtrise pas du tout ces aspects Context, JNDI...

    Rien que ces 2 lignes provoquent l'erreur que j'ai citée, le debugger d'Eclipse pointant la seconde.

    Je ne sais vraiment pas quoi faire pour aller plus loin. Je suis perdu en fait.

    Voilà ce que j'ai essayé de construire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Obtain our environment naming context
    		try {
    			Context initCtx = new InitialContext();
    			Context envCtx = (Context) initCtx.lookup("java:comp/env");
    			Enumeration<NameClassPair> enumObjets = envCtx.list((Name) initCtx);
    			System.out.println("PASSE ICI");
    			while(enumObjets.hasMoreElements()) {
    				System.out.println(enumObjets.getClass().getName());
    			}
    		} catch (NamingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est bien ce que je disais, c'est la 3ème ligne que tu ne nous as pas montré qui est en cause:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enumeration<NameClassPair> enumObjets = envCtx.list((Name) initCtx);
    Si tu veux lister le contenu de envCtx, utilise envCtx.list("");
    Je ne vois pas où tu t'imagine qu'un context jndi et un Name c'est la même chose. Le context contient des object, le Name contient le nom d'un objet.

  5. #5
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Merci à toi.

    J'ai effectivement un peu de mal à m'y retrouver.

    Ce que je veux récupérer, c'est la liste des servlets que j'ai déclarées avec l'annotation @WebServlet

    Dans quelle direction dois-je creuser ? Je pensais que les servlets étaient vues par Tomcat comme des ressources dont il pouvait ensuite me donner les noms. C'est pourquoi je pensais trouver cela dans le JNDI.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu peux récupérer la liste des servlets depuis une autre servlet avec ServletContext.getServletRegistrations().


    Le conteneur ne fait pas la distinction entre annotation et web.xml, toutes els servlets sont sur le même pied.

    Bien que tu puisse retrouver aussi les servlets dans le JNDI, je ne pense pas que la spec J2EE Oblige une nomenclature particulière.

  7. #7
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Bonsoir Tchize_

    merci pour toute l'aide que tu m'as apportée et le temps que tu m'as consacré. Je n'ai pas eu le temps d'explorer ta réponse avant aujourd'hui.

    Si tu le permets, je vais t'expliquer ce que j'ai appris à faire pour gérer des servlets + jsp. Mon prof appelait ça le MVC 2.

    Le principe :

    - un controleur frontal (servlet) chargé d'analyser les requêtes afin de rediriger le flux vers la "bonne" servlet
    --> ce controleur frontal s'appuie pour faire cela sur une HashMap contenant des couples [param-name , param-value] directement issue du Web.xml

    - des servlets "back" qui ne sont que des POJO et qui traitent vraiment la requête redirigée par la servlet frontale
    --> ces servlets "back" renvoient une URL qui est ensuite affichée

    Voici le Web.xml sur lequel je m'appuie pour réaliser cela :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>CitizenWeb</display-name>
      <servlet>
      	<servlet-name>CentralStation</servlet-name>
      	<servlet-class>servlets.CentralStation</servlet-class>
      	<init-param>
      		<param-name>login</param-name>
      		<param-value>servlets.LoginBackControler</param-value>
      	</init-param>
      </servlet>
      <servlet-mapping>
      	<servlet-name>CentralStation</servlet-name>
      	<url-pattern>/CentralStation</url-pattern>
      </servlet-mapping>
      <session-config>
      	<session-timeout>30</session-timeout>
      </session-config>
      <welcome-file-list>
        <welcome-file>accueil.jsp</welcome-file>
      </welcome-file-list>
      <resource-ref>
      <description>
        Resource reference to a factory for javax.mail.Session
        instances that may be used for sending electronic mail
        messages, preconfigured to connect to the appropriate
        SMTP server.
      </description>
      <res-ref-name>
        mail/Session
      </res-ref-name>
      <res-type>
        javax.mail.Session
      </res-type>
      <res-auth>Container</res-auth>
    </resource-ref>
    </web-app>
    Voici le code du controleur frontal :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    package servlets;
     
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Enumeration;
    import java.util.HashMap;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.Name;
    import javax.naming.NameClassPair;
    import javax.naming.NamingException;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import com.sun.enterprise.v3.admin.ProcessHttpCommandRequestException;
     
    import dao.LayerDAO;
    import exec.InitializeDatas;
     
    /**
     * Servlet implementation class CentralStation
     */
    //@WebServlet("/CentralStation")
    public class CentralStation extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private LayerDAO dao = new LayerDAO();
    	private InitializeDatas init = new InitializeDatas(dao);
    	private HashMap<String,IFBackControler> mp;
     
    	/**
             * @see HttpServlet#HttpServlet()
             */
    	public CentralStation() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public void init(ServletConfig config) throws ServletException{
     
    		super.init(config);
    		mp = new HashMap<>();
    		for(Enumeration<String> e = config.getInitParameterNames();e.hasMoreElements();) {
    			String name = e.nextElement();
    			String value = config.getInitParameter(name);
    			IFBackControler ifbc;
    			try {
    				ifbc = (IFBackControler) Class.forName(value).newInstance();
    				mp.put(name, ifbc);
    			}
    			catch(ClassNotFoundException | InstantiationException | IllegalAccessException ex){
    				System.out.println(ex.getMessage());
    			}
    		}
    	}
     
    	private void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
    		response.setContentType("text/html;charset=UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		HttpSession session = request.getSession();
     
    		String section = request.getParameter("section");
    		String url="/WEB-INF/jsp/accueil.jsp";
    		if(section != null && mp.containsKey(section)) {
    			System.out.println("SECTION = " + section);
    			IFBackControler bc = (IFBackControler)mp.get(section);
    			System.out.println("GET(SECTION) = " + mp.get(section));
    			url = bc.execute(request, response, this);
    			System.out.println("URL = " + url);
    		}
    		url=response.encodeURL(url);
    		getServletContext().getRequestDispatcher(url).include(request, response);
    	}
     
     
    	/**
             * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
             *      response)
             */
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		processRequest(request,response);
    	}
     
     
    	/**
             * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
             *      response)
             */
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		processRequest(request,response);
    	}
     
    }
    Le fait d'utiliser les annotations (comme tu peux le voir, j'ai commenté l'annotation @WebServlet de ma servlet pour m'appuyer sur le Web.xml sinon j'ai des erreurs) m'empêche de travailler avec cette HashMap qui associe à une servlet le RequestParameter qui va la déclencher et que le controleur central doit justement décoder.

    D'où ma question dans ce forum : comment faire la même chose sans Web.xml ? Comment avec l'annotation @WebServlet puis-je associer à une servlet donnée le paramètre qui me permettra de pointer vers cette servlet ?
    -> comme tu peux le voir dans mon Web.xml, le fait d'associer le nom "login" à la servlet "servlets.LoginBackControler" permet à mon controleur frontal de rediriger la requête vers le controleur "LoginBackControler" quand la valeur "login" est passée en paramètre dans la requête de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="CentralStation?section=login">ici</a>
    Je viens de passer un moment sur la doc Oracle que tu as bien voulu me communiquer. Je vois que la commande que tu m'as indiquée permet de récupérer une HashMap, ce qui est plutôt un bon début. Mais y a-t-il un paramètre à ajouter à la déclaration @WebServlet qui pourrait contenir par exemple mon mot-clé "login" ?

    Voilà, j'espère avoir été plus clairque jusqu'à présent.
    Dans l'attente de ta réponse, je vais essayer de faire tourner ce que tu m'as donné pour voir ce que ça renvoie comme info.

    D'ici là bonne soirée et merci encore.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Cette servlet controller, dans ton exemple, si tu veux mon avis, elle sert strictement à rien. Pourquoi faire compliquer afin de choisir la servlet via un paramètre, alors que l'on peux directement la choisir avec le path? Au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="CentralStation?section=login">ici</a>
    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="login">ici</a>
    Après si tu veux faire des choses plus complexe, genre mapper une réponse spécifique sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin/*/process?action=login
    tu as spring MVC avec son couple @Controller @RequestMapping qui font ce genre de boulot.
    http://docs.spring.io/spring/docs/cu.../html/mvc.html

  9. #9
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Cette servlet controller, dans ton exemple, si tu veux mon avis, elle sert strictement à rien. Pourquoi faire compliquer afin de choisir la servlet via un paramètre, alors que l'on peux directement la choisir avec le path? Au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="CentralStation?section=login">ici</a>
    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="login">ici</a>
    Avec le Path ?
    Ca voudrait dire que j'ai une servlet "Login" c'est ça ?


    Citation Envoyé par tchize_ Voir le message
    Après si tu veux faire des choses plus complexe, genre mapper une réponse spécifique sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin/*/process?action=login
    tu as spring MVC avec son couple @Controller @RequestMapping qui font ce genre de boulot.
    http://docs.spring.io/spring/docs/cu.../html/mvc.html
    Alors là ce serait le rêve !! Je cherche justement à me former à Spring, mais j'ai un peu buté sur les problématiques d'injection de contrôles.
    J'ai pensé que commencer par JPA me permettrait de comprendre globalement le système que Spring veut cacher. J'ai certainement eu tort.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2007, 19h00
  2. Réponses: 1
    Dernier message: 18/01/2007, 12h09
  3. [EJB] Récupérer le contexte
    Par thecaptain dans le forum Services Web
    Réponses: 1
    Dernier message: 07/11/2006, 16h39
  4. FileInfo - Récupérer «Comments» d'un exécutable
    Par DarkVader dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/10/2006, 19h41
  5. Récupérer le nom de partage d'une ressource locale
    Par bib34690 dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2005, 17h10

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