动态 p:menu 适用于 PrimeFaces 3.5,不适用于 >4.0
Dynamic p:menu works in PrimeFaces 3.5, not in >4.0
我正在将一个项目从 Primefaces 3.5 更新到 4.0,我遇到了菜单问题。
我不明白如何动态创建一个像这样的简单菜单:
<p:menu>
<p:submenu>
<p:menuitem value="jump" action="myTransition" />
</p:submenu>
</p:menu>
我尝试使用在我的 Spring 网络流配置中定义的转换名称来设置项目的命令,但没有结果。
DefaultMenuItem itemNone = new DefaultMenuItem();
item.setCommand("myTransition");
普通菜单工作正常,但如果我尝试动态菜单,页面只会刷新,没有错误或其他证据。
所以,基本上我需要移植这段代码,从 pf 3.5 到 pf >4.0
for(String elem : list)
{
MenuItem item = new MenuItem();
item.setValue(elem.toUpperCase());
item.setActionExpression(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(), elem.replaceAll("\s","").replace(".", ""),
String.class, new Class[]{String.class}));
submenu.getChildren().add(item);
}
有这个功能
public static MethodExpression createMethodExpressionInUIContext(final FacesContext facesContext, final String expression, Class<?> class1, Class[] classes) {
FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
MethodExpression methodExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
.createMethodExpression(faceletElContext, expression, class1, classes);
return methodExpression;
}
我的尝试
DefaultMenuItem item = new DefaultMenuItem();
item.setCommand(elem);
或
item.setCommand(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(), elem.replaceAll("\s","").replace(".", ""),String.class, new Class[]{String.class}).getExpressionString());
没用
就我自己而言,从过去开始,为了实现我的目标,我遵循了以下步骤:
- 注册我自己的扩展 Primefaces 版本的 Menu 和 MenuRenderer
- 为操作命令(名为 commandAction)定义一个带有附加字段的新 MenuItem
- 将解码方法重写为:
MenuRenderer
@Override
public void decode(FacesContext context, UIComponent component) {
AbstractMenu menu = (AbstractMenu) component;
String clientId = menu.getClientId(context);
Map<String, String> params = context.getExternalContext().getRequestParameterMap();
if (params.containsKey(clientId)) {
String menuid = params.get(clientId + "_menuid");
DefaultMenuItem menuitem = (DefaultMenuItem) findMenuitem(menu.getElements(), menuid);
MenuActionEvent event = new MenuActionEvent(menuitem, menuitem);
// Action Listener
if (StringUtils.isNoneBlank(menuitem.getCommand())) {
menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
FacesContext.getCurrentInstance(), menuitem.getCommand().replaceAll("\s", "").replace(".", ""),
String.class, new Class[] { String.class }));
if (menuitem.isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
menu.queueEvent(event);
}
// Action
if (StringUtils.isNoneBlank(menuitem.getCommandAction())) {
menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
FacesContext.getCurrentInstance(), menuitem.getCommandAction().replaceAll("\s", "").replace(".", ""),
String.class, new Class[] { String.class }));
if (menuitem.isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
menu.queueEvent(event);
}
}
}
我正在将一个项目从 Primefaces 3.5 更新到 4.0,我遇到了菜单问题。 我不明白如何动态创建一个像这样的简单菜单:
<p:menu>
<p:submenu>
<p:menuitem value="jump" action="myTransition" />
</p:submenu>
</p:menu>
我尝试使用在我的 Spring 网络流配置中定义的转换名称来设置项目的命令,但没有结果。
DefaultMenuItem itemNone = new DefaultMenuItem();
item.setCommand("myTransition");
普通菜单工作正常,但如果我尝试动态菜单,页面只会刷新,没有错误或其他证据。
所以,基本上我需要移植这段代码,从 pf 3.5 到 pf >4.0
for(String elem : list)
{
MenuItem item = new MenuItem();
item.setValue(elem.toUpperCase());
item.setActionExpression(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(), elem.replaceAll("\s","").replace(".", ""),
String.class, new Class[]{String.class}));
submenu.getChildren().add(item);
}
有这个功能
public static MethodExpression createMethodExpressionInUIContext(final FacesContext facesContext, final String expression, Class<?> class1, Class[] classes) {
FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
MethodExpression methodExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
.createMethodExpression(faceletElContext, expression, class1, classes);
return methodExpression;
}
我的尝试
DefaultMenuItem item = new DefaultMenuItem();
item.setCommand(elem);
或
item.setCommand(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(), elem.replaceAll("\s","").replace(".", ""),String.class, new Class[]{String.class}).getExpressionString());
没用
就我自己而言,从过去开始,为了实现我的目标,我遵循了以下步骤:
- 注册我自己的扩展 Primefaces 版本的 Menu 和 MenuRenderer
- 为操作命令(名为 commandAction)定义一个带有附加字段的新 MenuItem
- 将解码方法重写为:
MenuRenderer
@Override
public void decode(FacesContext context, UIComponent component) {
AbstractMenu menu = (AbstractMenu) component;
String clientId = menu.getClientId(context);
Map<String, String> params = context.getExternalContext().getRequestParameterMap();
if (params.containsKey(clientId)) {
String menuid = params.get(clientId + "_menuid");
DefaultMenuItem menuitem = (DefaultMenuItem) findMenuitem(menu.getElements(), menuid);
MenuActionEvent event = new MenuActionEvent(menuitem, menuitem);
// Action Listener
if (StringUtils.isNoneBlank(menuitem.getCommand())) {
menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
FacesContext.getCurrentInstance(), menuitem.getCommand().replaceAll("\s", "").replace(".", ""),
String.class, new Class[] { String.class }));
if (menuitem.isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
menu.queueEvent(event);
}
// Action
if (StringUtils.isNoneBlank(menuitem.getCommandAction())) {
menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
FacesContext.getCurrentInstance(), menuitem.getCommandAction().replaceAll("\s", "").replace(".", ""),
String.class, new Class[] { String.class }));
if (menuitem.isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
menu.queueEvent(event);
}
}
}