2012-04-26 43 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(); 
}