Как отобразить меню из базы данных в шаблоне JSF

Я хочу отобразить меню в шаблоне JSF. Каждый пользователь моего приложения имеет другое меню, и меню хранится в базе данных. Вот мой код,

MenuBean.java

public List getUserMenu() {
    List menuitems = (List) em.createQuery("_____________").setParameter("_______", _______).getResultList();
    return menuitems;
}

pageTemplate.xhtml

<div class="container">
    <div id="navigation">
        
</div> <div id="content">

</div> </div>

Проблема заключается в том, что каждый раз, когда я перехожу к новой странице (файл .xhtml), которая использует тот же шаблон (pageTemplate.xhtml), меню загружается снова и снова.

Как я могу загрузить меню только один раз для каждого пользователя.

0
nl ja de

2 ответы

Если меню зависит от пользователя, было бы лучше создать компонент с областью session , который сохранит содержимое этого меню. Таким образом, как только меню будет инициализировано в первый раз, оно не будет повторно инициализировано. Ваш код будет выглядеть так:

public class MySessionBean ... {

    private List menuItems = null;

    public List getUserMenu() {
        if (menuItems == null) {
           //Initialize the menu items.
            menuItems = ...;
        }
        return menuitems;
    }

Обратите внимание, что вы также можете инициализировать объекты menuItems в конструкторе или в методе post-construct (т. Е. Метод, вызываемый сразу после создания экземпляра компонента).

Также важно: не помещайте код доступа к базе данных в свои компоненты (ваш em.createQuery (...) ). Переместите это на уровнях обслуживания/DAO и позвольте компоненту вызвать службу для извлечения информации, необходимой для создания элементов меню.

4
добавлено
@Latte нормально. Отвечает ли он на ваш вопрос?
добавлено автор romaintaz, источник
Спасибо, я добавил доступ к базе данных в методе, просто чтобы упростить вопрос, размещенный здесь. Реализовано по предложению.
добавлено автор Latte, источник

Вы должны НЕ поместить логику, обращаясь к базе данных в методе геттера, потому что их часто называют более одного раза в одном и том же запросе .

Чтобы загрузить свое меню один раз для каждого пользователя, поместите это свойство в being-компонент @SessionScoped , а затем инициализируйте его в методе @PostConstruct :

@SessionScoped
public SomeBean {
    private List menuItems;

    @PostConstruct
    public void init() {
        menuItems = (List) em.createQuery("_____________")
                           .setParameter("_______", _______).getResultList();
    }
   //getter and setter for menuItems
}

Поскольку компонент находится в области сеанса, он будет существовать как один экземпляр для каждого сеанса пользователя в вашем приложении.

Note that I assumed you are using JSF 2, because you tagged the question as .

2
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async