2010-07-28 8 views
0

Mes tables/images de résultats seront affichées dans la même page. Mais le bouton de soumission n'est pas invoqué. J'ai deux listes déroulantes sur lesquelles dépendent les valeurs des deux autres listes déroulantes. Si j'écris immediate="true" la méthode est invoquée mais seulement deux valeurs sont définies avec lesquelles j'ai été associée processValueChange action les autres valeurs sélectionnées ne sont pas mises à jour dans le bean.La méthode Listener List dans BackBean n'est pas invoquée

La page jsp est la suivante:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<%@taglib uri="http://www.ibm.com/jsf/html_extended" prefix="hx"%> 
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@taglib 
uri="http://www.ibm.com/jsf/BrowserFramework" prefix="odc"%> 
<html> 
<head> 
<script language="javascript" src="Validation.js"></script> 
<link rel="stylesheet" href="../css/style.css" type="text/css"> 
<title>SLA DASHBOARD</title> 
</head> 

<f:view> 
    <body> 
    <hx:scriptCollector id="scriptCollector1"> 

    <div id="mDiv" class="pStyle">  
    <h:form styleClass="form" id="LoginForm" ><br> 
     <br> 
    <div id="Header" class="hStyle"> 
      <h:outputText value= "WELCOME TO SLA DASHBOARD" /> 
    </div> 
    <br><br>&nbsp;&nbsp;&nbsp;&nbsp; 
    <div id="fDiv" > 
     <fieldset class="fStyle"> 
      <legend style="text-align: left;padding: 6px; font-weight:bold; font-size: 14">PLEASE MAKE YOUR SELECTION</legend><br> 
      &nbsp;&nbsp; 
      <h:outputText value="BU"/>&nbsp; 
      <h:selectOneMenu id="slaBU" value="#{LoginForm.slaPeriod}" 
       onchange="this.form.submit();" valueChangeListener="#{LoginForm.processBUChange}"> 
       <f:selectItems value="#{LoginForm.buList}" /> 
      </h:selectOneMenu>&nbsp;&nbsp; 
      <h:outputText>Application</h:outputText>&nbsp; 
      <h:selectOneMenu id="slaApplication" style="width:160px" value="#{LoginForm.slaApp}" required="true"> 
       <f:selectItems value="#{LoginForm.appList}" /> 
      </h:selectOneMenu>&nbsp;&nbsp; 
      <h:outputText>Period</h:outputText> 
      <h:selectOneMenu id="slaPeriod" value="#{LoginForm.slaPeriod}" onchange="this.form.submit()" 
       valueChangeListener="#{LoginForm.processPeriodChange}" > 
       <f:selectItems value="#{LoginForm.periodList}" /> 
      </h:selectOneMenu> 
      &nbsp; 
      <h:selectOneMenu id="slaPeriod1" style="width:100px" 
       value="#{LoginForm.slaPeriod1}" required="true"> 
       <f:selectItems value="#{LoginForm.periodList1}" /> 
      </h:selectOneMenu>&nbsp; 

      <h:selectOneMenu id="slaPeriod2" value="#{LoginForm.slaPeriod2}" required="true"> 
       <f:selectItems value="#{LoginForm.periodList2}" /> 
      </h:selectOneMenu>&nbsp;&nbsp; 
      <h:outputText value="SLA Group" /> 
      <h:selectOneMenu id="slaGroup" value="#{LoginForm.slaGroup}" required="true"> 
       <f:selectItems value="#{LoginForm.groupList}" /> 
      </h:selectOneMenu>&nbsp;&nbsp; 

      <h:outputText>View</h:outputText>&nbsp; 
      <h:selectOneMenu id="slaView" value="#{LoginForm.slaView}" required="true"> 
       <f:selectItems value="#{LoginForm.viewList}" /> 
      </h:selectOneMenu> &nbsp;&nbsp;&nbsp; 
      <h:commandButton id="submitButton" value="Submit" 
       type="submit" 
       style="width:60px;" action="#{LoginForm.processSubmit}" 
       /> 
      &nbsp; 
       <br> 
       <br> 
      </fieldset> 
     </div><br><br><br> 
     <div id="tDiv" > 
     <h:dataTable id="bTable" value="#{LoginForm.BT}" var="BillingTable" 
       style="font-weight: bold; text-align: center;" bgcolor="#D4D7FE" 
       border="4" cellpadding="1" width="60%" 
       rendered="#{LoginForm.btDisplay}"> 

       <f:facet name="header"> 
        <h:outputText value="Billing Report" style="font-weight: bold"/> 
       </f:facet> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Buisness Unit" /> 
        </f:facet> 
        <h:outputText value="#{BillingTable.buName}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Completion Date" /> 
        </f:facet> 
        <h:outputText value="#{BillingTable.completionDate}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Target Date" /> 
        </f:facet> 
        <h:outputText value="#{BillingTable.targetDate}"></h:outputText> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Billing Cycle" /> 
        </f:facet> 
        <h:outputText value="#{BillingTable.billingCyle}"></h:outputText> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Status" /> 
        </f:facet> 
        <h:outputText value="#{BillingTable.status}"></h:outputText> 
       </h:column> 
      </h:dataTable> 
      <br> 
      <h:dataTable id="uTable" value="#{LoginForm.UT}" var="UptimeTable" 
       style="text-align: center" bgcolor="#D4D7FE" 
       border="4" cellpadding="1" width="60%" rendered="#{LoginForm.utDisplay}"> 

       <f:facet name="header"> 
        <h:outputText value="Uptime Report" style="font-style: normal; font-weight: bold"/> 
       </f:facet> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Application Name" style="width:60px" /> 
        </f:facet> 
        <h:outputText value="#{UptimeTable.applicationName}" /> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Application Class" /> 
        </f:facet> 
        <h:outputText value="#{UptimeTable.applicationClass}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Availability-Actual" /> 
        </f:facet> 
        <h:outputText value="#{UptimeTable.actual}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Availability-Target" /> 
        </f:facet> 
        <h:outputText value="#{UptimeTable.target}"></h:outputText> 
       </h:column> 
      </h:dataTable> 
      <br> 
      <h:dataTable id="tTable" value="#{LoginForm.TT}" var="TATTable" 
       style="font-weight: bold; text-align: center" bgcolor="#D4D7FE" 
       border="4" cellpadding="1" width="60%" 
       rendered="#{LoginForm.ttDisplay}"> 

       <f:facet name="header"> 
        <h:outputText value="Turn Around Time Report" /> 
       </f:facet> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Application Name" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.applicationName}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Application Class" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.applicationClass}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="TAT Average" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.tatAverage}" /> 
       </h:column> 

       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="TAT Target" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.tatTarget}"></h:outputText> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Request Count" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.reqCount}"></h:outputText> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Request Type" /> 
        </f:facet> 
        <h:outputText value="#{TATTable.reqType}"></h:outputText> 
       </h:column> 
      </h:dataTable> 
      </div> 
      <br> 
      <h:graphicImage styleClass="graphicImage" id="reportImage" alt="Sorry records not found !!" 
       value="#{LoginForm.imageLocation}" width="700" height="250" rendered="#{LoginForm.viewImage}"> 
       </h:graphicImage><br> 
      <h3><h:outputText value="Sorry records not found !!" rendered="#{LoginForm.notFoundMsg}"/></h3> 
     </h:form> 
     </div> 
    </hx:scriptCollector></body> 
