Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java EE - Erreur 404

Java EE

Sujet résolu
    31 octobre 2014 à 13:28:41

    Bonjour !

    Je développe petit à petit mon site web en Java, et me voilà déjà devant une erreur 404. J'ai mis en place deux pages :

    • .../panel
    • .../panel/home

    La page /panel n'étant pas censée exister, elle redirige automatiquement vers .../panel/home. Les deux pages ont bien évidemment une servlet qui leur est propre. Notons tout de même qu'elles sont toutes deux protégées par un filtre qui n'autorise la consultation de celles-ci que lorsque le membre est connecté et a les autorisations suffisantes. Lors du test, je tente une connexion et BIM erreur 404. La page panel me redirige convenablement et je tombe sur .../panel/home, mais c'est sur cette page que l'erreur 404 a lieu. Pourtant, le filtre fonctionne puisque les méthodes "doGet()" des deux servlets sont appelées. Je suppose que la servlet ne redirige pas vers ma page JSP, pourtant le chemin entré est bien valide... Ou bien est-ce le filtre qui bloque la page ? Bref, je vous demande de l'aide :p

    Voici les documents qui pourront vous aider :

    Servlet de la page .../panel :

    public class PanelServlet extends HttpServlet{
    	
    	private static final long serialVersionUID = 1L;
    	
    	public static final String REDIRECT = "/panel/home";
    	
    	@Override
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    		response.sendRedirect(request.getContextPath() + REDIRECT);
    	}
    }
    Servlet de la page .../panel/home :
    public class HomePanelServlet extends HttpServlet{
    	
    	private static final long serialVersionUID = 1L;
    	
    	public static final String HOMEPANEL_PAGE = "AdminPanel/Home.jsp";
    	
    	@Override
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
    		request.getRequestDispatcher(HOMEPANEL_PAGE).forward(request, response);
    	}
    }

    Filtre 2 (il y a deux filtres, mais le premier s'applique à toutes les pages et redirige correctement vers le deuxième) :

    public class AdminPanelFilter implements Filter{
    	
    	public static final String ERROR_PAGE = "/restricted";
    	
    	@Override
    	public void init(FilterConfig config) throws ServletException{}
    
    	@Override
    	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{
    		HttpServletRequest request = (HttpServletRequest)req;
    		HttpServletResponse response = (HttpServletResponse)resp;
    		User user = (User)request.getAttribute("user");
    		if(user == null || (user != null && user.getRank().getLevel() < UserRank.ADMINISTRATOR.getLevel())){
    			response.sendRedirect(request.getContextPath().replace("panel/", "") + ERROR_PAGE);
    		}
    		else{
    			chain.doFilter(request, response);
    		}
    	}
    
    	@Override
    	public void destroy(){}
    }

    Fichier Web.xml :

      <filter>
        <display-name>AdminPanelFilter</display-name>
        <filter-name>AdminPanelFilter</filter-name>
        <filter-class>fr.wirestone.filters.AdminPanelFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>AdminPanelFilter</filter-name>
        <url-pattern>/panel/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
      </filter-mapping>
      <servlet>
        <display-name>PanelServlet</display-name>
        <servlet-name>PanelServlet</servlet-name>
        <servlet-class>fr.wirestone.servlets.PanelServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>PanelServlet</servlet-name>
        <url-pattern>/panel</url-pattern>
      </servlet-mapping>
      
      <servlet>
        <description>Admin panel's home page</description>
        <display-name>HomePanelServlet</display-name>
        <servlet-name>HomePanelServlet</servlet-name>
        <servlet-class>fr.wirestone.servlets.HomePanelServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>HomePanelServlet</servlet-name>
        <url-pattern>/panel/home</url-pattern>
      </servlet-mapping>

    Voilà tout (enfin, pas tout sinon ce serait un peu long ^^).

    Oups petite question : je trouve que les Beans sont assez peu pratiques avec leurs constructeurs sans paramètres. Donc je voulais demander : peut-on mettre deux constructeurs sur un Bean ? Un sans paramètres, et un avec paramètres, pour l'esthétique du code ?


    Je vous remercie d'avance pour vos réponses. Cordialement,

    EclipseOnFire

    -
    Edité par EclipseOnFire 31 octobre 2014 à 15:26:22

    • Partager sur Facebook
    • Partager sur Twitter
    Error 2006, MySQL server has gone away
      31 octobre 2014 à 21:17:30

      Salut,

      Quelle est l'erreur affichée dans les logs Tomcat quand tu obtiens cette 404 ?

      Pour les beans, il te suffit d'initialiser les propriétés à coups de setXXX(), pas besoin de constructeurs (le constructeur, c'est rarement une bonne idée en J2EE).

      • Partager sur Facebook
      • Partager sur Twitter
        31 octobre 2014 à 21:38:00

        Merci beaucoup pour ta réponse, le développement du site dépend vraiment de cette erreur ^^.

        Tomcat me donne ses logs habituels... Aucune erreur...

        Sous firefox, page blanche.

        Ah... Quels genre d'inconvénients on peut avoir pour les constructeurs multiples ?

        P.S : Merci de ton tuto, c'est grâce à lui que me voici en train de développer mon site :p

        -
        Edité par EclipseOnFire 1 novembre 2014 à 21:48:04

        • Partager sur Facebook
        • Partager sur Twitter
        Error 2006, MySQL server has gone away
          1 novembre 2014 à 17:34:00

          Si tu fais une servlet tout conne qui redirige directement vers ta page JSP, ça fonctionne ?

          Si non, alors ça veut dire que l'URL de ta page JSP est foireuse dans ton :  request.getRequestDispatcher(HOMEPANEL_PAGE).forward(request, response);

          • Partager sur Facebook
          • Partager sur Twitter
            1 novembre 2014 à 22:06:39

            Ah ça fonctionne en rajoutant un / devant "WEB-INF". Seul ennui : mon CSS ne part pas avec la JSP car je suis dans une situation... curieuse au niveau de la hiérarchie des pages et des dossiers.

            La JSP :

            <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
            <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
            <%@ include file="../Header.jsp" %>
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
            <html>
            <head>
            	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            	<title>Panneau d'administration</title>
            </head>
            <body>
            	<section>
            		<h1>Panneau d'administration</h1>
            	</section>
            </body>
            </html>
            <%@ include file="../Footer.jsp" %>

            Pour le CSS, le fichier est implicitement inséré puisqu'il est inséré dans le fichier "Header.jsp".

            Les dossiers :


            Pour moi le chemin vers le CSS et vers la JSP sont bons O_o. Je n'ai jamais mis de "/" devant l'URL de mon "WEB-INF", qu'est-ce que ça change précisément (hormis le fait que cela fonctionne pour ma JSP) ?

            Merci d'avance :)

            -
            Edité par EclipseOnFire 1 novembre 2014 à 22:12:49

            • Partager sur Facebook
            • Partager sur Twitter
            Error 2006, MySQL server has gone away
              2 novembre 2014 à 9:21:05

              Pour l'URL absolue à passer dans le requestDispatcher, tout est expliqué dans le cours, il faut le lire plus attentivement ! :) 

              => http://openclassrooms.com/courses/creez-votre-application-web-avec-java-ee/servlet-avec-vue#r-619741

               Pour ton histoire de CSS, il nous manque des infos : où est le CSS dans ton arborescence, et quel est le contenu de header.jsp.

              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2014 à 11:52:18

                Outch ! "Premiers pas" ? D'accord !

                J'ai aussi relu la partie du cours sur les filtres au cas où. J'ai donc décidé de stocker toutes les pages JSP partagées et les feuilles de style dans un dossier "Included" stocké à la racine du serveur ("WebContent").

                Du coup, ça nous donne : "Header.jsp" et "Footer.jsp" contiennent le lien pour la feuille de style principale ("MainStyle.css").

                Tout cela placé dans un dossier "Included" situé dans "WebContent".

                J'ai résolu tous les problèmes excepté un : lorsque je me connecte à l'interface d'administration, le CSS n'est pas téléchargé. J'ai donc affiché la console de Firefox m'indiquant qu'il va chercher le CSS dans "http://localhost:8080/Site_Web/panel/Included/MainStyle.css", ce qui est logique, puisque le contexte de mon application est sous "/panel". L'ennui c'est que je ne sais pas comment faire pour rediriger correctement vers mon CSS (la page devrait se trouver dans "http://localhost:8080/Site_Web/Included/MainStyle.css") sauf en trichant et en définissant une variable dans mon filtre pour rediriger correctement...

                Enfin, je souhaitais poser une autre question, sans vouloir abuser, afin d'éviter de poster un autre topic : comment puis-je initialiser des classes en même temps que le serveur démarre et faire en sorte que toute exception levée force le serveur à s'arrêter ? Pour l'instant, ces classes démarrent par leur propres moyens, via leur variable d'instance "getInstance()" mais vu qu'il n'y a pas de "public static void main()"..

                -
                Edité par EclipseOnFire 2 novembre 2014 à 11:53:57

                • Partager sur Facebook
                • Partager sur Twitter
                Error 2006, MySQL server has gone away
                  2 novembre 2014 à 12:34:41

                  Pour le CSS, utilise la JSTL et sa balise c:url : en lui donnant une URL absolue, cela donnera ce que tu attends. Là encore, prends le temps de bien lir eles chapitres (dans l'ordre, tant qu'à faire :p ).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 novembre 2014 à 12:40:46

                    Pour ton autre question :

                    - loadOnStartup dans le web.xml te permet de précharger des servlets au démarrage du serveur ;

                    - http://stackoverflow.com/questions/13932746/how-to-abort-tomcat-startup-upon-exception-in-servletcontextlistener pour essayer de tuer le serveur si une exception est levée, mais c'est un peu hardcore comme comportement. Le mieux )d'après moi) est sûrement de gérer ça au sein d'un filtre dans l'appli (via une variable d'application qui serait initialisée à "ERREUR" en cas d'exception, et qui serait testée dans un filtre global, par exemple), et de servir une page d'erreur le cas échéant.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 novembre 2014 à 14:52:34

                      Coyote a écrit:

                      Pour le CSS, utilise la JSTL et sa balise c:url : en lui donnant une URL absolue, cela donnera ce que tu attends. Là encore, prends le temps de bien lir eles chapitres (dans l'ordre, tant qu'à faire :p ).

                      Super ça marche ! :D

                      Coyote a écrit:

                      Pour ton autre question :

                      - loadOnStartup dans le web.xml te permet de précharger des servlets au démarrage du serveur ;

                      - http://stackoverflow.com/questions/13932746/how-to-abort-tomcat-startup-upon-exception-in-servletcontextlistener pour essayer de tuer le serveur si une exception est levée, mais c'est un peu hardcore comme comportement. Le mieux )d'après moi) est sûrement de gérer ça au sein d'un filtre dans l'appli (via une variable d'application qui serait initialisée à "ERREUR" en cas d'exception, et qui serait testée dans un filtre global, par exemple), et de servir une page d'erreur le cas échéant.

                      Je suis aussi partisan de ta seconde méthode, étant donné que j'ai déjà un filtre qui s'applique à toutes les pages ;) . Ce sont des classes très importantes : j'ai mon DatabaseManager par exemple, qui gère la base de données, sans ça le site ne marcherait pas ^^.

                      Je teste en envoyant ma page d'administration et je te dis ce qu'il en est :)

                      Merci pour ta patience :p

                      -
                      Edité par EclipseOnFire 2 novembre 2014 à 14:58:13

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Error 2006, MySQL server has gone away
                        2 novembre 2014 à 15:32:35

                        Tout fonctionne excepté le fait que je doive changer tous les liens du header (<nav></nav>) du panneau d'administration x) De tout façon je vais changer le header pour le panneau d'administration, pour montrer qu'on est bien à un endroit différent.

                        Bon, sur ce, merci mille fois !! Bonne continuation ! ;)

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Error 2006, MySQL server has gone away
                          2 novembre 2014 à 21:47:37

                          Coyote a écrit:

                          Bon courage pour la suite ! ;)


                          Merci ! D'autant plus que je viens d'attaquer le chapitre sur JSF... Hum... Je viens de digérer les Servlets, voilà autre chose x)

                          -
                          Edité par EclipseOnFire 2 novembre 2014 à 21:47:51

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Error 2006, MySQL server has gone away

                          Java EE - Erreur 404

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown