Как вызвать статический метод в 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.
8 ответов:
вы не можете вызывать статические методы непосредственно в EL. EL будет вызывать только методы экземпляра.
Что касается вашего провала сценарий попытка, вы не можете смешать сценарии и Эл. Используйте то или другое. Так как сценарии are уныние более десяти лет вы должны придерживаться решения EL-only.
у вас есть в основном 2 варианта (предполагая, что оба
balance
иCalculate#getAmount()
естьdouble
).
просто оберните его в метод экземпляра.
public double getAmount() { return Calculate.getAmount(balance); }
и использовать это вместо этого:
Amount: ${row.amount}
или объявить
Calculate#getAmount()
как функция EL. Сначала создайте/WEB-INF/functions.tld
file:<?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>
выведет результат выражения для вывода.
Боб, как StaticInterface также может быть использован
<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 имеет встроенный механизм вызова методов. Подробнее здесь: сайт oracle. Но он не имеет доступа к статическим методам. Хотя вы все еще можете вызвать его через ссылку на объект. Но я использую другое решение, описанное в этой статье:вызов статического метода из EL
Если вы используете struts2, вы можете использовать
<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>
а затем ссылка 'myVar' в HTML или HTML атрибут тега как
${myVar}
на основе ответа @Lukas вы можете использовать этот метод 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, в commandbutton например:
<p:commandButton action="#{staticCaller.call('org.company.Calculate', 'getAmount', row.balance)}" process="@this"/>
Если ваш класс 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"; } } }
затем вы можете вызвать статический метод "getStatusDesc", как показано ниже на странице JSP.
используйте JSTL useBean, чтобы получить класс в верхней части страницы JSP:
<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>
затем вызовите функцию, где вам требуется использовать язык выражений:
<table> <td>${cmnUtilFunc.getStatusDesc('A')}</td> </table>