这是我的片段:

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


我的LoginController将重定向到扩展MainController的页面home.html,该页面具有boolean方法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,则需要将其作为托管属性注入。这样,您无需从会话映射中手动获取它。另外,您应该给您的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从来都不是null。如果EL作用域中不存在一个,JSF将自动创建一个。

关于java - JSF EL条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10339910/

10-10 15:14