我有: 一个名为“LoginBean”的托管bean。 一个名为“login.xhtml”的JSF页面
在这个jsf页面中,我有一个登录表单。
在managebean内部,我有一个loginCheck函数。
public void loginCheck(){
if(logincorrect){
//set user session
}else{
//set lockout count session ++
}
}
我想在jsf页面中做的是当锁定计数会话== 2时(意味着用户无法正确登录2次,我需要显示重新标记。
<td>
<%
if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("numberOfLogins") == 2){
<p:captcha label="Captcha" requiredMessage="Oops, are you human?"/>
}
%>
显然,&lt;%标签不起作用。感谢java / jsf专家提供的任何帮助。
答案 0 :(得分:14)
Scriptlets (那些类似PHP的<% %>
事物)是JSP的一部分,因为JSF 2.0支持其后继Facelets(XHTML),因此deprecated。 Facelets不再支持 scriptlet 的任何替代方案。在JSP中使用 scriptlet 几乎在所有情况下都会导致badly designed and poorly maintainable codebase。忘了他们。 Java代码属于完全可用的Java类。只需在控制器(JSF支持bean类)中准备模型(一些Javabean类),并使用taglibs和EL(表达式语言,那些#{}
事物)来访问视图中的模型。
您的具体用例,
<%
if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("numberOfLogins") == 2){
<p:captcha label="Captcha" requiredMessage="Oops, are you human?"/>
}
%>
可以在完整的JSF / EL中解决如下:
<p:captcha label="Captcha" requiredMessage="Oops, are you human?" rendered="#{numberOfLogins == 2}" />
这样numberOfLogins
可以更好地成为JSF @SessionScoped @ManagedBean
的属性,而不是手动放置在会话映射中的某个属性。
答案 1 :(得分:8)
这不是JSF的工作方式,至少不是XHTML作为表示层而不是JSP。 (<%
是JSP的一部分,您不再使用它。)正确的方法是使用托管bean。或者,您可以在此处使用表达式语言(EL)。
我会审核"JavaServer Faces Technology" chapter of Oracle's Java EE tutorial以获得一些额外帮助。