views:

50

answers:

2

My result tables/images will be displayed in the same page. But the submit button is not invoked. I have two drop downs on which the values of the other two drop downs are dependent. If I am writting immediate="true" the method is invoked but only two values are set with whom I have associated processValueChange action the other selected values are not updated in the bean.

The jsp page is as follows:

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

<%@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>

My backing bean Login Form is as follows:

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");
    }


}

How to submit the form properly?

A: 

When a form is not being submitted, sometimes it may happen from a mistaken usage of JSF component.

I see that you are using

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

which comes from:

viewList=ddC.getViewList();

and the selected item goes into a String value.

can you please write the code of getViewList ?

If the items are declared of int,String - than the problem is that slaView should be of type int.

Odelya
Sure....I have made a seperate class for all the drop downs. I am invoking the methods to fetch the drop down list :List<SelectItem> viewList=new ArrayList<SelectItem>();public List<SelectItem> getViewList() { viewList.clear(); viewList.add(new SelectItem(0,"Select")); viewList.add(new SelectItem(1,"Table")); viewList.add(new SelectItem(2,"Graph")); return viewList;}If you require I can paste the entire code of that class. thanks for your reply.
Debarshi DasGupta
@Debarshi - you can see my answer in your code. You add (new SelectItem(2,"Graph")) where the first item is int (2) and the second item is String ("Graph"). Which means that also slaView has to be of type int and not of type String.As well, the rest of value of h:selectOnMenu must be of type int.
Odelya
Ok thanks for your suggestion I am trying the same. I will update you once it is done.
Debarshi DasGupta
@Odelya u are gr8.....thankzzzzz^billions my problem is resolved......There is another problem small problem my page is getting cached....do u have a solution?
Debarshi DasGupta
@Debarshi for the other problem please post a new question. Like this other users may be able to help.
Odelya
@Odelya as you wish Mam.
Debarshi DasGupta
A: 

You're calling FacesContext.getCurrentInstance().renderResponse(); inside a valueChangeListener method whenever a dropdown value changes. This will cause the remaining phases of the JSF lifecycle being skipped until the render response phase. Since the valueChangeListener method is invoked during validations phase, the update model values and invoke action phases are skipped. And guess what, the submit button is to be invoked during invoke action phase, but this is been skipped!

Anyway, creating dynamic dependent dropdown menus wherein the data is fully to be retrieved from the server side without any help of advanced JavaScript and Ajax is a real pain. You've to take a lot of things into account with regard to skipping validation of other fields and retaining submitted values of other fields. So also in JSF. Long story short, here's an article which describes how to do it properly: Populate child menu's.

BalusC
Dear Balus ,I am big fan of yours. thanks for your suggestions and time. See the problem is if I am removing this statement FacesContext.getCurrentInstance().renderResponse(); my values are getting resset on selecting the select one menu. There is a big problem of page caching with jsf , do you have a solution for that ? what I am planning is to manually reset the drop down using js. Will it be fyn?
Debarshi DasGupta
You need this line, but in combination with `immediate="true"` and **component binding**. Do this only for dropdowns which are to be used to update another dropdown on change. Also see the linked article for a working code example.
BalusC
ok thanks a loooooot.
Debarshi DasGupta