mkyong example ejemplo jsf jsf-2

example - Cómo llamar a un método con un parámetro en JSF



mkyong jsf (3)

Tengo una página JSF que muestra el contenido de una carpeta (realmente es el contenido de una cuenta de Dropbox).

Estoy usando una tabla de datos para representar el contenido de un objeto 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>

Pero cuando ejecuto esta página obtengo el siguiente error:

/browse.xhtml @ 34,110 action = "# {backedBean.updateContents (dContent)}" Análisis de errores: # {backedBean.updateContents (dContent)}
...
...
Causado por: org.apache.el.parser.ParseException: Encontrado "" ("" ("" en la línea 1, columna 28. Estaba esperando uno de:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
"> =" ...
"ge" ...
...
...

Lo curioso es que Netbeans puede autocompletar el nombre del método, así que imagino que mi bean backend está bien. El problema ocurre solo cuando invoco un método con un parámetro.

¿Algunas ideas?

Muchas gracias


De hecho, ha habido una forma de "hackear" esto desde JSF 1.0. Simplemente crea un método en su bean de respaldo que devuelve un Mapa, y puede usar JSF EL para pasar cualquier objeto que desee a ese método, porque JSF cree que está pasando la clave al mapa.

Mientras tanto, en su método de respaldo de respaldo, en realidad devuelve una instancia de mapa "impostor" que no es en realidad un mapa, cuyo método get() delega en el método que desea llamar. En su archivo .xhtml o .jsp, puede usar la notación de corchetes para pasar la variable.

La extensión de HashMap es una manera de hacer que el mapa impostor sea fácil de definir, lo suficientemente breve como para usar una clase interna anónima de esa manera.

Esto es un truco, pero me ha funcionado en el pasado.


Jboss Seam también puede ayudar a obtener la función.

Seam usa JBoss EL que proporciona una extensión al Lenguaje de Expresión Unificado (EL) estándar. JBoss EL proporciona una serie de mejoras que aumentan la expresividad y el poder de las expresiones EL.

Ejemplo:

pase cadenas literales usando comillas simples: <h:commandLink action="#{printer.println(''Hello world!'')}" value="Hello"/>

o para valor dinámico <h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

Limitación:

JBoss EL no se puede usar actualmente con JSP 2.1 ya que el compilador rechaza expresiones con parámetros. Por lo tanto, si desea usar esta extensión con JSF 1.2, necesitará usar Facelets. La extensión funciona correctamente con JSP 2.0.


Los argumentos del método de aprobación se introdujeron en EL 2.2. Por lo tanto, esto solo es posible si se ejecuta en un contenedor compatible con Servlet 3.0 / EL 2.2 como Tomcat 7, Glassfish 3, JBoss AS 6, etc. y su web.xml ha sido declarado según la especificación de 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 no es así, compruebe esta respuesta para obtener alternativas con respecto a obtener fila actual en tablas de datos, o esta respuesta con respecto a reemplazar la implementación EL por una que soporte pasar argumentos de método para que pueda usarlo en Servlet 2.5 / EL 2.1 contenedores también.