Problème avec h: forme et p: Ajax (Mojarra 2.0.2 et 2.0.2 Primefaces)
-
08-10-2019 - |
Question
J'ai obtenu ce site:
<!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>
Et haricot soutien:
@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");
}
}
Ce code fonctionnait sous MyFaces 2.0.0. Mais sous MyFaces 2.0.2 ou Mojarra 2.0.2 ne fonctionne pas. En disant « ne fonctionne pas » je veux dire que le texte d'entrée en cliquant (mise au point) ne déclenche actionListener (Texte « Started » ne figure pas sur la sortie standard). Quelqu'un at-il le même problème?
1 EDIT (p Après avoir changé: Ajax à 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>
Et l'erreur est:
javax.faces.FacesException: contient un identifiant inconnu « CopingFilePhase » - ne peut pas localiser dans le cadre du composant copingFilePhaseFocus
La solution
Cela peut avoir deux causes:
-
La servlet ressource Primefaces est pas correctement configuré qui provoquera que les JavaScripts nécessaires ne seront pas chargés. Vous devriez être en mesure de le voir en cochant la console d'erreur JS dans votre navigateur Web pour toute erreur JS lors de la focalisation de l'entrée. Dans Firefox, la console est disponible en appuyant sur Ctrl + Maj + J .
Le servlet ressource sera chargée automatiquement dans Servlet 3.0 environnements (Glassfish v3, Tomcat 7, JBoss 6, etc.), mais dans des environnements anciens, vous devez configurer manuellement dans
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>
-
La signature de la méthode est erronée. Vous devriez être en mesure de le voir en lisant les journaux du serveur et de voir un
javax.el.MethodNotFoundException
dans les journaux. L'exemple de code dans votre question est correcte, mais il y a ambiguïté dansActionEvent
. Il y a une classe avec le même nom dans le paquet dejava.awt.event
. Vous pourriez avoir par mégarde (auto-) a importé. Vérifiez s'il est en effetjavax.faces.event.ActionEvent
et pas autre chose.
Si aucune aide, vous voudrez peut-être envisager de remplacer le PrimeFaces p:ajax
par la norme JSF 2.0 f:ajax
:
<f:ajax event="focus" listener="#{installationController.startCopyingWarFile}" />
avec
public void startCopyingWarFile(AjaxBehaviorEvent event) {
// ...
}
où AjaxBehaviorEvent
est javax.faces.event.AjaxBehaviorEvent
.