</f:view> 
</html> 

Mon backing bean Login Form est comme suit:

package sla.dashboard.form; 

import sla.dashboard.Search.SearchManager; 
import sla.dashboard.drop_down_components.*; 
import sla.dashboard.datatables.*; 
import java.util.*; 
import javax.faces.context.FacesContext; 
import javax.faces.event.*; 
import javax.faces.model.*; 



public class LoginForm implements ValueChangeListener,ActionListener 
{ 

    private String slaBU=null,slaPeriod1=null,slaPeriod2=null,slaGroup=null, 
    periodType=null,periodSelected=null,slaView=null,period=null, 
    imageResult=null,imageLocation=null; 
    private int slaPeriod,slaApp; 

    Boolean btDisplay,utDisplay,ttDisplay,viewImage,notFoundMsg; 

    //Table Lists 
    List <BillingTable> BT; 
    List <UptimeTable> UT; 
    List <TATTable> TT; 

    DropDownComponents ddC; 

    List<SelectItem> buList; 
    List<SelectItem> periodList; 
    List<SelectItem> periodList1; 
    List<SelectItem> periodList2; 
    List<SelectItem> groupList; 
    List<SelectItem> appList; 

    List<SelectItem> viewList; 

    ArrayList<String> result= new ArrayList<String>(); 


    public LoginForm() 
    { 

     ddC=new DropDownComponents(); 
     buList=ddC.getBuList(); 
     this.reset(); 

     BT=new ArrayList<BillingTable>(); 
     UT=new ArrayList<UptimeTable>(); 
     TT=new ArrayList<TATTable>(); 

     System.out.println("\n Back Bean Object Instantiated"); 
    } 

