You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by M Rather <mr...@definedlogic.com> on 2007/12/12 15:56:24 UTC
linking from one page to another with same parameter names - a sequence
of events with undesirable outcome
Hello,
I ran into an issue, which I would like to share here. I would like to
know, if it is something that I have done incorrectly (due to not fully
understanding JSF lifecycle), or is it something that may be an issue
with how JSF lifecyle works.
Here is a scenario:
I have a page : customerList.xhtml
It lists customers, and for each row of a customer there is a link
(commandLink) to root nodes of menu's for the customer.
Accordingly, there is a navigation rule from customersList.xhtml with
action 'menus' that takes users to rootMenuList.xhtml with parameter
'customerId'.
Please note the parameters sent in this and following, as that is
important to discussion.
When a user clicks that link, system goes thru its lifecycle (i.e.
restores customerList.xhtml and then in BEFORE INVOKE_APPLICATION(5)
phase recognizes 'menus' outcome and builds 'rootMenuList.xhtml' view
and forwards the user there.
All ok till here.
rootMenuList.xhtml loads all the root nodes for that provided customer
and draws a list of root menu nodes.
Each row of the this list is a commandLink to 'menusList.xhtml' with
action 'menu' with pameters 'customerId' and 'menuId'
When a user clicks that link, system goes thru its lifecycle (i.e.
restores rootMenuList.xhtml and then in BEFORE INVOKE_APPLICATION(5)
phase recognizes 'menu' outcome and builds 'menuList.xhtml' view an
forwards the user there.
All ok till here also.
menuList.xhtml loads all the nodes for the provided menuId and draws a
list of menu nodes, INCLUDING the root menu node itself.
Each row of this list is a commandlink to 'contentList.xhtml' with
action 'contents' with parameters 'customerId' and 'menuId'
Note: That is the only information that is needed to draw contents so I
just send 'customerId' and 'menuId'
This is where the following behavior occurs:
-------------------------------------------
When a user clicks the 'first' (the root node) link on the list, system
goes thru its lifecyle (i.e. restores menuList.xhtml and then in BEFORE
INVOKE_APPLICATION(5)
phase recognizes 'contents' outcome and builds 'contentList.xhtml' view
and forwards the user there.
This row click works OK.
But, if a user clicks on 'any' other link with action 'contents' of the
list, i.e. , any other node of this list, then system goes thru its
lifecycle , restores the view,
BUT, in INVOKE_APPLICATION(5) it does 'NOT' recognize any outcome, and
redraws 'menusList.xhtml' with the provided menuId, instead of
drawing 'contentList.xhtml' as requested.
I hope this is clear.
Now , how did I resolve this, for all those who have encountered similar
issues.
I added a third parameter 'contentMenuId' for the commandLink for
'contentList.xhtml', now totaling the following links:
'customerId', carried forward from first page till here.
'menuId', menuId of the rootMenu (still needed to restore the
'menuList.xhtml' before drawing 'contentList.xhtml')
'contentMenuId', menuId of the current row in 'menuList.xhtml'.
(so, for the first row, 'menuId' and 'contentMenuId' is same)
This solves the problem.
Now the question, and one of the reasons I am sharing this.
Without the workaround, when a user clicks any other row of menuId, why
does JSF lifecycle decide to draw the page instead of follow the
'outcome' in action?
From the logs of the first and secondary clicks, I do see that JSF
recognizes it is a postback. But it still thinks that it needs to redraw
the page for newId?
Where does JSF figure out that the menuId submitted is different from
the first one, so there is no need to follow the 'action' and 'outcome'
of 'commandLink' ?
Should not JSF logs identify this anywhere?
Thanks for those who read it, and those who may want to respond.
-MRather