#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 12. Я сделал это, и теперь я не получаю ошибку сборки. Но когда я нажимаю на кнопку отправки, я получаю сообщение об ошибке. Я думаю, что это связано с EJB. Я внесу обновление, чтобы показать вам.
Ответ №2:
Если вы хотите выполнить метод в событии javascript, используйте <a4j:jsfunction>
Вот пример.
Комментарии:
1. вы забыли ссылку на пример
2. Есть ли какая-либо другая альтернатива, я не хочу использовать richfaces. В прошлом у меня были конфликты с примитивными и расширенными гранями вместе
3. @sfrj: тогда лучше добавьте action к вашей командной кнопке и по завершении выполните то, что вы хотите, передав любую логическую переменную, установленную в действие.