    public int getSlaApp() { 
     return slaApp; 
    } 

    public Boolean getBtDisplay() { 
     return btDisplay; 
    } 

    public void setBtDisplay(Boolean btDisplay) { 
     this.btDisplay = btDisplay; 
    } 

    public Boolean getUtDisplay() { 
     return utDisplay; 
    } 

    public void setUtDisplay(Boolean utDisplay) { 
     this.utDisplay = utDisplay; 
    } 

    public Boolean getTtDisplay() { 
     return ttDisplay; 
    } 

    public void setTtDisplay(Boolean ttDisplay) { 
     this.ttDisplay = ttDisplay; 
    } 

    public void setSlaApp(int slaApp) { 
     this.slaApp = slaApp; 
    } 

    public int getSlaPeriod() { 
     return slaPeriod; 
    } 

    public void setSlaPeriod(int slaPeriod) { 
     this.slaPeriod = slaPeriod; 
    } 


    public String getPeriod() { 
     return period; 
    } 

    public void setPeriod(String period) 
    { 

     this.period = period; 
    } 

    public List<SelectItem> getViewList() { 
     return viewList; 
    } 

    public void setViewList(List<SelectItem> viewList) { 
     this.viewList = viewList; 
    } 

    public List<SelectItem> getPeriodList() { 
     return periodList; 
    } 
    public void setPeriodList(List<SelectItem> periodList) { 

     this.periodList = periodList; 
    } 

    public List<SelectItem> getBuList() 
    { 
     return buList; 
    } 

    public String getPeriodType() { 
     System.out.println("Inside getPeriodType " + periodType); 
     return periodType; 
    } 

    public void setPeriodType(String periodType) { 
     System.out.println("Inside setPeriodType "+ periodType); 
     this.periodType = periodType; 
    } 

    public void setBuList(List<SelectItem> buList) { 
     this.buList = buList; 
    } 

    public String getSlaBU() { 
     return slaBU; 
    } 

    public void setSlaBU(String slaBU) 
    { 
     this.slaBU = slaBU; 
    } 
    public String getSlaPeriod1() 
    { 

     return slaPeriod1; 
    } 

    public void setSlaPeriod1(String slaPeriod1) { 
     this.slaPeriod1 = slaPeriod1; 
    } 

    public String getSlaPeriod2() { 
     return slaPeriod2; 
    } 

    public void setSlaPeriod2(String slaPeriod2) { 
     this.slaPeriod2 = slaPeriod2; 
    } 
    public String getPeriodSelected() { 
     return periodSelected; 
    } 

    public void setPeriodSelected(String periodSelected) { 
     this.periodSelected = periodSelected; 
    } 
    public List<SelectItem> getPeriodList1() { 
     return periodList1; 
    } 

    public void setPeriodList1(List<SelectItem> periodList1) { 
     this.periodList1 = periodList1; 
    } 

    public List<SelectItem> getPeriodList2() { 
     return periodList2; 
    } 

    public void setPeriodList2(List<SelectItem> periodList2) { 
     this.periodList2 = periodList2; 
    } 
    public String getSlaGroup() { 
     return slaGroup; 
    } 

    public void setSlaGroup(String slaGroup) { 
     this.slaGroup = slaGroup; 
    } 

    public List<SelectItem> getGroupList() { 
     return groupList; 
    } 

    public void setGroupList(List<SelectItem> groupList) { 
     this.groupList = groupList; 
    } 

    public List<SelectItem> getAppList() { 
     return appList; 
    } 

    public void setAppList(List<SelectItem> appList) { 
     this.appList = appList; 
    } 


    public String getSlaView() { 
     return slaView; 
    } 

    public void setSlaView(String slaView) { 
     this.slaView = slaView; 
    } 


    //ValueChangeListener 
    public void processValueChange(ValueChangeEvent arg0) throws AbortProcessingException 
    {} 

    public void processPeriodChange(ValueChangeEvent arg0) throws AbortProcessingException 
    { 
     this.setSlaPeriod(Integer.parseInt(arg0.getNewValue().toString())); 
     this.setPeriodList1(ddC.getPeriodList1(Integer.parseInt(arg0.getNewValue().toString()))); 

     System.out.println("Period Changed Value : "+this.getSlaPeriod()); 
     FacesContext.getCurrentInstance().renderResponse(); 
    } 

