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 :

[Conseil] structure du site


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut [Conseil] structure du site
    Bonjour,
    je desire creer une page avec une menu deroulant a gauche, et un contenu qui change a droite, en fonction des liens selectionnes..
    C'est exactement comme sur cette page (avec un Panel Menu) : http://livedemo.exadel.com/richfaces-demo/

    Mais sur ce site, TOUTE la page est reloadee lors de la navigation par le menu, meme le menu... travaillant en jsf/ajax, je pense qu'il est possible de ne pas recharger le menu, mais juste l'emplacement "contenu"...

    Est-ce un travail pour Facelets, ou c'est possible de base sans librairie ?
    Je ne suis pas tres connaisseur dans la creation de page internet, encore moins dans la structuration, donc j'aimerais un avis exterieur... a l'epoque de jsp, j'utilisais Struts !

    Merci d'avance..

  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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    L'un des avantages d'Ajax, c'est effectivement de n'avoir qu'à recharger des bouts de pages, et non la page en entier.
    Maintenant, JSF "de base" ne permet pas d'utiliser de l'Ajax (enfin, sans avoir à coder soit même le Javascript). Il faut utiliser une librairie Ajax. Par exemple, avec RichFaces, tu disposes de Ajax4JSF.

    Un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <a4j:outputPanel id="onePanel">
        ...
    </a4j:outputPanel>
     
    <a4j:commandButton action="#{myBean.doSomething}" reRender="onePanel" value="Click me"/>
    Sur cette page, lorsque l'utilisateur cliquera sur le bouton "Click me", la méthode doSomething du bean myBean sera exécutée, puis seul le code HTML contenu dans le panel onePanel sera mis à jour, et non toute la page.

    Cela répond-il à ta question ?
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    J'ai oublie de preciser que j'utilisai bien RichFaces, et donc a4f.
    LA methode que tu utilises est tres efficace, je l'adopte a certains endroit du site mais ici, je pense qu'il vaut mieux separer le cadre dans un autre fichier, si c'est possible...car je ne pense pas que mettre tout le contenu du site dans le meme fichier JSP est une bonne idee, non ?

    Ce que j'ai en tete, c'est :
    - Je clique sur le menu de gauche a un endroit
    - Le cadre de droite est charge avec un nouveau .jsp, sans que le reste soit modifie...

    C'est possible ?

  4. #4
    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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Là ça revient à une problématique propre au HTML :
    * Soit tu utilises une page complète et tu refais des rerenders sur certaines parties de cette page (avec la méthode que je t'ai indiquée).
    * Soit tu utilises une page contenant des frames HTML. Tu n'auras alors qu'à mettre à jour l'une des frames.

    Personnellement, j'utilise la 1e solution, et ça me va très bien
    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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Si j'ai bien compris ce que tu me dis, tu as une page JSP qui contient a peu pres tout le site ?

    Prenons un site avec 2 contenus, une page pour se logger, une page pour souhaiter la bienvenue. Tu crees les 2 pages dans deux panels differents (mais dans le meme jsp) et tu affiches chacun de ces pannels au moment opportun..

    J'ai bien compris ?

  6. #6
    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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Non pas tout à fait.

    Premièrement, je dispose d'un template (j'utilise Facelets). Ce template me permet de positionner certains éléments fixes dans ma page (mon header, mon footer, mon menu).
    Ensuite, le corps principal de la page va changer en fonction de la partie visible de mon application. C'est géré par les règles de navigation de JSF.
    Toutefois, dans pas mal d'écrans, je fais des re-rendus par Ajax. Par exemple, certains boutons vont permettre d'ajouter / supprimer des éléments dans un tableau. Là, j'utilise Ajax pour faire un rerendu du tableau, plutôt que de réafficher toute la page.

    D'un point de vue structure, je divise beaucoup mes pages JSF en sous-pages.
    Par exemple, j'ai une page request.xhtml, qui va se diviser en request-description.xhtml, request-table.xhtml, request-commands.xhtml, etc.
    La page principale fera des includes (<ui:include .../>) de ces sous-pages.
    Mais cela n'est destiné qu'à faciliter la lisibilité et la maintenance de mon application parce qu'au final, au niveau du client, il n'y a qu'une page HTML.

    Suis-je assez clair ?
    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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Je pense que oui. Je vais essayer Facelets dans ce cas.

    En gros, pour de "gros" changements de page, tu changes de page grace a facelets, autrement tu rerender les panels appropries.

    Merci beaucoup

  8. #8
    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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Grosso modo, si c'est de la navigation, je rerender le tout.
    Si ce sont des modifications à l'intérieur d'une page (mais que je ne bouge pas au niveau navigation sur mon appli), je vais utiliser un re-render. Sauf en cas de submit global d'un formulaire, où je préfère tout réafficher (j'utilise un <h:commandButton> au lieu d'un <a4j:commandButton> quoi).
    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

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Je me suis mis a facelets, j'ai fait quelques restructurations.. et j'ai quelques questions...

    J'ai mis mon panelMenu dans un include du template. Chaque ligne de ce menu a une action, par ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <rich:panelMenuItem label="Changer page" action="#{entreprise.redirect}">
    ou redirect revoie une string mappee dans le faces-config.xml.

    1e probleme : Je suis sous eclipse, des que je cree un xhtml il n'y a plus d'autocompletion...c'est assez genant pour faire du jsf... Tu as ce probleme aussi ?

    2e probleme : Dans la page contenu, j'utilise un SelectOneMenu de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <h:selectOneMenu onchange="submit()" immediate="true"
    valueChangeListener="#{entreprise.changeSelection}">
      <f:selectItems value="#{entreprisectrl.list}" />
    </h:selectOneMenu>
    Des que je selectionne une nouvelle ligne, le PanelMenu a gauche a l'air recharge (car le noeud ouvert se referme..) alors que je ne l'ai jamais demande.. Dans la fonction changeSelection, je met juste a jour le Bean.
    Avant facelets, ce comportement n'existait pas...je n'arrive pas a l'expliquer..
    J'ai print une phrase dans la methode isExpanded du menu. A chaque action que je fais autre part, cette methode est appelee 8 fois !!! Comment ca se fait ?

    3e probleme : bah c'est plus trop ce que je voulais... Ici le menu est recharge quand je navigue, donc lorsque j'ouvre le pannelMenu a un endroit, et que je me deplace, il va se refermer... SelectedChild n'expand pas les groupes, il ne fait que de mettre en italique le nom...et je ne trouve pas le bon moyen de garder les noeuds ouverts... Des idees ?

    4e probleme : Si j'ai bien compris, il faut creer un xhtml par element (modalPanel par exemple)..chaque composant est distinct ?

    Merci merci

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Quelqu'un aurait des reponses a mes questions ? J'ai fait evoluer mon post mais cela fait quelques jours que je n'avance plus trop...

    Merci d'avance !

  11. #11
    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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Problème 1: Moi je dispose de l'autocomplétion sur mes fichiers XHTML, via Exadel (qui ajoute le support JSP, JSF et autres à Eclipse).

    Problème 4: Un fichier XHTML correspond à une page ou un morceau de page. Si tu fais un fichier XHTML par composant, tu vas vite te retrouver avec des centaines de pages !
    Tu peux mettre toute ta page sur un seul XHTML, mais tu peux aussi diviser cette page en plusieurs morceaux, pour une lecture plus aisée...
    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

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Merci pour ces reponses, le site avance doucement mais surement

    Sinon il y a des comportements que je n'arrive pas a expliquer parfois...

    Par exemple ici, j'affiche sur une page jsf un attribut d'un bean et cela me fait une erreur du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rendered="#{service.remonteeKm}": Error reading 'remonteeKm' on type bean.Service_$$_javassist_51
    Pour verifier que son contenu est correct, je print la valeur du bean dans la classe correspondante (en sortie standard)..et la, la page jsf ne fait meme plus d'erreur et affiche la valeur !
    En gros, pour que ca marche, je dois laisser une ligne du genre, attribut etant n'importe quel attribut de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test.getAttribut();
    Je n'y comprend rien

  13. #13
    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 : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Tu peux montrer le bout de ton code Java ?
    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

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    C'est un peu eparpille, mais je vais essayer de tout mettre :
    Pour chaque contrat d'un client, j'ecris des infos dessus et pour chaque service d'un contrat, j'ecris des infos dessus, cad dataGrid imbriquees...

    client.xhtml : la page jsf
    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
     
    <ui:define ...
     
    <h:form>
    <rich:dataGrid value="#{client.contrats}" var="contrat">
    <rich:panel>
      //Affichage d'infos texte sur le contrat
     
          <rich:dataGrid value="#{contrat.services}" var="service">
    	<rich:panel>
    	  <h:outputText value="Service #{service.idService}"/>
                 </rich:panel>
          </rich:dataGrid>
     
    </rich:panel>
    </h:form>
     
    ...
    La base de donnees actuelle est :
    Contrat <1-n> ContratService <1-1> Service

    Afin de faciliter la page, j'ai creer une ArrayList services dans Contrat que je met a jour a partir des donnes contenues dans la ArrayList ContratServices remplie par Hibernate.

    Contrat.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         private Collection<ContratService> contratServices = new ArrayList<ContratService>(0);
         private ArrayList<Service> services = new ArrayList<Service> (0);
     
         public void setServices() {
    		for (ContratService c : contratServices)
    		{		
    			//c.getService().getCommentSe();
    			services.add(c.getService());
    		}
    	}
    En laissant le commentaire la page fait une erreur..sinon tout va bien... bizzare bizzare

    service.java est une classe avec un attribut idService, getter/setter, construteur..

    S'il manque des infos, je suis dans le coin ! Merci pour ton aide romaintaz..

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 91
    Par défaut
    Les erreurs d'acces aux attributs viennent du Lazy loading on dirait..

    Envoyé par djo.mos

    Considérons le scénario suivant :
    - Le controlleur demande à la couche DAO où Service un DTO X qui contient une association avec un autre DTO Y.
    - La DAO ouvre une transaction, récupère X, ferme la transaction et le retourne au contôleur.
    - Le contrôleur essaie d'accéder à X.Y
    ==> Lazy initialization Exception !

    Dire que c'est une erreur de Design ou encore une limitation technique du middle-tier, OK ! mais une erreur de programmation, je n'en suis pas sûr !

    Comme solutions trafiquotées, on peut effectivement faire un accès vide à toutes les entités en relation avec X avant la fermeture de la transaction, mais ce n'est pas concevable dans une application qui traite de données imposantes.
    Je ne comprend toujours pas exactement le comportement d'hibernate sur ce point la..
    Tant que la session est ouverte, on peut acceder a toutes les donnees, une fois fermee, l'objet se detache..et pourquoi garde t'il les references vers les objets ayant eu un "acces vide" ?
    J'ai lu quelques threads dessus mais je n'arrive toujours pas a m'expliquer le principe du lazy loading...

Discussions similaires

  1. structure conseillée pour un site ?
    Par jarailet dans le forum Débuter
    Réponses: 1
    Dernier message: 15/07/2009, 15h23
  2. [Conseils] Structure d'un XML de sérialization ?
    Par jbat dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 13/07/2006, 18h03
  3. [MAVEN2] structure de site
    Par lunatix dans le forum Maven
    Réponses: 5
    Dernier message: 21/03/2006, 14h20
  4. [HTML] Recherche structure de site ...
    Par Kylen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 08/06/2005, 13h38

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