2010-12-01 25 views
1

J'ai un problème très simple mais ennuyeux avec JSF. J'ai un datatable (avec la première option simple de pagination du premier, etc.), que je veux peupler de la même page où les utilisateurs font la sélection initiale.Problème étrange avec rendu = true/false problèmes dans JSF

forme initiale

<b><h:selectOneRadio id="radio1" layout="pageDirection" style="font-weight: bold" value="#{displayNOC.slection}">  <f:selectItem itemLabel="Search By NOC" itemValue="N" id="selectItem1" /> 
<f:selectItem itemLabel="Search By Title" itemValue="T" id="selectItem2" /> 
</h:selectOneRadio></td> 
<hx:commandExButton type="submit" image="images/btn_search.jpg" action="#{displayNOC.Process_request}" onclick="return validate_ListNoc(this.form)"></hx:commandExButton></b> 

Une fois que l'utilisateur sélectionner un bouton radio et cliquez sur « recherche », je suis peuplant un datatable (qui est caché dans la même page avec des propriétés rendues faux) et un bouton d'appel (à ce l'étape I n'a que le bouton NEXT qui est également caché au moment du chargement du formulaire en utilisant la propriété rendue) sans aucun problème.

<B>Search Results :<BR><BR> 
<h:inputHidden id="text1" value="#{displayNOC.firstRow}" ></h:inputHidden> 
navigation Next button start 
<hx:commandExButton type="submit" value="Next" action="#{displayNOC.goNext}" rendered="#{displayNOC.render_panel_status}" disabled="#{displayNOC.firstRow + displayNOC.rowPerPage >= displayNOC.totalSize}"> 
</hx:commandExButton> 

<h:dataTable border="1" id="table" value="#{displayNOC.WAMNOC}" rendered="#{displayNOC.render_status}" var="SearchResult" headerClass="row2" rowClasses="row-even,row-odd" cellspacing="6"> 
<h:column> 
<f:facet name="header"> 
    <h:commandLink value="NOC_Number" style="text-align: center"> 
    </h:commandLink> 
     </f:facet> 
     <h:outputText value="#{SearchResult[0]}" /> 
     </h:column> 
...................... 
....................... 
</h:datatable> 

Mon SCOPE géré bean: DEMANDE face-config.xml est la suivante (j'ai tout le getter et setter pour tous les vars)

@SuppressWarnings("unchecked") 
public void Process_request() 
{ 
    setRender_status(true); 
    setRender_panel_status(true); 
    WAMNOCSERVICE WNS=new WAMNOCSERVICE(); 
    List<WAM_NOC> wnoc= WNS.getNOCandOccupation(0,10); 
    //get the total size of the records 
    setTotalSize(WNS.totalRecordAvaiable()); 
    setTotalpage(wnoc.size()/10); 
    setRowPerPage(10); 
    setFirstRow(1); 
    setWAMNOC(wnoc); 
} 

//this action is for next button in the table paging 
@SuppressWarnings("unchecked") 
public void goNext() 
{ 
    setRender_status(true); 
    setRender_panel_status(true); 
    setRowPerPage(10); 
    System.out.println(firstRow); 
    firstRow = getFirstRow() + rowPerPage; 
    WAMNOCSERVICE WNS=new WAMNOCSERVICE(); 
    List<WAM_NOC> wnoc= WNS.getNOCandOccupation(firstRow,rowPerPage); 
    setWAMNOC(wnoc); 
    } 

Mon problème est quand je clique GoNext () button render_status n'a jamais la valeur true et je ne vois plus aucun datatable ou bouton. En admettant que je suis nouveau à JSF, c'était la dernière chose que je pensais me donner un tel problème. Toute aide serait très appréciée.

Répondre

1

La condition pour l'attribut rendered est réévaluée dans la demande suivante. Mais comme cela dépend d'un bean tronqué de requête qui est endommagé à la fin de la réponse et recréé lors d'une nouvelle requête, cette condition retournera par défaut et l'action ne sera donc pas invoquée lorsque vous l'avez dans un composant UICommand de ses parents.

Dans 1.x JSF il y a plusieurs solutions pour tout le monde: ce

  • Put haricot portée de la session. Le plus simple, mais pas bon pour l'utilisateur lorsque l'utilisateur final ouvre la même page dans plusieurs onglets/navigateurs sur la même session.

  • Utilisez <h:inputHidden> avec une liaison. Nasty, plus de détails peuvent être trouvés dans this answer.

  • Utilisez Tambahawk <t:saveState> pour conserver le bean dans la prochaine demande. Propre et agréable, mais nécessite une bibliothèque de composants supplémentaires.

    <t:saveState value="#{displayNOC}" /> 
    

La solution JSF 2.0 serait de mettre juste le grain dans le champ de vue.

+0

Merci pour votre message. J'ai suivi votre poste/site et appris fondamentalement JSF de vos articles postés. J'ai une question de suivi, quelle serait la meilleure façon de gérer cela dans la version JSF 1.1. Je viens de vérifier mes plugins Websphere et c'est JSF 1.1. Encore une fois merci pour votre réponse rapide. – BBA

+0

Oh, vous étiez à l'origine étiqueté la question comme JSF 2.0, donc je l'ai supposé JSF 2.0. Malheureusement, ça va être hacky sur JSF 1.x ... J'ai mis à jour la réponse. – BalusC

+0

Merci encore. J'apprécie votre aide – BBA