    public void processBUChange(ValueChangeEvent arg0) throws AbortProcessingException 
    { 
     this.setSlaBU(arg0.getNewValue().toString()); 
     this.setAppList(ddC.getAppList(Integer.parseInt(arg0.getNewValue().toString()))); 
     System.out.println("\n BU Slected : " + this.getSlaBU()); 
     FacesContext.getCurrentInstance().renderResponse(); 
    } 


    public void processAction(ActionEvent arg0) throws AbortProcessingException 
    {} 
    public List<BillingTable> getBT() { 
     return BT; 
    } 

    public void setBT(List<BillingTable> bt) { 
     BT = bt; 
    } 

    public List<UptimeTable> getUT() { 
     return UT; 
    } 

    public void setUT(List<UptimeTable> ut) { 
     UT = ut; 
    } 

    public List<TATTable> getTT() { 
     return TT; 
    } 

    public void setTT(List<TATTable> tt) { 
     TT = tt; 
    } 


    public void setImageLocation(String imageLocation) { 
     this.imageLocation = imageLocation; 
    } 

    public String getImageLocation() { 
     return imageLocation; 
    } 
    String getLabel(String index,List<SelectItem> lst) 
    { 
     return(lst.get(Integer.parseInt(index)).getLabel()); 
    } 
    public Boolean getViewImage() { 
     return viewImage; 
    } 

    public void setViewImage(Boolean viewImage) { 
     this.viewImage = viewImage; 
    } 

    public void setImageResult(String imageResult) { 
     this.imageResult = imageResult; 
    } 

    public String getImageResult() { 
     return imageResult; 
    } 

    public Boolean getNotFoundMsg() { 
     return notFoundMsg; 
    } 

    public void setNotFoundMsg(Boolean notFoundMsg) { 
     this.notFoundMsg = notFoundMsg; 
    } 

    public void reset() 
    { 
     slaPeriod=0; 
     slaApp=0; 
     slaBU="0"; 
     slaPeriod1="0"; 
     slaPeriod2="0"; 
     slaGroup="0"; 
     slaView="0"; 
     periodList=ddC.getPeriodList(); 
     periodList1=ddC.getPeriodList1(slaPeriod); 
     periodList2=ddC.getPeriodList2(); 
     groupList=ddC.getSlaGroupList(); 
     appList=ddC.getAppList(slaApp); 
     viewList=ddC.getViewList(); 
     this.setViewImage(false); 
     this.setUtDisplay(false); 
     this.setTtDisplay(false); 
     this.setBtDisplay(false); 
     this.setNotFoundMsg(false); 

    } 
    public String processSubmit() 
    { 
     System.out.println("Inside Process Submit "); 
     System.out.println(this.getSlaBU()+this.getSlaApp()+this.getSlaPeriod()+this.getSlaPeriod1()+ 
       this.getSlaPeriod2()+this.getSlaGroup()+this.getSlaView()); 
     this.setViewImage(false); 
     this.setUtDisplay(false); 
     this.setTtDisplay(false); 
     this.setBtDisplay(false); 
     this.setNotFoundMsg(false); 

     /*slaPeriod=1; 
     slaApp=0; 
     slaBU="1"; 
     slaPeriod1="1"; 
     slaPeriod2="2"; 
     slaGroup="2"; 
     slaView="1";*/ 

     if(this.slaGroup=="1" && slaView=="1") 
     { 
      BT=new SearchManager().searchBillingTable 
       (slaBU,periodList.get(slaPeriod).getLabel(), 
       this.getSlaPeriod1(),getLabel(slaPeriod2, 
       periodList2),getLabel(slaGroup,groupList)); 
       if(BT.size()!=0) 
        this.setBtDisplay(true); 
       else 
        this.setNotFoundMsg(true); 
     } 
     else 
     { 
      if(this.slaGroup=="2" && slaView=="1") 
      { 
        UT=new SearchManager().searchUptimeTable 
        (slaBU,periodList.get(slaPeriod).getLabel(), 
          this.getSlaPeriod1(),getLabel(slaPeriod2, 
          periodList2),getLabel(slaGroup,groupList)); 
        if(UT.size()!=0) 
         this.setUtDisplay(true); 
        else 
         this.setNotFoundMsg(true); 
      } 
      else 
      { 
       if(this.slaGroup=="3" && slaView=="1") 
       { 
        TT=new SearchManager().searchTATTable(slaBU,periodList.get(slaPeriod).getLabel(), 
        this.getSlaPeriod1(),getLabel(slaPeriod2, 
        periodList2),getLabel(slaGroup,groupList)); 
        if(TT.size()!=0) 
         this.setTtDisplay(true); 
        else 
         this.setNotFoundMsg(true); 

       } 
       else 
       { 
        if(slaView=="2") 
        { 
         imageResult=new SearchManager().searchImage(slaBU, 
         periodList.get(slaPeriod).getLabel(), slaPeriod1, 
         slaPeriod2,getLabel(slaGroup,groupList),slaView); 
         this.setImageLocation(imageResult); 
         this.setViewImage(true); 
        } 
        else 
        { 
         this.setNotFoundMsg(true); 
        } 
       } 
      } 
    } 
     return("Success"); 
    } 


} 

