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

我是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标签中插入scriptlet是不可能的。

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

至于你失败的脚本尝试,你不能混合脚本和EL。 使用这一个或另一个。 由于脚本十年不鼓励 ,你应该坚持只有EL的解决scheme。

你基本上有2个选项(假设balanceCalculate#getAmount()double )。

  1. 只是将其包装在实例方法中。

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

    并用它来代替:

     Amount: ${row.amount} 

  2. 或者,将Calculate#getAmount()声明为EL函数。 首先创build一个/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)}"> 

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

像StaticInterface这样的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(); } } 

EL 2.2具有build立调用方法的机制。 更多这里: oracle网站 。 但它没有访问静态方法。 虽然你可以stil调用它是通过对象引用。 但是我使用了另一个解决scheme,在本文中描述: 从EL调用静态方法

根据@Lukas的回答,你可以使用这个bean并通过reflection调用方法:

 @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转换为命令button:

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

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

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

然后在html或html标签属性中引用'myVar'作为${myVar}

在Struts2或Webwork2中,你可以使用这个:

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

然后在你的jsp中引用#tourLanguage