Appel d'une servlet dans une jsp

Fermé
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014 - 24 mai 2014 à 12:33
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014 - 24 mai 2014 à 22:28
Bonjour à tous,

Je finis mon projet de fin d'année en Java JEE (+ STRUTS) et actuellement, j'ai un problème qui m'empêche de le finir.

Donc je dois réaliser un site internet qui permet aux utilisateurs de réserver des chambres en ligne.

Tout fonctionne comme un site normal, l'utilisateur peut s'inscrire, se connecter, réserver des chambres etc.

Pour cela : j'utilise des bases de données, les balises STRUTS dans mes JSP (obligatoire, je ne peux pas mettre de balises <% %> ou alors que très peu) et une architecture à page unique (index.jsp)

Mon problème :

Ma dernière option dans le menu.. 'MES RESERVATIONS' => En cliquant dessus, l'utilisateur connecté, doit voir toutes les reservations qu'il a pu effectué ou s'il n'en a pas, il verra un message ("Vous n'avez pas encore effectué de reservations");

Cette option active une jsp 'lesReservations.jsp'
=> Cette jsp doit executer automatiquement une servlet 'LesReservations.java' qui va donner à la jsp une ArrayList<Reservation> vide ou avec des informations.
=> Cette jsp va ensuite récupérer l'ArrayList et afficher les informations à l'utilisateur.

Mon problème ? Je ne sais pas comment faire pour que la servlet 'LesReservations.java' s'execute automatiquement dans la jsp 'lesReservation.jsp'

Avez vous une idée ?

Merci d'avance pour vos réponses et bonne journée

7 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 13:56
Bonjour

"Cette jsp doit executer automatiquement une servlet"
Ce n'est pas à la JSP d'exécuter quoi que ce soit ! La JSP doit uniquement afficher le résultat des données transmises par la servlet. Si tu a besoin de transmettre une ArrayList<Reservation> à ta JSP, alors calcule la dans ta classe d'action pour la rendre accessible à ta JSP.

Exemple : L'action HelloWorld
Regarde comment est passé le String message à la JSP.
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:09
Merci pour ta réponse..

Je ne suis pas vraiment un très grand connaisseur de ce langage, vu que nous n'avons appris que les bases.. Et je ne comprend pas trop ce qu'il se passe avec l'exemple que tu m'as montré.

Je sais que la JSP ne doit rien executer et doit se contenter d'afficher ce qu'elle reçoit. Mais par exemple, pour que la servlet s'execute avant la jsp, il n' y a pas une methode du même genre que <load-on-startup> ?

C'est en fait ce que je voudrais faire.. Sauf qu'au lieu qu'elle se lance au démarrage de l'application, je voudrais qu'elle s'execute lors de l'appel à la JSP lesReservations.jsp..

Je ne sais pas si je me suis bien exprimé..
0
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301 > sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:19
Ton fichier java n'est pas une servlet mais une action struts. Chaque action struts est associée à une jsp via le fichier struts.xml. Lorsque ton action s'exécute (action.do), la méthode execute de ton action struts est exécutée. Tout se qui est calculé et rendu accessibles (via un getter) sera à disposition de ta jsp.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 14:26
Déjà, est-ce que tu fais du Struts ou du Struts 2 ? Les deux sont assez différent.

Si tu fais un <load-on-startup> c'est que tu bascules sur ta JSP directement depuis le web.xml, tu ne passes pas par le fichier struts.xml
Si je comprends bien, de Struts tu n'utilises que les taglibs (les balises), pas du tout le reste du framework c'est ça ? Du coup ton code applicatif (base de données etc.) tu le mets entre <% %> ?

Regarde le reste du tutoriel dont je t'ai donné le lien, ne serait-ce que la configuration du web.xml et struts.xml, mais à mon avis tu es encore très loin du modèle Struts.
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:32
C'est exact KX, je n'utilise que les taglibs (Le prof côte selon l'énoncé de base et en fonction des + que l'on apporte à notre code, il ajoute des points)
Les taglibs font partis des critères qui ajoutent des points.

Donc tout ce qui est code applicatif se trouve dans mes servlets.. Mes Jsp ne font qu'afficher les données des servlets..

En fait : Toutes mes servlets sont executées lorsque le client appuie sur le bouton submit d'un formulaire (un bouton s'inscrire, se connecter, reserver, confirmer)
Or ici, il a le menu ("Accueil","Reservation","Mes Reservations", "Aide")
Quand il clique sur MesReservations, j'aimerais que la servlet s'execute directement puis affiche le resultat dans la jsp..

