Primefaces 5 - 动态p:菜单问题

时间:2014-07-07 08:56:21

标签: jsf jsf-2 primefaces menu managed-bean

我是Primefaces的新手,我正在关注User Guide of Version 5.0。 我已经成功构建了一个静态菜单。现在我正在尝试构建一个非常简单的动态菜单,基本上是在用户指南上复制粘贴示例(如果您感兴趣,请参阅第294页)。但它不起作用。

这是我的XHTML页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>test-primefaces</title>
</h:head>
<h:body>
    <h:form>
        <p:menu model="#{menuBean.model}" />
    </h:form>
</h:body>

这是我的MenuBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

@ManagedBean
@SessionScoped
public class MenuBean {

   private MenuModel model;

   public MenuBean() {
       model = new DefaultMenuModel();
       //First submenu
       DefaultSubMenu firstSubmenu = new DefaultSubMenu("Dynamic Submenu");
       DefaultMenuItem item = new DefaultMenuItem("External");
       item.setUrl("http://www.primefaces.org");
       item.setIcon("ui-icon-home");
       firstSubmenu.addElement(item);
       model.addElement(firstSubmenu);

       //Second submenu
       DefaultSubMenu secondSubmenu = new DefaultSubMenu("Dynamic Actions");
       item = new DefaultMenuItem("Save");
       item.setIcon("ui-icon-disk");
       item.setCommand("#{menuBean.save}");
       item.setUpdate("messages");
       secondSubmenu.addElement(item);
       item = new DefaultMenuItem("Redirect");
       item.setIcon("ui-icon-search");
       item.setCommand("#{menuBean.redirect}");
       secondSubmenu.addElement(item);
       model.addElement(secondSubmenu);
   }

   public MenuModel getModel() {
       return model;
   }
}

菜单无效,因为我尝试运行项目(我正在使用Netbeans)我收到以下错误

找不到带有“j_idt5:j_idt6”引用的表达式“messages”的组件。

我无法理解我为什么会这样做,谷歌一直无法帮助我。 大多数疑问都与我在MenuBean.java中使用的注释和导入有关,因为Netbeans告诉我“javax.faces.bean”中的注释将在下一个JSF版本中弃用。

另一个奇怪的事实,在XHTML页面中,如果我改变

带有<p:menu model="#{menuBean.model}" />

<p:megaMenu model="#{menuBean.model}" />

我没有收到错误,但菜单没有渲染levle两个菜单项,我只看到一个带有“动态子菜单”和“动态操作”的菜单,没有任何子项。

我错过了什么?如有必要,我愿意提供有关我的代码/项目的更多信息。

2 个答案:

答案 0 :(得分:4)

对我而言,首先检查Primefaces展示会更好,然后可以随时参考手册。

根据示例"Programmatic menu",您需要

部分
<p:growl id="messages" showDetail="false"/>

我想这也是事实上错误信息的内容,即它的遗漏。

关于注释,请参阅建议,即here。从JSF 2.2开始,建议从JSF bean转移到CDI bean。

答案 1 :(得分:2)

无法找到带有表达式&#34;消息的组件&#34;引自&#34; j_idt5:j_idt6&#34; 意味着它无法从组件中找到 id =&#34; message&#34; 的组件id =&#34; j_idt5:j_idt6&#34; 在您的代码中有属性更新=&#34;消息&#34; ,是item.setUpdate(&#34; messages& #34);

另一个解决方案是删除item.setUpdate(&#34; messages&#34;);如果您不想更新任何内容,或者如果要更新消息,则在页面中添加带有id消息的组件。