web-dev-qa-db-fra.com

Comment appeler une méthode avec un paramètre en JSF

J'ai une page JSF qui montre le contenu d'un dossier (c'est vraiment le contenu d'un compte dropbox).

J'utilise un dataTable pour rendre le contenu d'un objet ListArray:

<h:dataTable style="text-align: left" width="600" var="dContent" value="#{backedBean.contents}">
  <h:column>
    <f:facet name="header">
      <f:verbatim>NAME</f:verbatim>
    </f:facet>
    <h:commandButton value="#{dContent.fileName}" action="#{backedBean.updateContents(dContent)}"/>
  </h:column>
  <h:column>
    <f:facet name="header">
      <f:verbatim>SIZE</f:verbatim>
    </f:facet>
    <h:outputText value="#{dContent.size}"/>
  </h:column>
</h:dataTable>

Mais lorsque j'exécute cette page, j'obtiens l'erreur suivante:

/browse.xhtml @ 34,110 action = "# {BackBean.updateContents (dContent)}" Erreur d'analyse: # {BackedBean.updateContents (dContent)}
...
...
Provoqué par: org.Apache.el.parser.ParseException: rencontré "" ("" ("" à la ligne 1, colonne 28. Attendait l'un des:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
"> =" ...
"ge" ...
...
...

Le plus drôle, c'est que Netbeans est capable de compléter automatiquement le nom de la méthode, donc j'imagine que mon bean backend est correct. Le problème se produit uniquement lorsque j'appelle une méthode avec un paramètre.

Des idées?

Merci beaucoup

23
Neos76

La transmission des arguments de méthode a été introduite dans EL 2.2. Cela n'est donc possible que si vous utilisez un conteneur compatible Servlet 3.0/EL 2.2 comme Tomcat 7, Glassfish 3, JBoss AS 6, etc. et votre web.xml a été déclaré conformément à la spécification Servlet 3.0.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
    <!-- Config here -->
</web-app>

Si ce n'est pas le cas, vérifiez cette réponse pour des alternatives concernant l'obtention de la ligne actuelle dans les tables de données, ou cette réponse pour remplacer l'implémentation EL par une qui prend en charge le passage arguments de méthode afin que vous puissiez également l'utiliser sur les conteneurs Servlet 2.5/EL 2.1.

39
BalusC

Jboss Seam peut également aider à obtenir la fonctionnalité.

Seam utilise JBoss EL qui fournit une extension du langage standard d'expression unifiée (EL). JBoss EL fournit un certain nombre d'améliorations qui augmentent l'expressivité et la puissance des expressions EL.

Exemple:

passer des chaînes littérales en utilisant des guillemets simples: <h:commandLink action="#{printer.println('Hello world!')}" value="Hello"/>

ou pour la valeur dynamique <h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

Limitation:

JBoss EL ne peut actuellement pas être utilisé avec JSP 2.1 car le compilateur rejette les expressions avec des paramètres. Donc, si vous souhaitez utiliser cette extension avec JSF 1.2, vous devrez utiliser Facelets. L'extension fonctionne correctement avec JSP 2.0.

3
Nilesh J. Bhaumik

Il existe en fait une méthode de "piratage" depuis JSF 1.0. Vous venez de créer une méthode sur votre bean de sauvegarde qui retourne une carte, et vous pouvez utiliser JSF EL pour passer tout objet que vous voulez à cette méthode, car JSF pense que vous passez la clé à la carte.

Pendant ce temps, dans votre méthode de bean de sauvegarde, vous retournez en fait une instance de carte "imposteur" qui n'est pas vraiment une carte, dont la méthode get() délègue à la méthode que vous souhaitez appeler. Dans votre fichier .xhtml ou .jsp, vous pouvez utiliser la notation entre crochets pour transmettre la variable.

Étendre HashMap est un moyen de rendre la carte imposteur facile à définir - suffisamment succinct pour utiliser une classe interne anonyme de cette façon.

C'est un hack, mais cela a bien fonctionné pour moi dans le passé.

2
Michael Lucas