2010-12-04 35 views
1

J'ai obtenu ce site:problème h: forme et p: ajax (Mojarra 2.0.2 et 2.0.2 Primefaces)

<!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 le haricot dos:

@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 a été Travailler 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 fait de cliquer sur le texte d'entrée (la mise au point) ne déclenche pas l'actionListener (le texte "Started" n'apparaît pas sur la sortie standard). Quelqu'un at-il un problème similaire?

EDIT 1 (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 id inconnu « copingFilePhase '- impossible de le localiser dans le cadre du composant copingFilePhaseFocus

Répondre

4

Cela peut avoir deux causes:

  1. Les servlet ressources 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 vérifiant la console d'erreur JS dans votre navigateur Web pour toute erreur JS lors de la mise au point de l'entrée. Dans Firefox, la console est disponible en appuyant sur Ctrl + Shift + 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> 
    
  2. La signature de la méthode est erronée. Vous devriez être en mesure de le voir en lisant les journaux du serveur et en voyant un javax.el.MethodNotFoundException dans les journaux. L'exemple de code dans votre question est correct, mais il y a une ambiguïté dans ActionEvent. Il y a une classe avec le même nom dans le paquet java.awt.event. Vous l'avez peut-être accidentellement importé (auto-). Vérifiez si c'est bien javax.faces.event.ActionEvent et pas autre chose.

Si aucune aide, vous voudrez peut-être envisager de remplacer les PrimeFaces p:ajax par la norme JSF 2.0 f:ajax:

<f:ajax event="focus" listener="#{installationController.startCopyingWarFile}" /> 

avec

public void startCopyingWarFile(AjaxBehaviorEvent event) { 
    // ... 
} 

AjaxBehaviorEvent est javax.faces.event.AjaxBehaviorEvent.

+0

Ad. 1: J'ai les entrées appropriées dans mon fichier web.xml. Un d. 2: Ce n'est pas un problème non plus. J'importation javax.faces.event.ActionEvent pour sûr et il n'y a aucune entrée sur l'erreur dans mes fichiers journaux. f: ajax semble fonctionner correctement. Mais dans f: ajax au lieu de l'attribut "update" il y a "render".Est-ce que "render" rend le composant en dehors de son composant h: form? J'ai une erreur qui ne peut pas trouver le composant "copingFilePhase". Je vais joindre le code dans ma question originale (EDIT: code ci-joint). –

+0

ID de préfixe avec ':'. – BalusC

+0

Pourriez-vous écrire un exemple? Je ne comprends pas vraiment votre conseil;) –