Comment soumettre le formulaire correctement?

+0

Alors ... beaucoup ... le code ... doit ... supprimer ... le passe-partout ... * hnnnggh * – f1sh

+0

@ f1sh: appuyez sur Ctrl + W la prochaine fois que vous le verrez. – BalusC

+0

@BalusC vous êtes gr8! – Dejell

Répondre

0

Lorsqu'un formulaire n'est pas envoyé, il peut arriver que l'utilisation du composant JSF soit erronée.

Je vois que vous utilisez

<h:selectOneMenu id="slaView" value="#{LoginForm.slaView}" required="true"> 
      <f:selectItems value="#{LoginForm.viewList}" /> 
     </h:selectOneMenu> 

qui vient de:

viewList=ddC.getViewList(); 

et l'élément sélectionné passe en une valeur de chaîne.

pouvez-vous s'il vous plaît écrire le code de getViewList?

Si les éléments sont déclarés int, String - le problème est que slaView doit être de type int.

+0

Bien sûr .... J'ai fait une classe séparée pour tous les drop downs. J'appelle les méthodes pour récupérer la liste déroulante: Liste viewList = new ArrayList (); public Liste getViewList() { \t \t viewList.clear(); \t \t viewList.add (nouvel élément SelectItem (0, "Select")); \t \t viewList.add (nouvel élément SelectItem (1, "Table")); \t \t viewList.add (new SelectItem (2, "Graphique")); \t \t return viewList; } Si vous avez besoin je peux coller l'intégralité du code de cette classe. merci pour votre réponse. –

+0

@Debarshi - vous pouvez voir ma réponse dans votre code. Vous ajoutez (new SelectItem (2, "Graph")) où le premier élément est int (2) et le second élément est String ("Graph"). Ce qui signifie que slaView doit être de type int et pas de type String. De même, le reste de la valeur de h: selectOnMenu doit être de type int. – Dejell

+0

Ok merci pour votre suggestion, je suis en train d'essayer la même chose. Je vais vous mettre à jour une fois que c'est fait. –

0

Vous appelez FacesContext.getCurrentInstance().renderResponse(); à l'intérieur d'une méthode valueChangeListener chaque fois qu'une valeur de liste déroulante change. Cela entraînera le saut des phases restantes du cycle de vie JSF jusqu'à la phase de réponse de rendu. Étant donné que la méthode valueChangeListener est appelée pendant la phase de validation, les valeurs du modèle de mise à jour et les phases d'action d'appel sont ignorées. Et devinez quoi, le bouton de soumission doit être invoqué pendant la phase d'action invoke, mais cela a été ignoré! Quoi qu'il en soit, créer des menus déroulants dépendants dynamiques dans lesquels les données doivent être entièrement récupérées du côté serveur sans aucune aide de JavaScript avancé et Ajax est une vraie douleur. Vous devez tenir compte de beaucoup de choses en ignorant la validation des autres champs et en conservant les valeurs soumises des autres champs. Donc aussi en JSF. Longue histoire courte, voici un article qui décrit comment le faire correctement: Populate child menu's.

+0

Cher Balus, Je suis votre grand fan. merci pour vos suggestions et votre temps. Voir le problème est si je supprime cette déclaration FacesContext.getCurrentInstance(). RenderResponse(); mes valeurs se resset en sélectionnant le menu de sélection. Il y a un gros problème de mise en cache des pages avec jsf, avez-vous une solution pour cela? ce que je prévois est de réinitialiser manuellement le menu déroulant en utilisant js. Sera-ce fyn? –

+0

Vous avez besoin de cette ligne, mais en combinaison avec 'immediate =" true "' et ** component binding **. Faites-le uniquement pour les listes déroulantes qui doivent être utilisées pour mettre à jour une autre liste déroulante. Consultez également l'article lié pour un exemple de code de travail. – BalusC

+0

ok merci un loooooot. –