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 :

Décider ce que l'on envoie avec a4j


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut Décider ce que l'on envoie avec a4j
    Bonjour,

    J'ai une page qui contient plusieurs tableaux. J'ai un bouton "+" qui me permet d'ajouter une ligne. Cette action ce fait en en Ajax avec a4j. J'ai mis une région autour de mon tableau pour ne décoder que les informations nécessaires. Cependant la requête Ajax envoi toutes les informations de la page. Ma page étant assez lourde la durée de la phase APPLY_REQUEST_VALUES du cylce est assez longue (< 3s).

    Peux t-on limiter les informations envoyé dans la requête Ajax?


    Voici le code de ma page:
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     
    <html xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:t="http://myfaces.apache.org/tomahawk"
    	xmlns:s="http://myfaces.apache.org/sandbox"
    	xmlns:a4j="http://richfaces.org/a4j"
    	xmlns:a="http://www.astek.fr/jsfComponents">
     
    <ui:composition>
    	<a4j:region id="ajaxRegion" selfRendered="true" renderRegionOnly="true">
    		<a4j:outputPanel id="panelTableauFDS" ajaxRendered="true"> 
    			<t:dataTable value="#{datas.lignes}" var="row" id="tableauFDS"
    				styleClass="tableau_fiche" style="width:100%" rowClasses="ligneImpaire,lignePaire">
    					<t:columns value="#{datas.colonnes}" var="question"
    						styleClass="conteneurInputTableau"
    						width="#{question.tailleHtml}"
    						headerstyleClass="#{(datas.colonnes.rowCount == question.ordre 
    												and (clos or forceDisable or (not forceEnable 
    														and not cm and datas.disableForUserRole)))?'lastTh':''}"
    						>
    						<f:facet name="header" >
    								<h:outputText value="#{question.libelle}"/>
    						</f:facet>
    						<a:question reponse="#{datas.columnValue}"
    							export="#{export}"
    							inactif="#{empty  ficheController.model.formulaire
    											or ficheController.model.formulaire.idForm != datas.idForm
    											or ficheController.model.numLigne != row
    											or (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}"
    							tableau="true" />
     
    						<f:facet name="footer">
    							<!-- Ajouter la ligne-->
    							<t:div rendered="#{not question.firstColumn and (not (clos or forceDisable or 
    											(not forceEnable and not cm and datas.disableForUserRole)))}">
    								<a4j:commandButton	
    									id="ajoutLigne"
    									image="/images/common/add.gif"
    									title="Ajouter une nouvelle ligne"
    									styleClass="bntAjoutFds"
    									actionListener="#{ficheController.ajoutLigne}" 
    									rendered="#{not(clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}"
    									style="display:block;text-align:left;"
    									reRender="tableauFDS"
    									ajaxSingle="true"
    								>
    									<a4j:actionparam name="idFormulaire" value="#{paragraphe.idForm}"
    													assignTo="#{ficheController.model.idForm}"/>
    								</a4j:commandButton>
    							</t:div>
    						</f:facet>
    					</t:columns>
     
    					<t:column rendered="#{not (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}"
    									style="text-align:center" 
    									width="1px">
    						<!-- Edition de la ligne -->
    						<t:commandButton 
    							id="editerLigne"
    							image="/images/common/modif.gif"
    							title="Editer"
    							actionListener="#{ficheController.editerLigne}"
    							rendered="#{empty  ficheController.model.formulaire
    										and ficheController.model.formulaire.idForm != datas.idForm
    										and ficheController.model.numLigne != row
    										and not (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}"
    							>
    							<t:updateActionListener
    								property="#{ficheController.model.formulaire}"
    								value="#{paragraphe}" />
    							<t:updateActionListener
    								property="#{ficheController.model.numLigne}" value="#{row}" />
    						</t:commandButton>
     
    						<!-- enreg de la ligne  -->
    						<t:commandButton  
    							id="modifierLigne"
    							image="/images/common/save15.png"
    							title="Enregistrer"
    							action="#{ficheController.enregistreReponsesTableau}"
    							rendered="#{ficheController.model.formulaire.idForm == datas.idForm
    										and ficheController.model.numLigne == row
    										and not (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}">
    						</t:commandButton>
    					</t:column>
    					<t:column rendered="#{not (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}"
    								headerstyleClass="lastTh"
    								style="text-align:center" 
    								width="1px">
    						<!-- Suppression de la ligne -->
    						<t:commandButton
    							id="supprimerLigne"
    							title="Supprimer"
    							image="/images/common/button_cancel.gif"
    							rendered="#{empty  ficheController.model.formulaire
    										and ficheController.model.formulaire.idForm != datas.idForm
    										and ficheController.model.numLigne != row
    										and not (clos or forceDisable or 
    										(not forceEnable and not cm and datas.disableForUserRole))}"
    							actionListener="#{ficheController.SupprLigneTableau}">
    							<t:updateActionListener
    								property="#{ficheController.model.formulaire}"
    								value="#{paragraphe}" />
    							<t:updateActionListener
    								property="#{ficheController.model.numLigne}" value="#{row}" />
    						</t:commandButton>
    						<!-- annulation des modifications de la ligne  -->
    						<t:commandButton  
    							image="/images/common/cancel_16x16.gif"
    							title="Annuler"
    							action="#{ficheController.annulerModification}"
    							rendered="#{ficheController.model.formulaire.idForm == datas.idForm
    										and ficheController.model.numLigne == row
    										and not (clos or forceDisable or (not forceEnable and not cm and datas.disableForUserRole))}">
    						</t:commandButton>
    					</t:column>
    			</t:dataTable>
    		</a4j:outputPanel>
    	</a4j:region>
    </ui:composition>
    </html>
    Merci d'avance

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par demanghonj Voir le message
    Bonjour,


    Peux t-on limiter les informations envoyé dans la requête Ajax?


    ouii en utilisant l'un des attributs:
    ajaxSingle: limite le passage par les phases JSF seulement au composant qui fait l'appel ajax.

    process : pour définir les composants qui seront traités dans les phases JSF.

    tu peux aussi utiliser immediate (meme principe pour les composants JSF) ou bypassUpdates pour sauter la phase update model..

    si tu utilise a4j:region tous les composants dans la region passent par le traitement des phases JSF.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on peux limiter la quantité de composant impliqués dans le apply request value via un a4j:region. Par contre, avec çà, le client envoie quand même la totalité des données, donc si t'as une connection lente (56k) + beaucoup de données (100k) , ca peux prendre du temps.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Sniper37
    ajaxSingle: limite le passage par les phases JSF seulement au composant qui fait l'appel ajax.
    process : pour définir les composants qui seront traités dans les phases JSF.
    tu peux aussi utiliser immediate (meme principe pour les composants JSF) ou bypassUpdates pour sauter la phase update model..
    si tu utilise a4j:region tous les composants dans la region passent par le traitement des phases JSF.
    a4j:region,process et ajaxSingle concerne les phases de decode, c'est à dire la conversion et la validation. La phase apply_request_value traite les données envoyé par la requête HTTP. Donc le seul moyen de limiter cette phase est de limité le nombre de données envoyées dans la requête HTTP (ici en Ajax)
    bypassUpdates concerne la phase de update_model (comme tu le dis) et la phase qui m'intéresse est apply_request_value

    tchize_
    on peux limiter la quantité de composant impliqués dans le apply request value via un a4j:region.
    Non, on limite le nombre de composant traité dans les phase de decode (process_validation et update_model).
    La phase apply_request_value traite les données envoyé par la requête HTTP. Donc le seul moyen de limiter cette phase est de limité le nombre de données envoyées dans la requête HTTP (ici en Ajax)

    Il faut donc que je limite le nombre de données envoyer par la requête Ajax.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    merci de la correction (et c'est évident, puisque les request value sont nécessaire au render qui lui n'est pas nécessairement limité à la region ^^)

    Par contre, 3 secondes pour effectuer un apply request value, je suis assez étonné, le boulot du apply request value étant normalement de simplement faire des get dans la map de la requete pour le stocker sous forme brute dans chaque composant, il ne devrait y avoir aucun traitement lourd là, et java dois etre capable de faire plusieurs dixaines de milliers de get sur une map en moins d'une seconde, c'est une opération banale :/

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Je suis d'accord avec sur ce sujet, seulement je ne sait pas pourquoi ce traitement prend autant de temps, surtout que sur cette page le traitement de ma phase render_response est très longue (parfois > 5s).

    Actuellement j'ai mis un listenner sur les phase qui compte la durée mais c'est tout.

    C'est tu comment peut-on visualiser en detail ce que fait une phase?


    Ceci pourrait me permettre de visualiser mon problème

    Merci

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la méthode aveugle mais rapide à mettre en place (et longue à utiliser jusqu'au bout):

    tu retire la moitié de ton formulaire et tu teste. ca va plus vite? alros la moitié retirée est partiellement responsable. ca va beaucoup plus vite? alors la moitié retirée est entièrement resposnable. ca va pas plus vite, alors la moitié restante est responsable. Une fois la zone responsable du formulaire isolée (si c'est faisable) plus qu'à regarder ce qu'elle fait.

    Si t'as que des composants de base dans ton formulaire, alors il est vraisemblable que ce soient tes bean reliés sur les champs de type rendered qui sont en cause (exemple: la moitiés des composant on des rendered="#{bean.xxx}" avec xxx une propriété qui va cherher des infos dans la db: une requete db fois 150 composants, ca fait vite mal



    deuxième possibilité: utiliser un profiler, lancer ton application, fait des requetes à fond pendant 15 minutes, demander au profiler les point chaud de ton applicaiton, enqueter sur la raison de ces point chaud

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par demanghonj Voir le message
    Sniper37

    a4j:region,process et ajaxSingle concerne les phases de decode, c'est à dire la conversion et la validation. La phase apply_request_value traite les données envoyé par la requête HTTP. Donc le seul moyen de limiter cette phase est de limité le nombre de données envoyées dans la requête HTTP (ici en Ajax)
    bypassUpdates concerne la phase de update_model (comme tu le dis) et la phase qui m'intéresse est apply_request_value

    ça concerne: decoding, conversion/validation, value applying

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

Discussions similaires

  1. Que peut on faire avec SOAP?
    Par feed_our_vision dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/05/2006, 18h11
  2. [MySQL] probleme envoi avec POST
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 24/04/2006, 09h11
  3. [PEAR][Mail] Est ce que c'est mieux avec PEAR ?
    Par hisy dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 07/03/2006, 12h33
  4. Qu'est ce que l'ads realm avec Samba
    Par oligig dans le forum Réseau
    Réponses: 4
    Dernier message: 23/02/2006, 16h09
  5. Que peut-on faire avec une vue ?
    Par Invité dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 20/10/2005, 11h13

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