Проблема с H: Форма и P: Ajax (Mojarra 2.0.2 и Primefaces 2.0.2)
-
08-10-2019 - |
Вопрос
У меня есть этот сайт:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head></h:head>
<h:body>
<h:form id="form-some">
<h:inputText id="copingFilePhaseFocus">
<p:ajax event="focus" actionListener="#{installationController.startCopyingWarFile}" />
</h:inputText>
</h:form>
</h:body>
</html>
И Backing Bean:
@ManagedBean(name = "installationController")
@SessionScoped
public class InstallationController implements IPluginInstallationListener {
// Some methods here (...)
public void startCopyingWarFile(ActionEvent event) {
System.out.println("\n\n\n\nStarted\n\n\n\n");
}
}
Этот код работал по MyFaces 2.0.0. Но под MyFaces 2.0.2 или Mojarra 2.0.2 нет. Рассказывая «не работает», я имею в виду, что нажатие (фокусируя) входной текст не запускает ActionListener (Text «Minting», не отображается на стандартном выходе). У кого-нибудь похожая проблема?
Редактировать 1 (после смены p: ajax to f: ajax):
<p:outputPanel id="copingFilePhase">
<p:accordionPanel speed="0.2"
rendered="#{pluginInstallerWebBean.copingFilePhase}">
<p:tab
title="#{msg['installPlugin.copyingWar']} ... #{pluginInstallerWebBean.copingFilePhaseState}">
<h:form prependId="false">
<p:focus for="copingFilePhaseFocus" />
<h:inputText id="copingFilePhaseFocus"
rendered="#{pluginInstallerWebBean.copingFilePhaseFocus}"
style="display:none;">
<f:ajax event="focus"
render="copingFilePhase obtainingPluginInformationPhase"
listener="#{installationController.startCopyingWarFile}" />
</h:inputText>
</h:form>
#{msg['installPlugin.copyingWarDescription']}
</p:tab>
</p:accordionPanel>
</p:outputPanel>
<p:outputPanel id="obtainingPluginInformationPhase">(...)</p:outputPanel>
И ошибка:
javax.faces.facesexception: содержит неизвестный идентификатор «Copingfilephase» - не могу найти его в контексте компонента COPINGFILEPASEFOCUS
Решение
Это может иметь два причина:
Сервлете ресурсы Primefaces не настроен правильно, что приведет к тому, что необходимые Javascripts не будут загружены. Вы должны увидеть его, проверив консоль ошибки JS в вашем WebBrowser для любых ошибок JS при фокусировке ввода. В Firefox консоль доступен на нажатии Ctrl.+Сдвиг+J.
Сервленый ресурс будет загружен автоматически в средах сервлета 3.0 (GlassFish V3, Tomcat 7, JBoss 6 и т. Д.), Однако в старых средах вам необходимо настроить его вручную
web.xml
:<servlet> <servlet-name>PrimeFaces Resource Servlet</servlet-name> <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PrimeFaces Resource Servlet</servlet-name> <url-pattern>/primefaces_resource/*</url-pattern> </servlet-mapping>
Подпись метода неверна. Вы должны быть в состоянии увидеть его, читая журналы сервера и увидеть
javax.el.MethodNotFoundException
в журналах. Пример кода в вашем вопросе правильно, но есть двусмысленность вActionEvent
. Отказ Есть класс с тем же именем вjava.awt.event
упаковка. У вас могут быть случайно (авто-) импортировано его. Проверить, действительно ли этоjavax.faces.event.ActionEvent
И не что-то еще.
Если никто не поможет, вы можете посмотреть, чтобы заменить вымышки p:ajax
по стандарту JSF 2.0 f:ajax
:
<f:ajax event="focus" listener="#{installationController.startCopyingWarFile}" />
с участием
public void startCopyingWarFile(AjaxBehaviorEvent event) {
// ...
}
куда AjaxBehaviorEvent
является javax.faces.event.AjaxBehaviorEvent
.