2012-05-21 15 views
5

¿Cómo puedo llamar al método de un objeto de EL?Ejecución y método del objeto de EL

Dale el objeto:

public class TestObj { 
    public testObj() { }; 

    public String test() { return "foo"; } 
    public String someOtherMethod(String param) { return param + "_bar"; } 
} 

y se añade el obj a la pageContext

pageContext.setAttribute("t", new TestObj()); 

¿Cómo iba a realizar el equivalente de:

<%= t.test() %> 
<%= t.someOtherMethod("foo") %> 

usando EL?

+0

para cualquier otra persona que sufre el mismo error tonto como yo, tenga en cuenta los paréntesis para una llamada de método a diferencia de cuadrar las listas de acceso, mapas, etc. –

Respuesta

8

Se admite desde EL 2.2 que ha estado en funcionamiento desde el 10 de diciembre de 2009 (hace más de 2.5 años). EL 2.2 va de la mano con Servlet 3.0, por lo que si apunta a un Servlet 3.0 contenedor (Tomcat 7, Glassfish 3, etc) con un Servlet 3.0 compatible web.xml que parecen sigue

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    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" 
    version="3.0"> 

    <!-- Config here. --> 

</web-app> 

continuación, podrás invocar métodos con o sin argumentos a eL en las siguientes formas:

${t.test()} 
${t.someOtherMethod('foo')} 
+0

Parece que mi contenedor usa Servlet 2.3. Oh bien. – empire29

+0

¿Estás utilizando para el examen Tomcat 5.0? También puede suceder que esté ejecutando Tomcat 7.0, pero que el 'web.xml' está incorrectamente declarado como Servlet 2.3 y, por lo tanto, Tomcat 7.0 se ejecutará en el modo alternativo de Servlet 2.3. – BalusC

3

De acuerdo con este Method calls in EL las llamadas de método en Expression Language se encuentran actualmente en estado JSR y todavía no se han implementado. Lo que uso son las instalaciones de JST para los componentes de JavaBean para hacer algunas invocaciones. Por ejemplo, si modificar test método de firma a:

public class TestObj { 
    public TestObj() { }; 

    public String getTest() { return "foo"; } 
} 

Puede invocar getTest() método con esta sintaxis:

${t.test} 

Ahora, si necesita algo más elaborado -como con el parámetro que passing- podría usar las características de Método personalizado que EL ofrece. Eso requiere métodos públicos estáticos declarados en una clase pública, y también un archivo TLD. Un buen tutorial se puede encontrar here.

Actualizar:

Como estados @BalusC, especificaciones posteriores soportan ahora invocaciones de métodos. Si se está implementando en un contenedor compatible con Java EE 6, this Oracle Site muestra cómo usar correctamente la función.

+1

Estás fuera de moda. – BalusC

+0

No estaba enterado de eso. ¡Gracias por la actualización! –

Cuestiones relacionadas