java—如何在jsp/el中调用静态方法?

nle07wnf  于 2021-07-09  发布在  Java
关注(0)|答案(9)|浏览(329)

我不熟悉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>

似乎不可能在jstl标记中插入scriptlet。

eivnm1vs

eivnm1vs1#

也可以使用类似bean的静态接口

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

还有豆子

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

bjp0bcyl2#

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

在这个解决方案中,我们将值(通过核心标记)赋给一个变量,然后在scriplet中获取该变量的值。

v440hwme

v440hwme3#

在struts2或webwork2中,您可以使用:

<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>

然后参考 #tourLanguage 在jsp中

9udxz4iz

9udxz4iz4#

基于@lukas answer,您可以通过反射使用bean和call方法:

@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转换为命令按钮,例如:

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

6gpjuf905#

不能在el中直接调用静态方法。el将只调用示例方法。
至于您失败的scriptlet尝试,您不能将scriptlet和el混合使用。用这个或那个。由于Scriptlet在过去十年中一直不受欢迎,因此您应该坚持使用仅限el的解决方案。
你基本上有两个选择(假设两者都有) balance 以及 Calculate#getAmount()double ).
只需将其 Package 在一个示例方法中。

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

用它来代替:

Amount: ${row.amount}

或者,宣布 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>

使用方法如下:

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

i2byvkas6#

另一种方法是使用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> 将表达式的结果打印到输出。

wnavrhmk

wnavrhmk7#

el2.2具有调用方法的内置机制。更多:甲骨文网站。但它无法访问静态方法。尽管你仍然可以通过对象引用来调用它。但我使用另一种解决方案,如本文所述:从el调用静态方法

sg2wtvxw

sg2wtvxw8#

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

然后您可以在jsp页面中调用静态方法“getstatusdesc”,如下所示。
使用jstl usebean在jsp页面顶部获取类:

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

然后在需要时使用表达式语言调用函数:

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

z9gpfhce9#

如果你用的是struts2,你可以用

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

然后在html或html标记属性中引用“myvar”作为 ${myVar}

相关问题