Vous ne pouvez pas appeler des méthodes statiques directement dans EL. EL invoquera uniquement les méthodes d'instance.
Quant à l'échec de votre tentative de scriptlet , vous ne pouvez pas mélanger des scriptlets et EL. Utilisez l'un ou l'autre. Étant donné que les scriptlets sont découragés pendant une décennie, vous devez vous en tenir à une solution exclusivement EL.
Vous avez essentiellement 2 options (en supposant les deux balance
et Calculate#getAmount()
sont double
).
Enveloppez-le simplement dans une méthode d'instance.
public double getAmount() {
return Calculate.getAmount(balance);
}
Et utilisez-le à la place:
Amount: ${row.amount}
Ou déclarez en Calculate#getAmount()
tant que fonction EL. Créez d'abord un /WEB-INF/functions.tld
fichier:
<?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>
Et utilisez-le comme suit:
<%@taglib uri="http://example.com/functions" prefix="f" %>
...
Amount: ${f:calculateAmount(row.balance)}">
Une autre approche consiste à utiliser 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 vous ignorez facultatif , le résultat de l'expression sera
var="rowBalance"
alors<s:eval>
imprimé.la source
'the_string_argument'
- pas besoin de danser avec l'échappement.Si votre classe Java est:
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"; } } }
Ensuite, vous pouvez appeler la méthode statique 'getStatusDesc' comme ci-dessous dans la page JSP.
Utilisez JSTL useBean pour obtenir la classe en haut de la page JSP:
<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>
Ensuite, appelez la fonction où vous avez besoin d'utiliser le langage d'expression:
<table> <td>${cmnUtilFunc.getStatusDesc('A')}</td> </table>
la source
Bean comme StaticInterface peut également être utilisé
<h:commandButton value="reset settings" action="#{staticinterface.resetSettings}"/>
et haricot
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(); } }
la source
Settings.reset()
est un appel de méthode statique. Lukas propose de créer un ManagedBean de type wrapper avec une méthode non statique pour chaque méthode statique, que l'on veut appeler depuis EL. C'est une solution valable.EL 2.2 a un mécanisme inbuild pour appeler des méthodes. Plus ici: site oracle . Mais il n'a pas accès aux méthodes statiques. Bien que vous puissiez toujours l'appeler via une référence d'objet. Mais j'utilise une autre solution, décrite dans cet article: Appel d'une méthode statique depuis EL
la source
<web-app> → <filter>
).Si vous utilisez struts2, vous pouvez utiliser
<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>
puis référencez «myVar» dans l'attribut de balise html ou html comme
${myVar}
la source
Sur la base de la réponse @Lukas, vous pouvez utiliser ce bean et appeler la méthode par réflexion:
@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, dans un bouton de commande par exemple:
<p:commandButton action="#{staticCaller.call('org.company.Calculate', 'getAmount', row.balance)}" process="@this"/>
la source
SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost/127.0.0.1:8080-5) java.lang.IllegalArgumentException: wrong number of arguments
.<c:forEach var="row" items="${rs.rows}"> ID: ${row.id}<br/> Passwd: ${row.passwd}<br/> <c:set var="balance" value="${row.balance}"/> Amount: <%=Calculate.getAmount(pageContext.getAttribute("balance").toString())%> </c:forEach>
Dans cette solution, nous attribuons une valeur (via la balise principale) à une variable, puis nous récupérons la valeur de cette variable dans scriplet.
la source
Dans Struts2 ou Webwork2, vous pouvez utiliser ceci:
<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>
Puis référence
#tourLanguage
dans votre jspla source