1

这是我的片段:

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

我的LoginController将重定向到扩展MainController具有布尔方法的页面home.html所以当我尝试调用它时,我得到一个因为,正如我注意到的,Java 首先加载 html 以查看它是否正在调用任何 Java 类所以当我尝试访问(从 HomeController 扩展,尚未调用)我得到这个空指针showComponentmainController.showComponent()nullPointerExceptionmainController

. 如果设置了 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

4

2 回答 2

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从来没有。如果 EL 范围内不存在一个,JSF 将自动创建一个。@ManagedBean null

于 2012-04-26T19:42:40.277 回答
1

当您调用时,它似乎loginController为空showComponent。创建方法getLoginController

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

public Boolean showComponent() {
    return getLoginController() != null && getLoginController().getIsLoggedIn();
}
于 2012-04-26T19:42:33.150 回答