Изображение панели навигации должно меняться, когда пользователь входит в систему (JSF 2.0 + Primefaces).

Я использую док-станцию ​​Primefaces в качестве панели навигации. Я хочу, чтобы он изменил одно из своих изображений в зависимости от того, вошел ли пользователь в систему или нет. Я что-то сделал, но это не работает, потому что я вижу два значка одновременно, а также не могу нажать кнопку выхода. Вы можете дать мне какой-то совет?

Это панель навигации (она создана в шаблоне, который используют все страницы):

<h:body>
        <h:form>
        <p:dock position="top">
            <p:menuitem value="Naslovna" icon="unsecuredimages/naslovna.png"
                url="main.xhtml" alt="The image could not be found." />
            <p:menuitem value="Register" icon="unsecuredimages/register.png"
                url="registration.xhtml" alt="The image could not be found." />
            <p:menuitem value="Cesta pitanja" icon="unsecuredimages/faq.png"
                url="faq.xhtml" alt="The image could not be found." />

            <p:menuitem value="Login" icon="unsecuredimages/login.png" url="login.xhtml" rendered ="securityController.checkLogged() == false"/>
        <p:menuitem value="Logout" icon="unsecuredimages/logout.png" action="securityController.logOut()" rendered ="securityController.checkLogged() == true"/>

        </p:dock>   
        </h:form>

Вот как выглядит bean-компонент securityController Backing:

@ManagedBean
@RequestScoped
public class SecurityController {

    @EJB
    private IAuthentificationEJB authentificationEJB;

    ...

    public boolean checkLogged() {
        return authentificationEJB.checkAuthentificationStatus();
    }

    ...
}

В процессе также участвует EJB:

@Stateful(name = "ejbs/AuthentificationEJB")
public class AuthentificationEJB implements IAuthentificationEJB {

    @PersistenceContext
    private EntityManager em;

        ....

        // Check if user is logged in
    public boolean checkAuthentificationStatus() {
        // 1-Check if there is something saved in the session(This means the
        // user is logged in)
        if ((FacesContext.getCurrentInstance().getExternalContext()
                .getSessionMap().get("userRole") != null)) {
            // 2-If there is not a user already loged, then return false
            return true;
        }

        return false;
    }

        ...

Как вы думаете, как я могу добавить эту функцию на панель навигации?

Обновить

<p:menuitem value="Login" icon="unsecuredimages/login.png" url="login.xhtml" rendered ="securityController.checkLogged"/>
            <p:menuitem value="Logout" icon="unsecuredimages/logout.png" action="securityController.logOut()" rendered ="!securityController.checkLogged"/>

я также изменил на:

public boolean isCheckLogged() {
        return authentificationEJB.checkAuthentificationStatus();
    }

Вот так выглядит навигация. Как видите, я не вижу значков входа или выхода.

введите здесь описание изображения

Как я могу это исправить?


person javing    schedule 20.04.2011    source источник


Ответы (1)


Вместо c:if используйте атрибут rendered для p:menuitem (или любого другого компонента простых лиц).

Нравится:

<p:menuitem value="Login" icon="unsecuredimages/login.png" url="login.xhtml" rendered="#{securityController.checkLogged}"/>
<p:menuitem value="Logout" icon="unsecuredimages/logout.png" action="securityController.logOut()" rendered="#{!securityController.checkLogged}"/>

Вам понадобится метод getCheckLogged() или isCheckLogged() в bean-компоненте securityController. Так:

public boolean getCheckLogged() {
    return authentificationEJB.checkAuthentificationStatus();
}

EL преобразует ссылку на атрибут securityController.checkLogged в вызов метода получения по соглашению об именах.

person egbokul    schedule 20.04.2011
comment
Я сделал именно так, как ты сказал. Смотрите обновление выше. Теперь я не вижу никакой иконки. Это почему? - person javing; 20.04.2011
comment
Проверьте еще раз. Вместо rendered =securityController.checkLogged() == false вы ДОЛЖНЫ использовать его как rendered=#{securityController.checkLogged}. Вы пробовали это? Также метод ДОЛЖЕН начинаться с get или is. Детали важны. - person egbokul; 20.04.2011
comment
Да, я сделал именно так, посмотрите обновление, где написано «Обновить не исходный вопрос». Я боюсь, что ошибка может быть в EJB. Что вы думаете? - person javing; 20.04.2011
comment
Я все еще не вижу #{} в вашем отображаемом атрибуте... Если bean-компонент был неисправен, он будет отображать ровно одну строку, в зависимости от того, возвращает ли он true или false. Если вы видите оба пункта меню или ни одного, проблема заключается в вашей странице JSF (или компоненте поддержки)... - person egbokul; 20.04.2011
comment
Ты видишь мое обновление? Я только что опубликовал принтскрин, который показывает панель навигации. На всякий случай я вставляю код, который использую: <p:menuitem value="Login" icon="unsecuredimages/login.png" url="login.xhtml" rendered ="securityController.checkLogged"/> <p:menuitem value="Logout" icon="unsecuredimages/logout.png" action="securityController.logOut()" rendered ="!securityController.checkLogged"/> - person javing; 20.04.2011
comment
Я по-прежнему не вижу #{securityController.checkLogged}. Обратите внимание на символы #{}! Они сообщают JSF, что это выражение EL, которое необходимо вычислить. - person egbokul; 20.04.2011
comment
Прошу прощения, я все время забывал скобки :) Все работает нормально. Я вижу, как значок меняется, когда я вхожу в систему. Спасибо! - person javing; 20.04.2011