Introduction
I encountered a situation the other day where I need to include a JSF page based on a parameter passed in via a
<f:viewParam>. This seems like a very reasonable kind of idea. I expected to be able to make the
<ui:include/> use a dynamically set
src parameter using EL from the
<f:viewParam>. This is where I went wrong (the idea was good...). The
<ui:include/> is a tag handler. It is evaluated on Restore View Phase. The value processing does not take place until the Apply Request Values Phase. This presents a problem since the EL binding for my
<ui:include/> is based on the
<f:viewParam> which is a
UIInput object. So we are out of phase. The page will display the results, but all the AJAX will not work.
A Solution
A solution to the problem involves using static
<ui:include/> elements wrapped in
<ui:fragment/> elements. This allows the tag handler to resolve the page to include, and then the fragment determines (via late binding) whether to display the page based on the
<f:viewParam> passed. The page is supported by a
@ViewScoped bean to keep the page in scope.
Code
Here is an example of how to do it.
Conclusion
I have put the complete
NetBeans 7.2.1 project using
Mojarra on Bitbucket. The project uses
Apache Maven, and was tested using
GlassFish 3.1.2.
Here is the complete project: dynamic-include
No comments:
Post a Comment