如何在 JSP/EL 中调用静态方法?

2022-08-31 11:20:51

我是 JSP 的新手。我尝试连接MySQL和我的JSP页面,它工作正常。但这是我需要做的。我有一个名为“余额”的表属性。检索它并使用它来计算一个名为“金额”的新值。(我不是在打印“余额”)。

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

似乎不可能在 JSTL 标记中插入脚本。


答案 1

您不能直接在 EL 中调用静态方法,EL 只会调用实例方法。

至于失败的脚本小工具尝试,您不能混合使用脚本小脚本和 EL。使用一个或另一个。由于十多年来不鼓励使用脚本,因此您应该坚持使用仅限EL的解决方案。

您基本上有 2 个选项(假设两者都是 )。balanceCalculate#getAmount()double

  1. 只需将其包装在实例方法中即可。

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

    并用它来代替:

    Amount: ${row.amount}
    

  2. 或者,声明为 EL 函数。首先创建一个文件:Calculate#getAmount()/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>
    

    并按如下方式使用它:

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

答案 2

另一种方法是使用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}

如果跳过可选,则将打印表达式的结果以输出。var="rowBalance"<s:eval>