java - JSF EL 条件

标签 java jsf el

这是我的片段:

<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 返回 session 对象属性

最佳答案

它抛出 NullPointerException 因为 loginController 显然是 null。如果它是另一个 @ManagedBean,那么您需要将其作为托管属性注入(inject)。这样你就不需要手动从 session 映射中抓取它。此外,您应该为您的 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/

相关文章:

java - 如何从 inputtextarea 下载包含内容的 xml 文件?

jsp - 是否有任何标准 JSP EL 函数作为 JSTL c :url? 的模拟

java - 为什么 String.equals() 方法在 JSTL Core 标签 <c :if>? 中不起作用

java - Hibernate 上 @JsonIgnore 的 Jsonparsing 错误

java - 生成 JAR 文件后 JFrame 设计发生变化吗?图片缺失

java - 添加额外的包以使用 Spring 配置扫描到实体管理器?

jsf - 如何在EL表达式中串联字符串?

Java RMI : How to pass a POJO

jsf - 托管 bean ManagedBean 的托管 bean 类 java.time.ZonedDateTime 未声明公共(public)无参数构造函数

仅当元素存在时 Ajax 渲染