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

j'ai une page JSF qui montre le contenu d'un dossier (en fait, c'est 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 quand j'exécute cette page j'obtiens l'erreur suivante:

/parcourir.XHTML @34,110 action= " # {backedBean.mise à jour des contenus (dContent)}" Erreur D'analyse: #{backedBean.updateContents (dContent)}

...

...

causé par: org.Apache.El.analyseur.ParseException: Rencontré " "(" "( "" à la ligne 1, colonne 28.

"}"...

"."...

"[ " ...

"> " ...

"gt"...

"< " ...

"lt"...

"> = " ...

"ge"...

...

...

la chose drôle est que Netbeans est capable d'autocompleter le nom de la méthode donc je l'image que mon haricot arrière est ok. Le problème se produit seulement quand j'appelle une méthode avec un paramètre.

des idées?

Merci beaucoup

23
demandé sur Subodh Joshi 2011-03-11 16:50:27

3 réponses

Les arguments de la méthode de passage

ont été introduits dans L'EL 2.2. Cela n'est donc possible que si vous utilisez un Servlet 3.0 / EL 2.2 comme Tomcat 7, Glassfish 3, JBoss AS 6, etc et votre web.xml est déclaré selon 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 vous ne l'êtes pas, alors cochez cette réponse pour les alternatives en ce qui concerne l'obtention de la rangée actuelle dans les données, ou cette réponse en ce qui concerne le remplacement de la mise en œuvre de la le par une qui supporte les arguments de méthode de passage de sorte que vous pouvez l'utiliser sur les conteneurs Servlet 2.5 / EL 2.1 aussi bien.

39
répondu BalusC 2017-05-23 10:31:18
La couture

de Jboss peut aussi aider à obtenir la fonctionnalité.

Seam utilise JBoss EL qui fournit une extension à la langue 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 une valeur dynamique <h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

Limitation:

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

3
répondu Nilesh J. Bhaumik 2013-01-07 07:30:38

il y a eu en fait une façon" hack " de faire cela depuis JSF 1.0. Vous créez juste une méthode sur votre Fève de soutien qui retourne une carte, et vous pouvez utiliser JSF EL pour passer n'importe quel objet que vous voulez à cette méthode, parce que JSF pense que vous passez la clé à la carte.

pendant ce temps, dans votre méthode de support, vous retournez en fait une instance de carte "imposteur" qui n'est pas vraiment une carte du tout, dont la méthode get() délègue à la méthode que vous vouliez appeler. Dans votre. xhtml ou .fichier jsp ensuite, vous pouvez utiliser la notation crochets pour passer la variable.

Extending HashMap est une façon de rendre la carte des imposteurs facile à définir -- assez succincte pour utiliser une classe interne anonyme de cette façon.

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

1
répondu Michael Lucas 2015-12-14 02:53:02