[英]JSF EL condition
这是我的片段:
<ui:fragment rendered="#{}">
<ui:include src="../includes/top.xhtml"/>
</ui:fragment>
我的LoginController将重定向到扩展MainController的页面home.html ,它有一个布尔方法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
,那么你需要将它作为一个manged属性注入。 这样您就不需要从会话映射中手动获取它。 此外,您应该为您的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}
#{not empty mainController ? true : false}
总是计算true
是因为JSF @ManagedBean
永远不为 null
。 如果EL范围中不存在,JSF将自动创建一个。
调用showComponent
时, loginController
似乎为null。 创建方法getLoginController
:
public getLoginController() {
(LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
}
public Boolean showComponent() {
return getLoginController() != null && getLoginController().getIsLoggedIn();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.