我如何在jsf页面中嵌入java代码?

时间:2012-09-08 13:02:19

标签: java jsf jsf-2 scriptlet

我有: 一个名为“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专家提供的任何帮助。

2 个答案:

答案 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以获得一些额外帮助。