ventajas metodos metodo llamar instancia estáticos estaticos estatico ejemplos como clases atributos java jsp el

java - metodos - ¿Cómo llamar a un método estático en JSP/EL?



metodos java ejemplos (8)

Bean como StaticInterface también se puede usar

<h:commandButton value="reset settings" action="#{staticinterface.resetSettings}"/>

y frijol

package com.example.common; import com.example.common.Settings; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean(name = "staticinterface") @ViewScoped public class StaticInterface { public StaticInterface() { } public void resetSettings() { Settings.reset(); } }

Soy nuevo en JSP. Intenté conectar MySQL y mis páginas JSP y funciona bien. Pero aquí está lo que necesitaba hacer. Tengo un atributo de tabla llamado "saldo". Recupere y utilícelo para calcular un nuevo valor llamado "cantidad". (No estoy imprimiendo "saldo").

<c:forEach var="row" items="${rs.rows}"> ID: ${row.id}<br/> Passwd: ${row.passwd}<br/> Amount: <%=Calculate.getAmount(${row.balance})%> </c:forEach>

Parece que no es posible insertar scriptlets dentro de las etiquetas JSTL.


EL 2.2 tiene un mecanismo inbuild de métodos de llamada. Más aquí: sitio de Oracle . Pero no tiene acceso a métodos estáticos. Aunque puede seguir llamándolo a través de una referencia de objeto. Pero uso otra solución, descrita en este artículo: Llamar a un método estático de EL


En Struts2 o Webwork2, puede usar esto:

<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>

Luego referencia #tourLanguage en tu jsp


No puede invocar métodos estáticos directamente en EL. EL solo invocará métodos de instancia.

En cuanto a su intento fallido de scriptlet , no puede mezclar scriptlets y EL. Usa el uno o el otro. Como los scriptlets se discouraged durante más de una década, debe apegarse a una solución EL-only.

Tienes básicamente 2 opciones (suponiendo que tanto el balance como Calculate#getAmount() son double ).

  1. Solo envuélvelo en un método de instancia.

    public double getAmount() { return Calculate.getAmount(balance); }

    Y úsala en su lugar:

    Amount: ${row.amount}

  2. O bien, declare Calculate#getAmount() como una función EL. Primero crea un archivo /WEB-INF/functions.tld :

    <?xml version="1.0" encoding="UTF-8" ?> <taglib 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-jsptaglibrary_2_1.xsd" version="2.1"> <display-name>Custom Functions</display-name> <tlib-version>1.0</tlib-version> <uri>http://example.com/functions</uri> <function> <name>calculateAmount</name> <function-class>com.example.Calculate</function-class> <function-signature>double getAmount(double)</function-signature> </function> </taglib>

    Y úsalo de la siguiente manera:

    <%@taglib uri="http://example.com/functions" prefix="f" %> ... Amount: ${f:calculateAmount(row.balance)}">


Otro enfoque es usar Spring SpEL:

<%@taglib prefix="s" uri="http://www.springframework.org/tags" %> <s:eval expression="T(org.company.Calculate).getAmount(row.balance)" var="rowBalance" /> Amount: ${rowBalance}

Si omite var="rowBalance" entonces <s:eval> imprimirá el resultado de la expresión a la salida.


Según la respuesta de @Lukas, puede usar ese método de bean y llamada por reflexión:

@ManagedBean (name = "staticCaller") @ApplicationScoped public class StaticCaller { private static final Logger LOGGER = Logger.getLogger(StaticCaller.class); /** * @param clazz * @param method * @return */ @SuppressWarnings("unchecked") public <E> E call(String clazz, String method, Object... objs){ final ClassLoader loader = Thread.currentThread().getContextClassLoader(); final List<Class<?>> clasesparamList = new ArrayList<Class<?>>(); final List<Object> objectParamList = new ArrayList<Object>(); if (objs != null && objs.length > 0){ for (final Object obj : objs){ clasesparamList.add(obj.getClass()); objectParamList.add(obj); } } try { final Class<?> clase = loader.loadClass(clazz); final Method met = clase.getMethod(method, clasesparamList.toArray(new Class<?>[clasesparamList.size()])); return (E) met.invoke(null, objectParamList.toArray()); } catch (ClassNotFoundException e) { LOGGER.error(e.getMessage(), e); } catch (InvocationTargetException e) { LOGGER.error(e.getMessage(), e); } catch (IllegalAccessException e) { LOGGER.error(e.getMessage(), e); } catch (IllegalArgumentException e) { LOGGER.error(e.getMessage(), e); } catch (NoSuchMethodException e) { LOGGER.error(e.getMessage(), e); } catch (SecurityException e) { LOGGER.error(e.getMessage(), e); } return null; } }

xhtml, en un botón de comando por ejemplo:

<p:commandButton action="#{staticCaller.call(''org.company.Calculate'', ''getAmount'', row.balance)}" process="@this"/>


Si tu clase de Java es:

package com.test.ejb.util; public class CommonUtilFunc { public static String getStatusDesc(String status){ if(status.equals("A")){ return "Active"; }else if(status.equals("I")){ return "Inactive"; }else{ return "Unknown"; } } }

Luego puede llamar al método estático ''getStatusDesc'' como se muestra a continuación en la página JSP.

Use JSTL useBean para obtener clase en la parte superior de la página JSP:

<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>

Luego llame a la función donde requirió usar el Lenguaje de Expresión:

<table> <td>${cmnUtilFunc.getStatusDesc(''A'')}</td> </table>


Si usa struts2, puede usar

<s:var name=''myVar'' value="%{@package.prefix.MyClass#myMethod(''param'')}"/>

y luego referencia ''myVar'' en el atributo de etiqueta html o html como ${myVar}