(J'ai réussi afficher les reservations pour ce client mais j'ai du ajouter un formulaire avec un bouton "Voir mes réservations) (Mais je trouve ça un peu con puisqu'il clique sur deux boutons pour avoir une seule action..)

Le fichier web.xml je l'ai compris puisque je l'ai fait ce matin.. Et ici, je suis un peu perdu sur ce que je dois faire pour arriver à executer ma servlet avant la jsp
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 14:43
Comme le disait gigaga, en Struts tu ne manipules pas des Servlet (pas directement), tu passes par une surcouche Struts, les actions (du nom de l'interface Action).

Regarde le lien que je t'ai donné pour suivre ce que je dis :
Dans ton web.xml, tu dois avoir un filtre Struts sur /* ce qui va donc basculer systématiquement sur le fichier de configuration struts.xml, c'est lui qui va dispatcher les traitements en appelant d'abord l'action Struts, puis basculer selon le résultat sur une jsp ou une autre.

Après vu ce que tu as fait pour l'instant, ça va te changer beaucoup de choses de passer en vrai Struts.
0
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301
24 mai 2014 à 14:39
Quand tu cliques sur "mes réservations", fais en sorte que le lien correspondant soit ton action struts et pas ta jsp.
Le code de ton action struts sera alors exécuté et la jsp s'affichera (les éléments calculés par ton action seront dispo).
Entre struts 1 et struts 2, il n'y a pas fondamentalement beaucoup de différences. Le principe reste le même (idem pour un autre framework mvc comme spring mvc par exemple).
D'une manière générale, il est préférable d'éviter l'utilisation de code avec % car cela revient à mettre du code Java "pur" dans les jsp. Les taglibs sont faites pour ça. Elles facilitent l'écriture des jsp car il s'agit de balises, comme en html.
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:43
C'est ce que mon prof m'a dit.. Et c'est pour cela qu'il ajoute des points si l'on utilise des taglibs..

J'ai précisé que je travaille avec un architecture page unique également.. Et donc je ne peux pas changer le chemin d'accés rien que pour cette option du menu

<ul id="cssmenu1">
<li><a href="index.jsp?page=accueil.jsp&menu=menuConnect.jsp"><span>ACCUEIL</span></a></li>
<li><a href="index.jsp?page=reservation.jsp&menu=menuConnect.jsp"><span>RESERVATION</span></a></li>
<li><a href="index.jsp?page=lesReservations.jsp&menu=menuConnect.jsp"><span>MES RESERVATIONS</span></a></li>
<li><a href="index.jsp?page=desidentification.jsp&menu=menuConnect.jsp"><span>SE DECONNECTER</span></a></li>
</ul>

On envoie à l'index que la page sera 'lesReservations.jsp'

Il va donc lancer cette page .. sans executer la servlet avant. Si je veux que la servlet soit executer, il faut que je rajoute un bouton 'Voir mes réservations', ce qui fait un peu con..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 14:46
href="index.jsp?page=accueil.jsp&menu=menuConnect.jsp"

Ça c'est de la bidouille...
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:50
Vraiment ? x)

C'est le seul moyen que j'ai trouvé pour faire mon architecture en page unique..

Avoir un index et changer la variable "PAGE"

<div id="contenu">
<% if(request.getParameter("page") != null) {
String modulePath = "page/"+request.getParameter("page");
fileURL = pageContext.getServletContext().getResource(modulePath);
if(fileURL == null) { %>
<%@include file="page/problemeErreur.jsp"%>
<% }
else { %>
<jsp:include page="<%=modulePath%>"/>
<%}
}
else { %> <%@include file="page/accueil.jsp"%> <% } %>
</div>

Voilà un petit peu en gros, ce que je fais pour changer le contenu de mon site internet.. Je ne sais pas du tout si c'est correct mais en tout cas cela fonctionne..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 14:54
Fonctionner ne veut pas dire que c'est correct.

Avec Struts tu ne devrais JAMAIS avoir de <% %> !!

En gros là tu n'as pas d'architecture Struts, ni au sens contrôleur struts.xml, ni au sens vue au sens taglibs (vu que tu les court-circuite avec des scriptlets)

J'espère que tu as encore un peu de temps pour faire ton projet. Car sans vouloir te faire peur, si l'objectif c'est utiliser Struts, pour l'instant c'est hors sujet !
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 14:59
J'ai encore le temps quelques jours..

L'index est le truc le plus dur pour moi.. (ça, je l'ai fait avant de commencer mon site et avant de savoir que l'on devait utiliser les taglibs etc) Je vais la changer à la fin avec les balises Struts..

Sinon mes jsp ne contiennent plus aucunes <% %> ..

Tu as une meilleure solution à me proposer pour utiliser struts dans mon architecture à page unique.. ?
0
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301
24 mai 2014 à 14:54
En l'état, comment tu affiches tes pages ? Le paramètre "page" faut bien qu'il soit traité.

Change en :
<li><a href="lesReservations.do"><span>MES RESERVATIONS</span></a></li>

Associe ton action lesReservations.do à ta jsp lesReservations.jsp dans ton fichier de configuration struts.
Ça va permettre au clic sur le menu d'exécuter ton action struts puis d'afficher directement ta page jsp.
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 15:02
Le paramètre page ? il change à chaque fois que l'on clique sur un lien.. Donc si l'on clique sur accueil, le parametre page devient : accueil.jsp.. C'est pour cela le href="index.jsp?page=accueil.jsp&menuConnect" (menu connect c'est parce que le menu change en fonction que l'on est connecté sur le site ou pas. Si l'on est pas connecté, on a pas accès au menu reservation etc)

Donc ensuite, je dois changer la configuration du fichier struts.. Celui là ? struts-config.xml ?
0
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301
24 mai 2014 à 15:04
Je suis d'accord avec KX en l'état l'utilisation qui est faite de struts est loin des bonnes pratiques.
Pour changer le contenu de ta page et avoir l'impression que c'est toujours une page unique, il faut utiliser un moteur de templates comme tiles. Tiles est fortement utilisé avec struts. Il permet d'éviter les bidouilles que tu as pu mettre en place.
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 15:05
Je n'ai pas eu de cours sur ce moteur.. Je n'en ai meme pas entendu parler..
Je n'ai su le faire que de cette manière et ici, je n'ai plus assez de temps pour changer quoi que ce soit..
C'est pour cela que je demande si quelqu'un sait comment je dois faire pour faire executer ma servlet avant ma jsp..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301
24 mai 2014 à 15:16
Je comprends, mais l'architecture que tu as choisi va t'empêcher de faire ça ou alors ça va t'obliger à faire de la bidouille et en l'état, même si ça fonctionnera, je ne suis pas sûr que ton prof apprécie.
Bref normalement, la bonne pratique, c'est struts + tiles (dans le monde professionnel en tout cas).
Dans ton cas, au lieu de faire le jsp:include de la page jsp, tu peux faire un include de ton action struts avec s:action. Ça va te permettre d'exécuter l'action avant ta jsp.

Je serai toi, je ferai avec tiles car finalement tu ferais plus que ce qui est demandé et potentiellement, tu pourrais apprendre quelque chose à ton prof ;-)
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
Modifié par sostoub le 24/05/2014 à 16:10
gigaga, KX

Je viens de changer mon index puisque c'est cela qui posait le plus de problèmes..
Et puis, je suis tranquille une fois qu'il sera correct..
J'ai retiré tout ce que je pouvais de<% %> pour remplacer par des taglibs..

<div id="menu">
        <logic:present parameter="menu">
            <bean:parameter id="menudem" name="menu"/>
        </logic:present>
        <logic:notPresent parameter="menu">
            <bean:define id="menudem" value="menuNoConnect.jsp"/>
        </logic:notPresent>
        
        <jsp:include page="/page/${menudem}"/>
        
    </div>


<div id="contenu">
        <logic:present parameter="page">
            <bean:parameter id="pagedem" name="page"/>
        </logic:present>
        <logic:notPresent parameter="page">
            <bean:define id="pagedem" value="accueil.jsp"/>
        </logic:notPresent>
                                
            <jsp:include page="/page/${pagedem}"/> 
       
   </div>
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 16:00
"J'ai retiré tout ce que je pouvais de<% %>"
Tant qu'il y en aura encore ce n'est pas bon.

Les JSP ne devant faire que de l'affichage tu ne devrais pas avoir d'exception. Les exceptions c'est uniquement dans les actions Struts qu'elles devraient sauter...

"je suis tranquille une fois qu'il sera correct"
Si tu le dis...
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 16:07
J'ai oublié de les retirés les try, ils ne servent à rien car il n'y a pas d'exceptions.

En fait, je n'ai plus le temps pour tout changer et ajouter le reste de struts.. Le prof nous ayant simplement guider sur les taglibs..

Mais pour en revenir à ma question du début, est ce qu'il y a moyen de faire passer la servlet avant la jsp ? Parce qu'encore une fois, je ne connais rien au niveau du fichier struts-config.xml..

Merci pour votre aide en tout cas !
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 16:16
Actuellement dans ton web.xml tu rediriges directement vers une jsp.
Mais tu peux faire un filtre dans ton web.xml qui va envoyer les pages vers une Servlet.
C'est cette Servlet qui redirigera vers la bonne jsp, en faisant tout ce que tu veux avant.

(je fais des copier-coller depuis un exemple simple d'application JSTL, il faut bien sûr adapter)

    <servlet>
        <display-name>IndexAction</display-name>
        <servlet-name>IndexServlet</servlet-name>
        <servlet-class>ccm.kx.simplecalculator.action.IndexAction</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>IndexServlet</servlet-name>
        <url-pattern>/Index</url-pattern>
    </servlet-mapping>

La servlet va ensuite faire toutes les actions qu'il faut avant de renvoyer vers la bonne jsp.

package ccm.kx.simplecalculator.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IndexAction extends HttpServlet
{
    private static final long serialVersionUID = 1;

    public IndexAction()
    {
        super();
    }

    private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Dispatcher
        RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");        
        dispatcher.forward(request, response);
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doAction(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doAction(request,response);
    }
}
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 16:42
Actuellement dans ton web.xml tu rediriges directement vers une jsp.
Comment ça ? Je dis juste dans mon index que si la variable PAGE est null, alors on lance la page d'accueil.. Le web.xml, je crois n'a rien avoir la dedans..

Je regarde ce fichier depuis tout à l'heure et je ne vois toujours pas comment le modifier..
Voilà un exemple pour l'une de mes servlets
<servlet>
<servlet-name>ChambreJEE</servlet-name>
<servlet-class>servlets.ChambreJEE</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChambreJEE</servlet-name>
<url-pattern>/chambrejee</url-pattern>
</servlet-mapping>

C'est ce que je fais pour chacunes de mes servlets.. J'ai compris que ca sert à dire que lorsque l'on clique sur la servlet ChambreJEE, ca active la servlet qui se trouve dans class du meme nom. Puis le mapping, j'ai compris que ca servait à n'utiliser que le nom de la servlet dans un formulaire par exemple action="chambrejee" au lieu de action="servlets.ChambreJEE"

Je ne vois donc pas ce que je dois faire..
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 mai 2014 à 18:11
Tu as plusieurs <url-pattern> ? Donc tu n'as pas un site sur une page unique, tu as plusieurs pages.

Qu'y a t il dans ta servlet ? À quel moment tu dis quelle jsp doit être appelée ?
0
gigaga Messages postés 2346 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 22 août 2014 301
24 mai 2014 à 22:02
Il faut savoir que struts n'est pas du tout fait pour faire du spa (single page application). De toute façon, avec un framework serveur comme struts ça n'a aucun intérêt car de base (toute ta page est rafraîchie).

Avec un moteur comme Tiles on peut organiser, factoriser la page en plusieurs jsp. L'avantage par exemple, c'est qu'on aura ainsi plusieurs pages mais qu'une seule jsp pour gérer le footer, le header, le menu, etc... Mais tu auras potentiellement plusieurs urls...

C'est très curieux que ton prof te demande ça, car n'a pas vraiment de sens de faire ça avec struts. Enfin bref.
As tu essayé de faire avec le tag que je t'ai indiqué s:action ? Normalement ça devrait fonctionner... Au lieu de faire l'inclusion de la jsp (sans action), ça permet d'exécuter l'action avant la jsp (exactement ce que tu veux faire).
0
sostoub Messages postés 22 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 22:28
Merci de l'interet que tu porte à ma question..
Et oui, architecture page unique fait parti des critères qui augmentent les points.. Mais je pense pas qu'il veut dire une seule servlet..

Pour ma question de base, non je n'ai pas réussi à faire ce que je voulais..
J'ai donc mis un formulaire avec un bouton voir mes reservations.. (C'est moche) mais ainsi en cliquant dessus, le client voit ses réservations..

Merci en tout cas !
0