web-dev-qa-db-fra.com

Comment appeler une méthode statique dans JSP / EL?

Je suis nouveau sur JSP. J'ai essayé de connecter MySQL et mes pages JSP et cela fonctionne bien. Mais voici ce que je devais faire. J'ai un attribut de table appelé "balance". Récupérez-le et utilisez-le pour calculer une nouvelle valeur appelée "montant". (Je n'imprime pas "balance").

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

Il semble qu'il ne soit pas possible d'insérer des scriptlets dans les balises JSTL.

81
John

Vous ne pouvez pas appeler des méthodes statiques directement dans EL. EL n'invoquera que des méthodes d'instance.

En ce qui concerne votre tentative de scriptlet ayant échoué, vous ne pouvez pas mélanger des scriptlets et EL. Utilisez l'un ou l'autre. Puisque des scriptlets sont déconseillés sur une décennie, vous devez vous en tenir à une solution exclusivement EL.

Vous avez fondamentalement 2 options (en supposant que balance et Calculate#getAmount() sont double).

  1. Enveloppez-le simplement dans une méthode d'instance.

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

    Et utilisez-le à la place:

    Amount: ${row.amount}
    

  2. Ou déclarez Calculate#getAmount() en tant que fonction EL. Commencez par créer un fichier /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>
    

    Et utilisez-le comme suit:

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

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 l'option var="rowBalance", Alors <s:eval> Imprimera le résultat de l'expression à afficher.

56
dma_k

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 une classe en haut de la page JSP:

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

Ensuite, appelez la fonction à l'endroit souhaité avec Expression Language:

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

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();
    }
}
4
Lukas

EL 2.2 a un mécanisme inbuild de méthodes d'appel. Plus ici: site Oracle . Mais il n'a pas accès aux méthodes statiques. Bien que vous puissiez toujours appeler, c'est par référence d'objet. Mais j'utilise une autre solution, décrite dans cet article: Appel d'une méthode statique à partir d'EL

3
msangel

Basé sur la réponse de @Lukas, vous pouvez utiliser cette méthode d'appel et de haricot 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"/>
2
Juan

Si vous utilisez struts2, vous pouvez utiliser

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

et référence ensuite 'myVar' dans l'attribut de balise html ou html comme ${myVar}

2
dhblah

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 jsp

0
sendon1982
<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 affectons une valeur (via une balise principale) à une variable, puis nous extrayons la valeur de cette variable dans scriplet.

0
ash9