2016-07-28 8 views
1

У меня есть пункт меню а PrimeFaces 6,0 зацепил PrettyFaces 3.3.3, как это:Использование PrettyFaces действия на р программно: MENUITEM

<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; 
} 

Там нет setAction метод на DefaultMenuItem.

Я попытался это:

  • 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, похоже, не делает своего волшебника c, и, в свою очередь, страница вылетает из-за того, что она не отображает или вводит ее параметры, как ожидалось.

Как я могу установить действие из кода?

Использование 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) 
... 
+0

Вы пытались: 'org.primefaces.component.menuitem.UIMenuItem'. У этого есть 'setAction' точно. –

+0

Выполняет ли это это в 'p: commandLink'? – Kukeltje

+0

@Kukeltje Да, это, по крайней мере, когда я добавляю его прямо на страницу. (Я задал вопрос.) Но тогда это работает и для меню. – Robert

ответ

3

В случае кто-то другой приходит через эту проблему: используйте 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; 
}