这是我的片段:
<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/