如何在JSF模板中显示数据库中的菜单

如何在JSF模板中显示数据库中的菜单,jsf,java-ee-6,Jsf,Java Ee 6,我想在JSF模板中显示菜单。我的应用程序的每个用户都有不同的菜单,菜单存储在数据库中。这是我的密码 MenuBean.java public List<Menuitem> getUserMenu() { List<Menuitem> menuitems = (List<Menuitem>) em.createQuery("_____________").setParameter("_______", _______).getResultList();

我想在JSF模板中显示菜单。我的应用程序的每个用户都有不同的菜单,菜单存储在数据库中。这是我的密码

MenuBean.java

public List<Menuitem> getUserMenu() {
    List<Menuitem> menuitems = (List<Menuitem>) em.createQuery("_____________").setParameter("_______", _______).getResultList();
    return menuitems;
}
public List getUserMenu(){
List menuitems=(List)em.createQuery(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
返回菜单项;
}
pageTemplate.xhtml

<div class="container">
    <div id="navigation">
        <ul>
            <ui:repeat var="_item" value="#{menuitemBean.userMenu}">
                <li><h:outputLink value="#{_item.url}">
                        <h:outputText value="#{_item.name}" />
                    </h:outputLink></li>
            </ui:repeat>
        </ul>
    </div>

    <div id="content">
        <h1>
            <ui:insert name="header" />
        </h1>
        <h2>
            <ui:insert name="subheader" />
        </h2>

        <ui:insert name="main" />
    </div>
</div>

问题是每次我导航到使用相同模板(pageTemplate.xhtml)的新页面(.xhtml文件),菜单都会重新加载


如何为每个用户仅加载一次菜单。

如果菜单依赖于用户,则最好创建一个具有作用域
会话的bean,该会话将存储此菜单的内容。
这样,一旦菜单第一次被初始化,它就不会被重新初始化。您的代码如下所示:

public class MySessionBean ... {

    private List<Menuitem> menuItems = null;

    public List<Menuitem> getUserMenu() {
        if (menuItems == null) {
            // Initialize the menu items.
            menuItems = ...;
        }
        return menuitems;
    }
公共类MySessionBean。。。{
私有列表menuItems=null;
公共列表getUserMenu(){
if(menuItems==null){
//初始化菜单项。
menuItems=。。。;
}
返回菜单项;
}
请注意,您还可以在构造函数中初始化
menuItems
对象,或者在
post-construct
方法中初始化对象(即在bean实例化之后调用的方法)


还有一点很重要:不要将数据库访问代码放入bean中(您的
em.createQuery(…)
)。将其移动到服务/DAO层上,让bean调用服务来检索构建菜单项所需的信息。

如果菜单依赖于用户,则最好创建一个具有作用域
会话
的bean,该会话将存储此菜单的内容。 这样,一旦菜单第一次初始化,它就不会被重新初始化。您的代码如下所示:

public class MySessionBean ... {

    private List<Menuitem> menuItems = null;

    public List<Menuitem> getUserMenu() {
        if (menuItems == null) {
            // Initialize the menu items.
            menuItems = ...;
        }
        return menuitems;
    }
公共类MySessionBean{
私有列表menuItems=null;
公共列表getUserMenu(){
if(menuItems==null){
//初始化菜单项。
menuItems=。。。;
}
返回菜单项;
}
请注意,您还可以在构造函数中初始化
menuItems
对象,或者在
post-construct
方法中初始化对象(即在bean实例化之后调用的方法)


还有一点很重要:不要将数据库访问代码放在bean中(您的
em.createQuery(…)
)。将其移动到服务/DAO层上,让bean调用服务来检索构建菜单项所需的信息。

您应该不要将访问数据库的逻辑放在getter方法中,因为

要为每个用户加载一次菜单,请将属性放入
@SessionScoped
支持bean中,然后在
@PostConstruct
注释方法中初始化它:

@SessionScoped
public SomeBean {
    private List<Menuitem> menuItems;

    @PostConstruct
    public void init() {
        menuItems = (List<Menuitem>) em.createQuery("_____________")
                           .setParameter("_______", _______).getResultList();
    }
    // getter and setter for menuItems
}
@SessionScoped
红豆{
私有列表菜单项;
@施工后
公共void init(){
menuItems=(列表)em.createQuery(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
.setParameter(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
}
//menuItems的getter和setter
}
由于bean在会话范围内,它将作为应用程序中每个用户会话的一个实例存在


注意,我假设您使用的是JSF2,因为您将问题标记为。

您不应该将访问数据库的逻辑放在getter方法中,因为

要为每个用户加载一次菜单,请将属性放入
@SessionScoped
支持bean中,然后在
@PostConstruct
注释方法中初始化它:

@SessionScoped
public SomeBean {
    private List<Menuitem> menuItems;

    @PostConstruct
    public void init() {
        menuItems = (List<Menuitem>) em.createQuery("_____________")
                           .setParameter("_______", _______).getResultList();
    }
    // getter and setter for menuItems
}
@SessionScoped
红豆{
私有列表菜单项;
@施工后
公共void init(){
menuItems=(列表)em.createQuery(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
.setParameter(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
}
//menuItems的getter和setter
}
由于bean在会话范围内,它将作为应用程序中每个用户会话的一个实例存在


请注意,我假设您使用的是JSF 2,因为您将问题标记为。

谢谢,我在方法中添加了数据库访问,只是为了简化此处发布的问题。按照建议的方式实现。@Latte ok。它回答了您的问题吗?谢谢,我在方法中添加了数据库访问,只是为了简化发布的问题ed在这里。按照建议的方式实现。@Latte ok。它回答了您的问题吗?