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

JSF Java Discussion :

Récupérer des données à partir d'une base Oracle en utilisant JSF


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 16
    Points
    16
    Par défaut Récupérer des données à partir d'une base Oracle en utilisant JSF
    Salut
    Mon programme consiste à récupérer des données à partir d'une base de données oracle en utilisant jsf
    c'est à dire quand j'introduis le critère de recherche dans la zone de text et ensuite en cliquant sur le bouton j'affiche seulement les éléments correspondants

    voici mon bean
    Beansearch.java
    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
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
    /**
    *
    * @author utilisateur
    */
    public class Beansearch extends HttpServlet {
    ResultSet rs;
     
    private List perInfoAll = new ArrayList();
     
    private int i;
    public List getperInfoAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, SQLException {
    String value = req.getParameter("cond");
    try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
    }
    Connection con = null;
    try {
    con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:gmao", "pfe", "gmao");
    } catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
    }
    Statement st = null;
    try {
    st = con.createStatement();
    } catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
    rs = st.executeQuery("select username, jobposition from user_details="+value+"");
    /** Creates a new instance of Beansearch */
    } catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
    }
     
    while(rs.next())
    {
     
    perInfoAll.add(i,new perInfo(rs.getString(1),rs.getString(2)));
     
    i++;
     
    }
    return perInfoAll;
    }
    public class perInfo {
     
    private String username;
    private String jobposition;
     
     
    public perInfo(String username,String jobposition) {
    this.username = username;
    this.jobposition = jobposition;
     
     
    }
     
    public String getusername() {
    return username;
    }
     
    public String getjobposition() {
    return jobposition;
    }
     
     
     
    }
    /** Creates a new instance of Beansearch */
    public Beansearch() {
    }
     
    }
    et se qui concerne les pages jsf j'ai utilisé 2 pages l'une pour entrer les données et l'autre pour afficher les résultats
    voici le code de la page pour afficher le résultat
    resultat.jsp
    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
     
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
    </head>
    <body>
    <form>
     
     
    <h:dataTable id="dt1" value="#{Beansearch.perInfoAll}" var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3" rows="4" width="50%" dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." >
     
     
     
    <h:column>
    <f:facet name="header">
    <h:outputText value="First Name" />
    </f:facet>
    <h:outputText style="" value="#{item.username}" ></h:outputText>
    </h:column>
     
    <h:column>
    <f:facet name="header">
    <h:outputText value="Last Name"/>
    </f:facet>
    <h:outputText value="#{item.jobposition}"></h:outputText>
    </h:column>
     
     
    <f:facet name="footer">
    <h:outputText value="The End" />
    </f:facet>
     
    </h:dataTable><br>
    </form>
    </body>
    </html>
    mon problème réside au niveau de la page qui concerne l'introduction du critére de recherche
    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
     
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
     
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    <html>
    <f:view>
     
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
    </head>
    <body>
    <form>
     
    <input name="cond" />
    <h:commandButton value="Rechercher" action = "search " actionListener="#{Beansearch.getperInfoAll}" />
     
    </form>
     
    </body>
    </f:view>
    </html>

    quand j'introduis le critère de recherche dans la page search.jsp et je clique sur le bouton recherche je ne peut pas accéder à la page qui affiche le résultat
    qu'est ce que je doit ajouter pour que je puisse faire ça ?
    je sait que le problème est peut être au niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:commandButton value="Rechercher" action = "search " actionListener="#{Beansearch.getperInfoAll}" />
    mais je ne sait pas comment corrigé ça


    Pourriez vous m'aider s'il vous plait
    je vous remercie

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Points : 7 275
    Points
    7 275
    Par défaut
    Bonsoir,

    Alors avant toute chose, je voudrais dire qu'il faut vraiment arrêter de mettre le code d'accès à la B.D. dans les beans ! C'est crado, c'est tout sauf réutilisable. Bref, il faut stopper ça. Je dis ceci, parce que ça fait des dizaines de fois que l'on rencontre ceci dans le forum.
    L'idée c'est d'avoir une couche de services qui fournit des services (!) permettant l'accès aux données (intégrant de la validation, des trucs comme ça). La couche service faisant elle même appel à une couche DAO, qui connait le modèle de données. Quant aux beans, ils ne doivent accéder qu'à la couche service, et pas plus bas.

    Bref, une belle application c'est comme un oignon : ça doit avoir plusieurs couches

    Bon, revenons à ton code.

    Déjà, ton bouton ne va pas : <h:commandButton value="Rechercher" action = "search " actionListener="#{Beansearch.getperInfoAll}" />Il faut supprimer le action. Il ne faut qu'utiliser action ou actionListener, pas les deux.
    Règle générale :
    • Si ton action va enclencher de la navigation, utilise "action", et relie le à une méthode qui retournera une String, qui correspond à la navigation-rule à appliquer après l'action.
    • Si ton action est une action locale (i.e. l'utilisateur reste dans la même page, comme par ex. pour la suppression d'un élément dans un tableau), alors utilise actionListener.


    Ensuite, dans tes pages, il ne faut pas utiliser form, mais <h:form>, qui est l'équivalent JSF du tag HTML form. Sans cela, aucune action ne fonctionnera dans ta page.

    De même, tous les composants de saisie doivent être des composants JSF. Ton input doit être remplacé par un <h:inputText/>.


    Passons maintenant au code du bean. C'est pas mal la catastrophe, je dois dire. Déjà, un bean ne doit pas étendre une HttpRequest. En JSF, tu ne gères aucune servlet. En fait, JSF est une unique Servlet, qui va permettre d'initialiser le cycle de vie de JSF, là où tout se fait.

    Ensuite, dans ton commandButton, tu lies l'actionListener à la méthode getperInfoAll. Cette méthode doit donc avoir la signature suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void getperInfoAll(ActionEvent evt) { ... }
    L'idée est de mettre dans cette méthode le code permettant de remplir une List<?> (remplacer le ? par le type d'objet que doit contenir la liste) qui sera ensuite utilisée pour remplir le tableau. Quelque chose comme ceci :

    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
     
    private List<?> results;
    private String condition;
     
    public List<?> getResults() {
        return results;
    }
     
    public void setCondition(String condition) {
        this.condition = condition;
    }
    public String getCondition() {
        return this.condition;
    }
     
    public void executeSearch(ActionEvent evt) {
        // On remplit ici la liste en appelant mon service, en lui donnant le critère "condition".
        results = monService.findAllItems(condition);
    }
    Dans le code JSF :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <h:form>
        <!-- Champ de saisie du critère de recherche -->
        <h:inputText value="#{monBean.condition}"/>
     
        <!-- Bouton d'action pour lancer la recherche. -->
        <h:commandButton value="Chercher" actionListener="#{monBean.executeSearch}"/>
     
        <!-- Affichage du tableau, en récupérant la List<?> du bean. -->
        <h:dataTable value="#{monBean.results}">
            ...
        </h:dataTable>
     
    </h:form>

    Bon, voilà, comme tu le vois, il y a encore beaucoup de boulot. JSF est un bon framework, mais il y a pas mal de choses à apprendre avant de pouvoir le manipuler correctement.
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Salut
    Merci pour la réponse qui m'a beaucoup aider et pour les explications

    j'ai effectué les modifications sur mon bean

    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
     
    public class Bean {
        ResultSet rs;
        private List<String> results;
    private String condition;
     
    public List<String> getResults() {
        return results;
    }
     
    public void setCondition(String condition) {
        this.condition = condition;
    }
    public String getCondition() {
        return this.condition;
    }
    public void executeSearch(ActionEvent evt) throws SQLException {
       results = monService.findAllItems(condition);
    mais ce que j'ai n'est pas compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     results = monService.findAllItems(condition);
    donc monService est une classe avec le fonction findAllItems qu'on appelle avec le paramétre condition
    j'ai créer cette classe sur un autre bean
    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
     
    import java.util.List;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /**
     *
     * @author utilisateur
     */
    class monService {
     
        static List<String> findAllItems(String condition) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
     
    }
    qu'est ce que je doit mettre dans cette classe?
    je ne sait pas si j'ai bien compris mais à ce niveau on cherche les éléments correspondants au critére de recherche 'condition'
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rs = st.executeQuery("select username, jobposition from  user_details where username ="+condition+"");
    et ensuite On remplit la liste avec ces éléments qu'on déclare avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList list=new ArrayList();
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     while(rs.next()){
     
    			list.add(rs.getString(1))
                            list.add.rs.getString(2);
     
     
             }
    return list;
    est-ce que c'est juste car noté bien que les deux classes j'ai les mises dans deux beans
    Pourriez vous me corriger et m'indiquer qu'est ce que je doit mettre dans les beans
    et pour la pages jsf j'ai également
    modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     <h:form>
     
        <h:inputText value="#{Bean.condition}"/>
     
        <h:commandButton value="Chercher" actionListener="#{Bean.executeSearch}"/>
     <h:dataTable value="#{Bean.results}"var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3"  rows="4" width="50%" dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." >
    <f:facet name="header">
            <h:outputText value="This is 'dataTable' demo" />
    </f:facet>
    la questions est comment afficher les éléments de ma liste

    <h:outputText style="" value="#{item.?}" >

    je reconnais que je vient de commencer de travailler avec la jsf
    mais j'ai besoin de ce code ,aidez moi s'il vous plait
    Merci d'être indulgent et compréhensif

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Narouto Voir le message
    Salut
    Merci pour la réponse qui m'a beaucoup aider et pour les explications

    j'ai effectué les modifications sur mon bean

    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
     
    public class Bean {
        ResultSet rs;
        private List<String> results;
    private String condition;
     
    public List<String> getResults() {
        return results;
    }
     
    public void setCondition(String condition) {
        this.condition = condition;
    }
    public String getCondition() {
        return this.condition;
    }
    public void executeSearch(ActionEvent evt) throws SQLException {
       results = monService.findAllItems(condition);
    mais ce que j'ai n'est pas compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     results = monService.findAllItems(condition);
    donc monService est une classe avec le fonction findAllItems qu'on appelle avec le paramétre condition
    j'ai créer cette classe sur un autre bean
    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
     
    import java.util.List;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /**
     *
     * @author utilisateur
     */
    class monService {
     
        static List<String> findAllItems(String condition) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
     
    }
    qu'est ce que je doit mettre dans cette classe?
    je ne sait pas si j'ai bien compris mais à ce niveau on cherche les éléments correspondants au critére de recherche 'condition'
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rs = st.executeQuery("select username, jobposition from  user_details where username ="+condition+"");
    et ensuite On remplit la liste avec ces éléments qu'on déclare avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ArrayList list=new ArrayList();
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     while(rs.next()){
     
    			list.add(rs.getString(1))
                            list.add.rs.getString(2);
     
     
             }
    return list;
    est-ce que c'est juste car noté bien que les deux classes j'ai les mises dans deux beans
    Pourriez vous me corriger et m'indiquer qu'est ce que je doit mettre dans les beans
    et pour la pages jsf j'ai également
    modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     <h:form>
     
        <h:inputText value="#{Bean.condition}"/>
     
        <h:commandButton value="Chercher" actionListener="#{Bean.executeSearch}"/>
     <h:dataTable value="#{Bean.results}"var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3"  rows="4" width="50%" dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." >
    <f:facet name="header">
            <h:outputText value="This is 'dataTable' demo" />
    </f:facet>
    la questions est comment afficher les éléments de ma liste

    <h:outputText style="" value="#{item.?}" >

    je reconnais que je vient de commencer de travailler avec la jsf
    mais j'ai besoin de ce code ,aidez moi s'il vous plait
    Merci d'être indulgent et compréhensif
    Ben en gros, ce qu'il te dit c'est qu' avec JSF, un mélange de tomates et oignons ne font pas une sauce.
    Autrement, ton bean doit juste comporter que des proprietés(private) ou fonctions(public) utilisé par ta page JSF uniquement(le ResultSet n'a pas sa place dedans).
    L'accès à la base de données est implémenté dans une autre classe à part(DAO)qui retournera éventuellement une liste contenant tes données.
    Je te conseillerai vivement de prendre des exemples(il y 'en a plein) pour comprendre ce framework.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    d'accord j'ai compris
    c'est juste que j'ai oublié d'enlever qui appartient à l'ancien code que j'ai modifié
    dans dans le bean j'ai mis seulement :
    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
     
     
    public class Bean {
     
     
    private String condition;
     
     
    public List<String> getResults() {
        return results;
    }
     
    public void setCondition(String condition) {
        this.condition = condition;
    }
    public String getCondition() {
        return this.condition;
    }
    public void executeSearch(ActionEvent evt) throws SQLException {
     
        results = monService.findAllItems(condition);
    }
    }
    et dans la classe monservice

    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
     
     
    import java.util.*;
     
    import java.sql.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
     
     
    class monService {
         Connection con = null;
    ResultSet rs;
    ArrayList list=new ArrayList();
     
     
    public  static List<String> findAllItems(String condition) throws SQLException {
     
        try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
            }
             Connection con = null;
            try {
                con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:gmao", "pfe", "gmao");
            } catch (SQLException ex) {
                Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
            }
             Statement st = null;
            try {
                st = con.createStatement();
            } catch (SQLException ex) {
                Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
             ResultSet rs = st.executeQuery("select username, jobposition from  user_details where username ="+condition+"");
                /** Creates a new instance of Beansearch */
            } catch (SQLException ex) {
                Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
            }
     
     
    }
    ce code n'est pas complet , aidez moi a s'il vous plait à le compléter
    pour que la classe puisse retourner une liste contenant les données recherchées
    Merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2012, 19h54
  2. Réponses: 4
    Dernier message: 20/07/2011, 14h03
  3. [MySQL] récupérer des images à partir d'une base de données mysql
    Par j_esti dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 21/04/2011, 13h34
  4. Récupérer des données à partir d'une URL ?
    Par Bebert71 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/02/2009, 12h53
  5. importer des données XML dans une base Oracle 9
    Par lanfeustdetroll dans le forum JDBC
    Réponses: 3
    Dernier message: 19/07/2007, 00h09

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