Richfaces component

Hi!

I've a small problem with a richface component, I cannot find what I do wrong:

I want to do:

A tree, listing categories of services. When we click on a final node, we display services of this categories.

When this is selected, we can "choose him" by clicking on a button(why this step? Because we will use different services for different actions).

Most of theses things works. But when I click on the commandbutton, the panel that display services in the current categorie) is not more shown. I've a "rendered" to display services only when we have a categorie selected.

Where am I wrong? I've the impression there is a "shortcut" between the ajax of the tree and the ajax of the command button, but what?
// JSF PART
 
                        <rich:panel id="serv" >
                            <f:facet name="header">
                                I want<br/>
                            </f:facet>
                            <h:panelGrid columns="2" width="100%" columnClasses="col" >
                                <rich:tree id="treetake" switchType="ajax" ajaxSubmitSelection="true" nodeSelectListener="#{AddDeal.processSelection}" >
                                    <rich:recursiveTreeNodesAdaptor roots="#{AddDeal.rootCat}" var="item" nodes="#{item.catServiceCollection}" />
                                </rich:tree>
                                
                                <a4j:outputPanel id="ajxpn1" ajaxRendered="true">     
                                    <h:selectOneListbox id="listservtake"  rendered="#{AddDeal.serv!=null}" value="#{AddDeal.currentService}">
                                        <f:selectItems  value="#{AddDeal.serv}"/>
                                    </h:selectOneListbox>
                                </a4j:outputPanel>
                            </h:panelGrid>
                        </rich:panel>
                        
                        <rich:panel id="moreinfo">
                            <f:facet name="header">
                                Choosed services<br/>
                            </f:facet>
                            <a4j:commandButton value="Request this service" reRender="rep1" >
                                <a4j:actionparam name="username" value="#{AddDeal.currentService}" assignTo="#{AddDeal.deal.idRequestedService}"/>
                            </a4j:commandButton>
                            <h:outputText id="rep1" value="#{AddDeal.deal.idRequestedService}"/>
                        </rich:panel>
 
 
 
//the bean part:
//I dont display getters and setters that haven't anything special
 
    public void processSelection(NodeSelectedEvent event) {//TODO check if it's a final node
        HtmlTree tree = (HtmlTree) event.getComponent();
        this.serv= ((CatService) tree.getRowData()).getServiceCollection();
    }
 
    public Collection<SelectItem> getServ(){
        if(this.serv == null || this.serv.size()==0) return null;
        
        ArrayList<SelectItem> col = new ArrayList<SelectItem>();        
        for(Service s: this.serv){
            col.add(new SelectItem(s));
        }
        return col;
    }
 
    public Deal getDeal() {
        if(deal ==null)
            deal = new Deal();
        return deal;
    }

Open in new window

LVL 1
NargzulAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

supergokhanCommented:
I advise you try this first.

<a4j:commandButton value="Request this service" reRender="serv, moreinfo" >

so it will render them too.
0
NargzulAuthor Commented:
Hi,

I've try this, the list is always hidding when I click on the button.
0
supergokhanCommented:
<h:selectOneListbox id="listservtake"  rendered="#{AddDeal.serv!=null}"

this calls the getServ method in the bean. And if this bean's scope is request
this.serv gets null because constructor can not call the processSelection to set that value.
Try making the bean's scope to session scope.
Or! change the getServ method like getServices
and
<h:selectOneListbox id="listservtake"  rendered="#{AddDeal.services!=null}"
0
CompTIA Network+

Prepare for the CompTIA Network+ exam by learning how to troubleshoot, configure, and manage both wired and wireless networks.

supergokhanCommented:
<h:selectOneListbox id="listservtake"  rendered="#{AddDeal.serv!=null}" value="#{AddDeal.currentService}">

for this you need a method like
getCurrentService()

I advise first try the scope to session.
0
NargzulAuthor Commented:
But If I do a session scope, I will have side effects no?

When start and end exactly the request scope? because for me it was since the generation of the page to the reception of the validation, no?


I've said I doesn't display dummy getters and setters, but I've:

public Service getCurrentService() {
        return currentService;
    }

I don't really understand your first message, your "OR".

What must I put in this getServices method? What the difference if I just change the name of the function?
0
supergokhanCommented:
Hi again. It is not the names ok. I understand now. You populate the values when you first press the tree.When you populate listbox dynamically it will not be visible next time you press the button. Because it is a request scoped bean.Constructor clears it. You can do this.

<h:selectOneListbox id="listservtake"  rendered="#{AddDeal.serv!=null}" value="#{AddDeal.currentService}">
<f:selectItems  value="#{AddDeal.serv}"/>
</h:selectOneListbox>

as you see you have the value="#{AddDeal.currentService}">



For last if this bean is not so big make it session scope. Yhe populated values won't get cleared.

You wont change the bean scope but you need something in session so you will generate the listboxagain.


private Service currentService;
{
    fillSelectItems();
}
 
public Service fillSelectItems()
{
HtmlTree tree=(HtmlTree)getSession().getAttribute("tree")
this.serv= ((CatService) tree.getRowData()).getServiceCollection();
}
 
public void processSelection(NodeSelectedEvent event) {
        getSession().setAttribute("tree",event.getComponent);
        fillSelectItems();  
}

Open in new window

0
NargzulAuthor Commented:
But with a session bean, if  the person is on the same page twice, it would no more work no?
0
supergokhanCommented:
You wont use the session bean. You will use just the session.
0
NargzulAuthor Commented:
"You wont use the session bean. You will use just the session."
???

"You wont change the bean scope but you need something in session so you will generate the listboxagain."

If we change the bean scope, it's because it's a bean ^^
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java EE

From novice to tech pro — start learning today.