在 p:menuitem 上以编程方式使用 Pretty Faces 操作
Using PrettyFaces action programatically on p:menuitem
我有一个挂接到 PrettyFaces 3.3.3 的 PrimeFaces 6.0 菜单项,如下所示:
<h:form id="nav"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:prime="http://primefaces.org/ui">
<prime:panelMenu label="Menu">
<prime:submenu label="SubMenu">
<prime:menuitem value="page" action="pretty:page"/>
</prime:submenu>
</prime:panelMenu>
</h:form>
这很好用。但是如何在 Java 中构建菜单并实现相同的效果?
本页
<prime:panelMenu model="#{bean.navMenu}" id="leftNavMenu"/>
按预期获得菜单结构,但我不知道如何为每个菜单项设置操作。
public MenuModel getNavMenu() {
MenuModel model = new DefaultMenuModel();
DefaultSubMenu subMenu = new DefaultSubMenu("sub menu");
DefaultMenuItem menuItem = new DefaultMenuItem("page");
// something is missing here
subMenu.addElement(menuItem);
model.addElement(subMenu);
return model;
}
DefaultMenuItem
上没有 setAction
方法。
我试过这些:
menuItem.setUrl("pretty:page");
--- 使用 pretty:page
作为 URL 并且浏览器抱怨地址不被理解(可以理解)
menuItem.setHref("pretty:page");
--- 与 setUrl
menuItem.setCommand("pretty:page");
在服务器日志中得到一个 NumberFormatException: For input string: ""
menuItem.setOutcome("pretty:page");
得到一个 URL 和尾随 ?com.ocpsoft.mappingId=page
,所以 PrettyFaces 似乎没有发挥它的魔力,反过来页面崩溃了,因为它没有得到它的参数映射/ 按预期注入。
如何通过代码设置操作?
使用 setCommand 在服务器日志中获取此堆栈跟踪:
[2016-07-28T14:55:42.198-0500] [glassfish 4.1] [SEVERE] [] [javax.enterprise.resource.webcontainer.jsf.context] [tid: _ThreadID=27 _ThreadName=http-listener-1(2)] [timeMillis: 1469735742198] [levelValue: 1000] [[
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at org.primefaces.component.menu.BaseMenuRenderer.findMenuitem(BaseMenuRenderer.java:89)
at org.primefaces.component.menu.BaseMenuRenderer.decode(BaseMenuRenderer.java:67)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:831)
...
以防其他人遇到此问题:在菜单项中使用 command
,并确保在整个菜单中调用 generateUniqueIds
:
public MenuModel getNavMenu() {
MenuModel model = new DefaultMenuModel();
DefaultSubMenu subMenu = new DefaultSubMenu("sub menu");
DefaultMenuItem menuItem = new DefaultMenuItem("page");
menuItem.setCommand("pretty:page");
subMenu.addElement(menuItem);
model.addElement(subMenu);
model.generateUniqueIds();
return model;
}
我有一个挂接到 PrettyFaces 3.3.3 的 PrimeFaces 6.0 菜单项,如下所示:
<h:form id="nav"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:prime="http://primefaces.org/ui">
<prime:panelMenu label="Menu">
<prime:submenu label="SubMenu">
<prime:menuitem value="page" action="pretty:page"/>
</prime:submenu>
</prime:panelMenu>
</h:form>
这很好用。但是如何在 Java 中构建菜单并实现相同的效果?
本页
<prime:panelMenu model="#{bean.navMenu}" id="leftNavMenu"/>
按预期获得菜单结构,但我不知道如何为每个菜单项设置操作。
public MenuModel getNavMenu() {
MenuModel model = new DefaultMenuModel();
DefaultSubMenu subMenu = new DefaultSubMenu("sub menu");
DefaultMenuItem menuItem = new DefaultMenuItem("page");
// something is missing here
subMenu.addElement(menuItem);
model.addElement(subMenu);
return model;
}
DefaultMenuItem
上没有 setAction
方法。
我试过这些:
menuItem.setUrl("pretty:page");
--- 使用pretty:page
作为 URL 并且浏览器抱怨地址不被理解(可以理解)menuItem.setHref("pretty:page");
--- 与setUrl
menuItem.setCommand("pretty:page");
在服务器日志中得到一个NumberFormatException: For input string: ""
menuItem.setOutcome("pretty:page");
得到一个 URL 和尾随?com.ocpsoft.mappingId=page
,所以 PrettyFaces 似乎没有发挥它的魔力,反过来页面崩溃了,因为它没有得到它的参数映射/ 按预期注入。
如何通过代码设置操作?
使用 setCommand 在服务器日志中获取此堆栈跟踪:
[2016-07-28T14:55:42.198-0500] [glassfish 4.1] [SEVERE] [] [javax.enterprise.resource.webcontainer.jsf.context] [tid: _ThreadID=27 _ThreadName=http-listener-1(2)] [timeMillis: 1469735742198] [levelValue: 1000] [[
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at org.primefaces.component.menu.BaseMenuRenderer.findMenuitem(BaseMenuRenderer.java:89)
at org.primefaces.component.menu.BaseMenuRenderer.decode(BaseMenuRenderer.java:67)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:831)
...
以防其他人遇到此问题:在菜单项中使用 command
,并确保在整个菜单中调用 generateUniqueIds
:
public MenuModel getNavMenu() {
MenuModel model = new DefaultMenuModel();
DefaultSubMenu subMenu = new DefaultSubMenu("sub menu");
DefaultMenuItem menuItem = new DefaultMenuItem("page");
menuItem.setCommand("pretty:page");
subMenu.addElement(menuItem);
model.addElement(subMenu);
model.generateUniqueIds();
return model;
}