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 :

[JSF] Problème Faces Servlet qui ne redirige pas


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut [JSF] Problème Faces Servlet qui ne redirige pas
    Bonjour,

    J'ai un soucis dans le cadre d'un développement web avec JSF.
    Dans mon appli, un formulaire sur la page "index.jsp" appelle un ManagedBean LoginController, qui retourne une String afin d'être redirigé vers une autre page "recherche.jsp".
    Le ManagedBean marche bien et retourne correctement la String "loging.complete" mais la page se rafraîchie au lieu d'aller sur l'autre.


    voici mon web.xml:

    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 version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <context-param>
            <param-name>com.sun.faces.verifyObjects</param-name>
            <param-value>false</param-value>
        </context-param>
        <context-param>
            <param-name>com.sun.faces.validateXml</param-name>
            <param-value>true</param-value>
        </context-param>
        <context-param>
            <param-name>javax.faces.CONFIG_FILES</param-name>
            <param-value>/faces-config.xml</param-value>
        </context-param>
        <context-param>
            <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
            <param-value>client</param-value>
        </context-param>
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>/faces/index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    et mon faces-config.xml:

    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
     
    <?xml version='1.0' encoding='UTF-8'?>
     
    <!-- =========== FULL CONFIGURATION FILE ================================== -->
     
    <faces-config version="1.2" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
        <managed-bean>
            <managed-bean-name>LoginController</managed-bean-name>
            <managed-bean-class>managedbeans.LoginController</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
        <managed-bean>
            <managed-bean-name>ExpSearcherController</managed-bean-name>
            <managed-bean-class>managedbeans.ExpSearchingController</managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
        <managed-bean>
            <managed-bean-name>ExpController</managed-bean-name>
            <managed-bean-class>managedbeans.ExpController</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
     
        <navigation-rule>
            <from-view-id>/faces/index.jsp</from-view-id>
            <navigation-case>
                <from-outcome>loging.fail</from-outcome>
                <to-view-id>/faces/index.jsp</to-view-id>
            </navigation-case>
            <navigation-case>
                <from-outcome>loging.complete</from-outcome>
                <to-view-id>/faces/recherche.jsp</to-view-id>
            </navigation-case>
        </navigation-rule>
     
        <navigation-rule>
            <from-view-id>/faces/recherche.jsp</from-view-id>
            <navigation-case>
                <from-outcome>expSearching.complete</from-outcome>
                <to-view-id>/faces/recherche.jsp</to-view-id>
            </navigation-case>
        </navigation-rule>
    </faces-config>
    Please help me!!

  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
    dans tes navigation-rules, retire les /faces/. Il faut mettre des view-id, pas les url complete des pages. En l'occurence dans ton cas, le view-id c'est ce qui suit /faces/ dans l'url

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Ah, merci beaucoup! Par contre la seule façon de tout faire marcher est de mettre toutes les pages dans le répertoire racine des pages web.
    Alors que j'avais pourtant créer un dossier "faces" comme défini dans le web.xml pour la Face Servlet. Si mes pages sont dans le dossier "faces" je ne peux pas passer d'une page à une autre. Enfin pour le moment ça me suffit.

    Merci

  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
    tu peux mettre n répetoire faces, mais avec ta configuration, tes utilisateurs auront alors des urls "/faces/faces/machin.jsp"

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    C'est dur de faire passer un projet JSP pur en JSF! C'est vrai que ça a des avantages mais bon, c'est comme si je devais tout réapprendre!!
    Vu que je te tient, pourrais tu m'aider sur un truc en JSF?

    Une JSP m'affiche les résultats d'une recherche et je voudrais que chaque items de ma recherche puisse être un <h:commandLink> pour que je puisse charger l'item complètement et aller sur une autre page. En fait le managed bean ne se lance pas lorsque je clique sur un des liens de la datatable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <h:dataTable value="#{ExpSearcherController.exploitationsSearched}" var="exp">
                                <h:column>
                                    <h:form>
                                        <h:commandLink value="#{exp.nom}"action="#{ExpController.loadExploitation}" type="submit">
                                            <f:param name="expId" value="#{exp.id}"/>
                                        </h:commandLink>
                                    </h:form>
                                </h:column>
                            </h:dataTable>
    Côté ManagedBean (ExpController):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public String loadExploitation() {
            System.out.println("crepe");
            setExploitation(getDao().getExploitation(getParamId("idExp")));
            System.out.println("EXP CONTROL: exp chargé");
            return "exp.loaded";
        }
    J'ai commencé simplement, mais je dois avoir des problèmes de syntaxe...

  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
    pour qu'une action ou tout forme d'input fonctionne correctement au sein d'un composant dérivé de UIData (comme datatable par exemple), il faut que la liste liée à la valeur soit préservée d'une requete à l'autre. Ceci peut etre fait en utilisant un session scope pour le bean, par exemple, mais il y a d'autre moyens.
    Lorsque tu va cliquer sur le lien, ton browser, va en gros soumettre à jsf 'on a cliqué sur le 53ème lien de la table machin'. JSF va reconsituer ta table, va réitérer sur la value, et lorsque viendra le tour du 53ème commandButton, celui-ci reconnaitra la commande et, plus tard, appellera l'action sur le exp.


    De plus, mais c'est accessoire, JSP n'est pas le meilleur language pour faire du JSF. Facelet est beaucoup plus souple et facile à utiliser. Si le couple JSP/JSF existe, c'est pour permettre les transitions surtout. JSP fonctionne en une seul passe, alors que JSF fonctionne en un cycle de plusieurs passes, ce qui amène parfois des curiosité lorsqu'on mélange des tags JSF et non JSF dans un JSP

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Bien vu, j'ai mis en scope session (ce n'est vraiment pas gênant) et ça fonctionne!
    Je ne connais pas encore Facelet, je vais essayé de me documenter.

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Je ne vais pas créer un nouveau topic pour ce problème:

    Dans mes jsp, je générais des pdf et des images grâce à des servlet. Avec jsf, dois-je utiliser le même principe ou puis-je, par exemple, les générer en binaire dans un attribut d'un managed bean et les afficher via certaine balise jsf?

  9. #9
    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
    pour générer du binaire, si t'en a la possibilité, passe par des servlets. C'est la que t'aura le moins d'emmerde. Il existe des composant non standard pour livrer du binaire mais il passent toujours par une servlet (c'est juste que t'as pas a la coder toi meme :p).
    Tout dépend a quel point t'as besoin que tes beans JSF soient intégrés à ta génération binaire. Si t'a besoin de plein de données venant de l'utilisateur, tu va devoir générer le binaire dans une action et le renvoyer au client soit directement, soit par un composant perso.

    En effet, c'est pas tres propre, mais via le FacesContext, tes actions on accès au stream de réponse et peuvent donc y envoyer directement du binaire.

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Ok je vois, malheureusement je vais devoir utiliser le langage JSP:

    Par exemple pour afficher un ensemble de schémas (un par <td> d'une <table>):
    Je faisais une boucle sur la liste d'objets et sur chaque itération:

    -Je générais un nom pour chaque objet de la boucle.
    -Je publiais l'objet comme attribut de session avec le nom généré.
    -J'utilisais une balise <img src="/maServlet&name=<%=nom%>> pour activer la servlet afin de m'envoyer le flux de données (l'image).
    -La servlet récupérait le nom, puis l'objet de la session correspondant à ce nom.
    -Elle utilisait l'objet et écrivait dans le flux.
    -Puis elle supprimait l'objet correspondant au nom après l'avoir utilisé.

    Cette méthode fonctionne uniquement si j'utilise les <%%> de JSP pour que je puisse faire ma boucle. Bien entendu je peux faire cela dans un Managed Bean mais il faudra toujours que je récupère les noms des objets (dans la session) côté JSF...

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    En écrivant ce message j'ai eu une idée soudaine lol! Peut être que j'ai trouvé la solution!

  12. #12
    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
    Citation Envoyé par saveriu Voir le message
    Ok je vois, malheureusement je vais devoir utiliser le langage JSP:

    Par exemple pour afficher un ensemble de schémas (un par <td> d'une <table>):
    Je faisais une boucle sur la liste d'objets et sur chaque itération:

    -Je générais un nom pour chaque objet de la boucle.
    -Je publiais l'objet comme attribut de session avec le nom généré.
    -J'utilisais une balise <img src="/maServlet&name=<%=nom%>> pour activer la servlet afin de m'envoyer le flux de données (l'image).
    -La servlet récupérait le nom, puis l'objet de la session correspondant à ce nom.
    en JSF tu ferais comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <h:datatable value="#{bean.listOfItem}" var="item">
    ...
         <h:graphicsImage value="/maServlet/&name=#{item.schemaName}"/>
    ...
    </h:datatable>
    en facelets c'est encore lpus simple, tu peux mettre des EL partout

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Les facelets sont des servlets spéciales? Genre un objet qui dérive de HttpServlet? C'est contenu par le framework JSF?

  14. #14
    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
    Facelet est un handler JSF qui n'est pas basé sur JSP. C'est une librairie supplémentaire à rajouter à jsf http://djo-mos.developpez.com/tutori...acelets-intro/

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Quand tu dis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <h:datatable value="#{bean.listOfItem}" var="item">
    ...
         <h:graphicsImage value="/maServlet/&name=#{item.schemaName}"/>
    ...
    </h:datatable>
    C'est bien entendu en partant du fait que le managed bean a préalablement sauvegardé les items dans la session? Le "schemaName" est un attribut que je rajoute moi non?

  16. #16
    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
    Citation Envoyé par saveriu Voir le message
    Quand tu dis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <h:datatable value="#{bean.listOfItem}" var="item">
    ...
         <h:graphicsImage value="/maServlet/&name=#{item.schemaName}"/>
    ...
    </h:datatable>
    C'est bien entendu en partant du fait que le managed bean a préalablement sauvegardé les items dans la session? Le "schemaName" est un attribut que je rajoute moi non?
    Tout d'épend d'ou ta servlet va chercher les donnée. Sauvegarder des images dans la session ca peut etre problématique. L'idéal est d'avoir un servlet qui fonctionne sans utiliser la session. Sinon, schemaName peut être un propriété que tu rajoute dans ton bean et qui lors du getter, par exemple, stocke ce qu'il faut dans la session. C'est juste un exemple générique

  17. #17
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Tout d'épend d'ou ta servlet va chercher les donnée. Sauvegarder des images dans la session ca peut etre problématique. L'idéal est d'avoir un servlet qui fonctionne sans utiliser la session.
    En fait je stocke uniquement les objets dans la session, l'image sera générée à partir des objets dans la servlet.
    J'avais essayé de stocker les objets dans la request mais il me semble que j'ai eu quelques problèmes. Dans tout les cas les enregistrer dans request est mieux car ils sont supprimés juste après automatiquement. Pas besoin de le faire côté servlet.

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    En gros voila comment j'ai vu la chose:

    Le Managed Bean (un peu simplifié):

    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
     
    public class ExpController  {
     
        @EJB
        private IDaoReportingLocal dao;
     
        private List<SessionObject> datas;
     
        /** Creates a new instance of ExpController */
        public ExpController() {
        }
     
        public Object getData(String name) {
            for(SessionObject so:datas) {
                if(so.getName().equals(name))
                    return so.getObject();
            }
            return null;
        }
     
        public String loadRFormations() {
            List<RFormation> rFormas;
            //recupération des objets par la dao
            rFormas = getDao().getRFormations();
            //liste de SessionObject: un SessionObject possède un objet et un nom
            //datas est un attribut du managed bean
            datas = new Vector<SessionObject>();
            int i=0;
            //pour chaque objets je sauvegarde sa reference dans datas avec son nom
            for(RFormation rf: rFormas) {
                datas.add(new SessionObject(rf, "rforma"+(++i)));
            }
            return "rFormaions.loaded";
        }
     
        public String loadReunions() {
            //meme principe
        }
     
     
     
        //getters et setters
    }

    le JSF (comme tu as dit):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <h:datatable value="#{ExpController.datas}" var="item">
    ...
         <h:inputText value="#{item.object.blabla}"/>
         <h:graphicsImage value="/maServlet/&name=#{item.nom}"/>
    ...
    </h:datatable>
    La Servlet récupère le nom, la référence du managed bean ExpController. Elle utilise la méthode getData() de ExpController pour récupérer l'objet à partir du nom. Elle construit l'image qu'elle écrit dans le outputstream.
    Qu'est ce que tu en penses?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. header qui ne redirige pas
    Par oceane751 dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2007, 00h14
  2. Problème de addEventListener qui ne fonctionne pas avec un attachMovie
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 27/09/2007, 10h47
  3. fonction header qui ne redirige pas
    Par cels dans le forum Langage
    Réponses: 8
    Dernier message: 01/11/2006, 10h12
  4. Problème de htmlspecialchars qui ne fonctionne pas
    Par jeremie74 dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2006, 17h40
  5. [PHP-JS] Probleme avec onchange qui ne redirige pas
    Par Greggggggg dans le forum Langage
    Réponses: 11
    Dernier message: 28/07/2006, 12h43

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