4

我有:一个名为“LoginBean”的托管 bean。一个名为“login.xhtml”的 JSF 页面

在这个 jsf 页面中,我有一个登录表单。

在 managebean 我有一个 loginCheck 功能。

public void loginCheck(){
 if(logincorrect){
  //set user session 
 }else{
  //set lockout count session ++
 }
}

我想在我的 jsf 页面中做的是,当锁定计数会话 == 2 时(意味着用户未能正确登录 2 次,我需要显示一个 recaptcha 标记。

<td>
    <%
         if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("numberOfLogins") == 2){
         <p:captcha label="Captcha" requiredMessage="Oops, are you human?"/>
       }
     %>

显然, <% 标签不起作用。感谢 java/jsf 专家的任何帮助。

4

2 回答 2

16

Scriptlet(那些类似于 PHP 的<% %>东西)是 JSP 的一部分,自 JSF 2.0 起已弃用,取而代之的是其后续的 Facelets (XHTML)。Facelets 不再支持scriptlet的任何替代方案。在 JSP 中使用scriptlet几乎在所有情况下都会导致代码库设计不良和可维护性差。忘记他们。Java 代码属于完全有价值的 Java 类。只需在控制器(JSF 支持 bean 类)中准备模型(一些 Javabean 类)并使用标记库和 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

也可以看看:

于 2012-09-08T13:52:23.100 回答
9

这不是 JSF 的工作方式,至少不是使用 XHTML 作为表示层而不是 JSP。(<%是 JSP 的一部分,您在这里不再使用它。)正确的方法是使用托管 bean。或者,您可以在此处使用表达式语言 (EL)。

我会查看Oracle 的 Java EE 教程的“JavaServer Faces Technology”一章以获得更多帮助。

于 2012-09-08T13:05:57.060 回答