90 votes

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

Je suis novice en matière de JSP. J'ai essayé de connecter MySQL et mes pages JSP et cela fonctionne bien. Mais voici ce que j'avais besoin de 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 ne vais pas imprimer le "solde").

 <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.

134voto

BalusC Points 498232

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

Quant à votre échec scriptlet tentative, vous ne pouvez pas mélanger scriptlets et EL. Utilisez l'un ou l'autre. Puisque scriptlets sont découragé plus d'une décennie, vous devriez vous en tenir à une solution EL uniquement.

Vous avez essentiellement 2 options (en supposant que les deux balance y Calculate#getAmount() sont double ).

  1. Il suffit de l'envelopper dans une méthode d'instance.

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

    Et utilisez-le à la place :

    Amount: ${row.amount}

  2. Ou bien, déclarer Calculate#getAmount() comme une 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)}">

0 votes

@BalusC Et si mon jsp a (calculé) une certaine valeur et que j'aimerais l'envoyer comme paramètre ?

7 votes

@Sriram : Tout d'abord, êtes-vous sûr que vous ne confondez pas JSP et HTML/JS ? La façon dont vous posez la question indique que vous semblez penser que JSP fonctionne dans le navigateur web alors que c'est complètement faux. JSP est un producteur de code HTML/CSS/JS. C'est tout. Cela devrait vous donner matière à réflexion sur votre question et votre approche.

0 votes

Ce que je cherchais :)

62voto

dma_k Points 3567

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 sautez l'option var="rowBalance" puis <s:eval> imprimera le résultat de l'expression sur la sortie.

0 votes

C'est encore mieux ! pour les autres, vous pourriez fournir une chaîne de caractères dans la méthode statique en ajoutant \"the_string_argument\" (à la place de la partie row.balance). Ceci est seulement si votre méthode excepte les chaînes de caractères ;) A la vôtre !

3 votes

Vous pouvez passer des chaînes de caractères entre guillemets simples, par ex. 'the_string_argument' pas besoin de danser avec la fuite.

0 votes

Cool, ça a marché pour moi au printemps... Je me demandais s'il était possible de faire 2 classes... il suffit de préfixer la classe avec un T() je suppose... Ceci a fonctionné pour ce que je faisais : <s:eval expression="T(org.jsoup.Jsoup).clean(orig_text, T(org.jsoup.safety.Whitelist).none() )" var="text_stripped_html" /> équivalent à : String text_stripped_html = Jsoup.clean(orig_text, Whitelist.none()) ;

6voto

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 le souhaitez en utilisant le langage d'expression :

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

4voto

Lukas Points 81

Un haricot 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();
    }
}

0 votes

Je ne vois aucun mot-clé statique dans le code, sauf "Static" dans le nom de la classe.

2 votes

@UlukBiy, le Settings.reset() est un appel à une 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.

3voto

msangel Points 1716

EL 2.2 dispose d'un mécanisme intégré d'appel de méthodes. Plus d'informations ici : site oracle . Mais il n'a pas accès aux méthodes statiques. Bien que vous puissiez toujours les appeler via la référence de l'objet. Mais j'utilise une autre solution, décrite dans cet article : Appel d'une méthode statique depuis EL

1 votes

Je regrette que EL 2.2 n'ajoute pas vraiment un support intégré pour appeler une méthode statique. Les solutions sont basées sur la mise en place d'un bean dans les contextes de requête et les émulations (laides) d'une map + les paramètres nécessaires sont passés lors du déréférencement. Le fardeau supplémentaire de cette approche est que l'on doit masser le contexte de demande (par exemple dans <web-app> <filter> ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X