Creating Dynamic RichMenu
Register the menu component in your view (Facelets or JSP)
<rich:dropdownmenu binding="#{bean.menuComponent}" value="File">
In the backing bean, use the component binding to create Menu Items programmatically
private HtmlDropDownMenu menuComponent;
public HtmlDropDownMenu getMenuComponent() {
FacesContext ctx = FacesContext.getCurrentInstance();
Application app = ctx.getApplication();
if(null == menuComponent)
menuComponent = (HtmlDropDownMenu)app.createComponent(HtmlDropDownMenu.COMPONENT_TYPE);
for(String key: map.keySet()) {
HtmlMenuItem item = (HtmlMenuItem)app.createComponent(HtmlMenuItem.COMPONENT_TYPE);
item.setValue(key);
item.setId(key);
Class[] params = {};
MethodExpression actionExpression = app.getExpressionFactory()
.createMethodExpression(ctx.getELContext(),
"#{bean.menuAction}",
String.class, params);
item.setActionExpression(actionExpression);
String onSelect = "open(this,'"+map.get(key).toString()+"')";
item.setOnselect(onSelect);
menuComponent.getChildren().add(item);
}
return menuComponent;
}
Notice how you can programmatically create a Mexpression in JSF 1.2 via UEL
Also, see how JavaScript event is wired to the dynamically created RichMenuItem
Finding the Form
RichFaces has a convenient JavaScript function A4J.findForm which you can use to locate the form corresponding to the Menu Item
function open(el, paramValue) {
var frm = A4J.findForm(el);
if(frm == null) {
alert("open: no form found.");
return;
}
//add hidden parameter
var hidden = document.createElement('input');
hidden.setAttribute('name', 'PARAM_NAME');
hidden.setAttribute('type', 'hidden');
hidden.setAttribute('value', paramValue);
frm.appendChild(hidden);
frm.submit();
}
Managed Bean Action method
From the action method, find the value of interest and take appropriate action
public void menuAction (){
FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
Map reqMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param = reqMap.get(name).toString();
}
Feel free to use this code in your applications.
If you found this useful, please leave your comments / feedbacks that would prove helpful for the developer community.
13 comments:
No way
----------------------
Error: A4J is not defined
Archivo de origen: http://localhost:8080/menu/ Línea: 1
----------------------
in javascript console
Any sugestion?
no way
-------------------------
Error: A4J is not defined
Archivo de origen: http://localhost:8080/menu/ Línea: 1
-------------------------
in javascript console
any sugestion...
hello
thanks for your tip, run ok
i forget, i change the name of the java script, with open don't run.
but what if I wanna use this code to navigate to another page
the menuAction() method is not invoking at all
what if i want to use this code to navigate to another page
the method menuAction() is not called
Hadi,
Your menuAction method should return a "String" that identifies the next view defined in your faces-config file.
ok but the menuAction() is not called at all
i have changed the return type and nothing happened
I can't get the javscript function 'open' to fire.
The browser keeps reporting an error 'Error Permission Denied'
Any ideas?
I'm getting the following error when I tried it
Caused by: javax.el.PropertyNotFoundException: /layout/leftNav.xhtml @60,75 binding="#{dynMenu.menuComponent}": Property 'menuComponent' not found on type com.test.DynamicMenu_$$_javassist_1
I have reused the code given here but it gave me the error as shown above. Could you please let me know what mistake I have done here.
Prashanth,
Please make sure that you have a method with the following signature on com.test.DynamicMenu (which is your backing bean referenced by "dynMenu")
public HtmlDropDownMenu getMenuComponent() {
...
This post was very useful to know how to get params in jsf
hi! Thanks for your great post :)
Can you provide a sample in how we can have a sub menu?
Example:
Menu 1
Menu 2
Sub-Menu 2-1
Sub-Menu 2-2
Menu 3
Can we achieve that dynamically?
Thanks!
Post a Comment