2012-04-26 44 views
1

這是我的片段:JSF EL條件

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

的LoginController將重定向頁面home.html的延伸MainController有一個布爾方法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

回答

2

它拋出NullPointerException因爲loginController顯然null。如果是另一個@ManagedBean,那麼你需要注入它作爲一個管理屬性。這樣你就不需要從會話映射中手動獲取它。另外,你應該給你的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}評估true是因爲JSF @ManagedBean s爲從未null。如果在EL範圍內不存在,JSF將自動創建一個。

+0

因爲它會在下一次請求時丟失,不是嗎?我不必訪問會話對象嗎? – Gerep 2012-04-26 19:44:31

+0

它顯然在會話映射中,所以它可以在整個會話中使用。當'LoginController'實際上是'@ManagedBean @ SessionScoped'時,這是真的。 – BalusC 2012-04-26 19:45:01

+0

使用'loginController.isLoggedIn'Didn't – Gerep 2012-04-26 19:46:24

1

函數返回一個會話對象屬性似乎loginController爲空當你調用showComponent。創建方法getLoginController

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

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