如何在JSF页面中嵌入Java代码?

4

我有以下内容:

一个名为“LoginBean”的托管bean。

一个名为“login.xhtml”的JSF页面。

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

在托管bean中,我有一个名为“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
另一个糟糕的想法。在JSP中使用脚本代码是1998年的老古董。你不应该这样做。学习JSTL,不要在页面中放置脚本代码块。 - duffymo
我们有什么资格评判呢?我认为SO应该是以事实为基础的吧?为什么问题必须如此客观,而答案和评论却充满了个人意见?哈哈。 - cbmeeks
2个回答

16
Scriptlets(那些类似于 PHP 的 <% %> 东西)是 JSP 的一部分,自 JSF 2.0 起已弃用,改用其继承者 Facelets(XHTML)。Facelets 不再支持任何替代方案来使用 scriptlets。在 JSP 中使用 scriptlets 几乎总是导致设计不良且难以维护的代码库。忘记它们吧。Java 代码应属于完整的 Java 类中。只需在控制器中准备模型(某个 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 的属性,而不是手动放置在会话映射中的某个属性。
另请参阅:

我们能在JSF 1中使用脚本吗? - Mahmoud Saleh
1
“Scriptlets” 不是 JSF 特有的,而是特定于 JSP 视图技术的。因此,如果您正在使用 JSP,则可以使用 “scriptlets”。但是,它们被认为是不良实践并且被官方强烈反对。请参见 https://dev59.com/13A75IYBdhLWcg3wqK10#3180202。 - BalusC

9
这不是JSF的工作方式,至少在使用XHTML作为表示层而非JSP时不是这样。(<%是JSP的一部分,在此处不再使用。) 正确的方法是使用托管bean。或者,您可以在此处使用表达式语言(EL)。
我建议查看Oracle的Java EE教程中的“JavaServer Faces技术”章节以获取更多帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接