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

Joh*_*ohn 85 java jsp el

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

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

似乎无法在JSTL标记中插入scriptlet.

Bal*_*usC 126

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

对于失败的scriptlet尝试,您不能混合Scriptlet和EL.使用其中一个.由于小脚本劝阻了十多年,你应该坚持的EL-唯一的解决办法.

你已经基本上2个选项(假设两个balanceCalculate#getAmount()double).

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

    public double getAmount() {
        return Calculate.getAmount(balance);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    而是使用它:

    Amount: ${row.amount}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,声明Calculate#getAmount()为EL函数.首先创建一个/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>
    
    Run Code Online (Sandbox Code Playgroud)

    并使用如下:

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

  • @Sriram:首先,你确定你没有把JSP与HTML/JS混淆吗?你提出这个问题的方式表明你似乎认为JSP在webbrowser中运行,而这完全是不真实的.JSP是一个HTML/CSS/JS代码生成器.就这样.这应该会让你思考你的问题和方法. (7认同)

dma*_*a_k 58

另一种方法是使用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}
Run Code Online (Sandbox Code Playgroud)

如果跳过可选var="rowBalance",然后<s:eval>将打印的表达,输出的结果.

  • 你可以用单引号传递字符串,例如`'the_string_argument'` - 不需要与转义跳舞. (2认同)

小智 7

如果您的 Java 类是:

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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在 JSP 页面中调用静态方法“getStatusDesc”,如下所示。

使用 JSTL useBean 在 JSP 页面顶部获取类:

<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>
Run Code Online (Sandbox Code Playgroud)

然后使用表达式语言在您需要的地方调用函数:

<table>
    <td>${cmnUtilFunc.getStatusDesc('A')}</td>
</table>
Run Code Online (Sandbox Code Playgroud)