如何在JSF 2.0页面上将参数传递给javascript函数

问题描述

| 我正在制作一个自定义登录对话框,类似于在http://www.primefaces.org/showcase/ui/dialogLogin.jsf上找到的对话框,但是在构建时出现错误:   javax.el.PropertyNotFoundException:/WEB-INF/templates/BasicTemplate.xhtml @ 58,83 oncomplete = \“ handleLoginRequest(#{securityController.logIn})\”:类\'managedbeans.SecurityController \'没有该属性\'登录\'。 我认为错误在于我尝试触发日志记录过程的方式。有人可以看看我的语法是否正确吗?
  <p:dialog id=\"dialog\" header=\"Login\" widgetvar=\"dlg\" modal=\"true\" width=\"400\" resizable=\"false\" draggable=\"false\" fixedCenter=\"true\">  
<h:form>    
    <h:panelGrid columns=\"2\" cellpadding=\"5\">  
        <h:outputLabel for=\"username\" value=\"Em@il: *\" />  
        <p:inputText value=\"#{securityController.email}\"   
                id=\"email\" required=\"true\" label=\"email\" />  

        <h:outputLabel for=\"password\" value=\"Password: * \" />  
        <h:inputSecret value=\"#{securityController.password}\"   
                id=\"password\" required=\"true\" label=\"password\" />  

        <f:facet name=\"footer\">  
            <p:commandButton value=\"Login\" update=\"growl\"                       
                oncomplete=\"handleLoginRequest(#{securityController.logIn})\"/>  
        </f:facet>  
    </h:panelGrid>           
</h:form>  
</p:dialog> 
<script type=\"text/javascript\">  
function handleLoginRequest(input) {  
    if(input == false) {  
        jQuery(\'#dialog\').parent().effect(\"shake\",{ times:3 },100);  
    } else {  
        dlg.hide();  
        jQuery(\'#loginLink\').fadeOut();  
    }  
 }  
</script> 
这是托管bean,它保存了被称为onComplete事件的方法
@ManagedBean
@RequestScoped
public class SecurityController {

@EJB
private IAuthentificationEJB authentificationEJB;
private String email;
private String password;
private String notificationValue;   

public void logIn() {
    if(authentificationEJB.saveUserState(email,password)) {
        notificationValue = \"dobro dosli\";
    }   
}
    //getters and setters...
    

解决方法

您必须从
p:commandButton
actionListener
属性而不是
oncomplete
属性内调用登录方法。该示例中的javascript函数可以直接使用。仅用于显示效果。 通过以下方式更改您的
p:commandButton
<p:commandButton value=\"Login\" update=\"growl\"                       
       oncomplete=\"handleLoginRequest(xhr,status,args)\"
       actionListener=\"#{securityController.logIn}\"
/>
并完全按照primefaces展示中的方式使用js函数:
<script type=\"text/javascript\">  
    function handleLoginRequest(xhr,args) {  
        if(args.validationFailed || !args.loggedIn) {  
            jQuery(\'#dialog\').parent().effect(\"shake\",{ times:3 },100);  
        } else {  
            dlg.hide();  
            jQuery(\'#loginLink\').fadeOut();  
        }  
    }  
</script>  
    ,如果要对javascript事件执行方法,请使用
<a4j:jsfunction>
这里的例子。