簡體   English   中英

JSF EL條件

[英]JSF EL condition

這是我的片段:

<ui:fragment rendered="#{}">
    <ui:include src="../includes/top.xhtml"/>
</ui:fragment>

我的LoginController將重定向到擴展MainController的頁面home.html ,它有一個布爾方法showComponent所以當我嘗試調用這個mainController.showComponent()我得到一個nullPointerException ,因為我注意到,Java首先加載html以查看它是否正在調用任何Java類,所以當我嘗試訪問mainController (從HomeController擴展,尚未調用)時,我得到這個空指針

如果設置了maisController,如何檢查片段內部?

這是我到目前為止所嘗試的內容

<ui:fragment rendered="#{not empty mainController ? true : false}">

它總是返回true

這是我的MainController類:

package com.erp3.gui.controllers;

import java.io.IOException;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
public class MainController {

    public LoginController loginController;
    public ExternalContext ec;

    public void checkUserSession() throws IOException {
        ec = FacesContext.getCurrentInstance().getExternalContext();
        loginController = (LoginController) ec.getSessionMap().get("loginController");
        loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
        if (loginController == null || !loginController.getIsLoggedIn()) {
            ec.redirect(ec.getRequestContextPath() + "/views/login.html");
        }
    }

    public Boolean showComponent() {
        return this.loginController.getIsLoggedIn();
    }
}

我的方法showComponent()loginController返回一個會話對象屬性

它拋出NullPointerException因為loginController顯然為null 如果它是另一個@ManagedBean ,那么你需要將它作為一個manged屬性注入。 這樣您就不需要從會話映射中手動獲取它。 此外,您應該為您的MainController提供有效的bean范圍。 如果沒有范圍,將在每個單獨的 EL表達式#{mainController}上創建一個新的范圍。

@ManagedBean
@RequestScoped
public class MainController {

    @ManagedProperty("#{loginController}") // +getter+setter
    public LoginController loginController;

    @PostConstruct // Will be invoked directly after construction and managed property injection.
    public void checkUserSession() throws IOException {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        if (!loginController.getIsLoggedIn()) {
            ec.redirect(ec.getRequestContextPath() + "/views/login.html");
        }
    }

    public boolean isShowComponent() {
        return loginController.getIsLoggedIn();
    }

}

然后你可以使用它:

<ui:fragment rendered="#{mainController.showComponent}">

但是你為什么不直接訪問#{loginController}

<ui:fragment rendered="#{loginController.isLoggedIn}">

至於你的問題為什么#{not empty mainController ? true : false} #{not empty mainController ? true : false}總是計算true是因為JSF @ManagedBean 永遠不為 null 如果EL范圍中不存在,JSF將自動創建一個。

調用showComponent時, loginController似乎為null。 創建方法getLoginController

public getLoginController() {
    (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
}

public Boolean showComponent() {
    return getLoginController() != null && getLoginController().getIsLoggedIn();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM