如何在JSF模板中显示数据库中的菜单
我想在JSF模板中显示菜单。我的应用程序的每个用户都有不同的菜单,菜单存储在数据库中。这是我的密码 MenuBean.java如何在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();
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。它回答了您的问题吗?