web-dev-qa-db-de.com

Wie rufe ich eine statische Methode in JSP / EL auf?

Ich bin neu bei JSP. Ich habe versucht, MySQL und meine JSP-Seiten zu verbinden, und es funktioniert einwandfrei. Aber hier ist, was ich tun musste. Ich habe ein Tabellenattribut namens "balance". Rufen Sie es ab und verwenden Sie es, um einen neuen Wert mit der Bezeichnung "Betrag" zu berechnen. (Ich drucke kein "Guthaben").

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

Es scheint nicht möglich zu sein, Scriptlets in JSTL-Tags einzufügen.

81
John

Sie können statische Methoden nicht direkt in EL aufrufen. EL ruft nur Instanzmethoden auf.

Bezüglich Ihres fehlgeschlagenen scriptlet Versuchs können Sie scriptlets und EL nicht mischen. Verwenden Sie das eine oder andere. Da scriptlets über ein Jahrzehnt entmutigt sind, sollten Sie sich an eine EL-only-Lösung halten.

Sie haben grundsätzlich zwei Möglichkeiten (vorausgesetzt, dass sowohl balance als auch Calculate#getAmount()double sind).

  1. Wickeln Sie es einfach in eine Instanzmethode.

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

    Und benutze es stattdessen:

    Amount: ${row.amount}
    

  2. Oder deklarieren Sie Calculate#getAmount() als EL-Funktion. Erstellen Sie zuerst eine /WEB-INF/functions.tld - Datei:

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

    Und benutze es wie folgt:

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

Ein anderer Ansatz ist die Verwendung von 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}

Wenn Sie das optionale var="rowBalance" Überspringen, gibt <s:eval> Das Ergebnis des auszugebenden Ausdrucks aus.

56
dma_k

Wenn Ihre Java Klasse ist:

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";
        }
    }
}

Dann können Sie die statische Methode 'getStatusDesc' wie unten auf der JSP-Seite aufrufen.

Verwenden Sie JSTL useBean, um class oben auf der JSP-Seite abzurufen:

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

Rufen Sie dann mit Expression Language die gewünschte Funktion auf:

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

Bean wie StaticInterface kann ebenfalls verwendet werden

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

und Bohne

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 verfügt über einen eingebauten Mechanismus zum Aufrufen von Methoden. Mehr hier: Oracle-Site . Es hat jedoch keinen Zugriff auf statische Methoden. Sie können es jedoch auch über die Objektreferenz aufrufen. Aber ich verwende eine andere Lösung, die in diesem Artikel beschrieben wird: Aufrufen einer statischen Methode von EL

3
msangel

Basierend auf der @ Lukas-Antwort können Sie diese Bean- und Call-Methode durch Reflektion verwenden:

@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, in eine Befehlsschaltfläche zum Beispiel:

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

Wenn Sie struts2 verwenden, können Sie verwenden

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

und dann referenziere 'myVar' in html oder html tag attribute als ${myVar}

2
dhblah

In Struts2 oder Webwork2 können Sie Folgendes verwenden:

<s:set name="tourLanguage" value="@[email protected](#name)"/>

Dann referenziere #tourLanguage in deinem 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>

In dieser Lösung weisen wir einer Variablen einen Wert (Through Core-Tag) zu und rufen dann den Wert dieser Variablen im Scriplet ab.

0
ash9