Как передать параметр функции javascript на странице JSF 2.0

#java #javascript #jakarta-ee #jsf-2 #primefaces

#java #javascript #джакарта-ee #jsf-2 #простые

Вопрос:

Я создаю пользовательское диалоговое окно входа, аналогичное тому, которое найдено на http://www.primefaces.org/showcase/ui/dialogLogin.jsf но я получаю ошибку при сборке:

javax.el.PropertyNotFoundException: /WEB-INF/templates/BasicTemplate.xhtml @58,83 oncomplete=»handleLoginRequest(#{securityController.logIn})»: класс managedbeans.SecurityController’ не имеет свойства ‘logIn’.

Я думаю, ошибка заключается в том, как я пытаюсь запустить процедуру ведения журнала. Может кто-нибудь взглянуть, правильный ли мой синтаксис?

   <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> 
  

И это управляемый компонент, который содержит метод, вызываемый при завершении события:

 @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...
  

Комментарии:

1. Вы можете передать параметр, а не метод, в javascript

Ответ №1:

Вы должны вызвать свой метод входа из actionListener атрибута p:commandButton , а не внутри oncomplete атрибута. Функция javascript из примера может использоваться без изменений. Это только для отображения эффекта.

Измените свой p:commandButton таким образом:

 <p:commandButton value="Login" update="growl"                       
       oncomplete="handleLoginRequest(xhr, status, args)"
       actionListener="#{securityController.logIn}"
/>
  

И используйте функцию js точно так же, как в демонстрации primefaces:

 <script type="text/javascript">  
    function handleLoginRequest(xhr, status, args) {  
        if(args.validationFailed || !args.loggedIn) {  
            jQuery('#dialog').parent().effect("shake", { times:3 }, 100);  
        } else {  
            dlg.hide();  
            jQuery('#loginLink').fadeOut();  
        }  
    }  
</script>  
  

Комментарии:

1. @sfrj в вашем случае #{securityController.logIn} это приведет к поиску getLogIn() в securityController компоненте контроллера, вы передаете его как значение. @Matt 1

2. Я сделал это, и теперь я не получаю ошибку сборки. Но когда я нажимаю на кнопку отправки, я получаю сообщение об ошибке. Я думаю, что это связано с EJB. Я внесу обновление, чтобы показать вам.

Ответ №2:

Если вы хотите выполнить метод в событии javascript, используйте <a4j:jsfunction>

Вот пример.

Комментарии:

1. вы забыли ссылку на пример

2. Есть ли какая-либо другая альтернатива, я не хочу использовать richfaces. В прошлом у меня были конфликты с примитивными и расширенными гранями вместе

3. @sfrj: тогда лучше добавьте action к вашей командной кнопке и по завершении выполните то, что вы хотите, передав любую логическую переменную, установленную в действие.