Anda tidak dapat memanggil metode statis secara langsung di EL. EL hanya akan memanggil metode instance.
Mengenai percobaan scriptlet Anda yang gagal , Anda tidak dapat mencampur scriptlet dan EL. Gunakan yang satu atau yang lainnya. Karena scriptlet tidak dianjurkan selama lebih dari satu dekade, Anda harus tetap menggunakan solusi khusus EL.
Anda pada dasarnya memiliki 2 opsi (dengan asumsi keduanya balance
dan Calculate#getAmount()
adalah double
).
Bungkus saja dalam metode instance.
public double getAmount() {
return Calculate.getAmount(balance);
}
Dan gunakan sebagai gantinya:
Amount: ${row.amount}
Atau, nyatakan Calculate#getAmount()
sebagai fungsi EL. Pertama buat /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>
Dan gunakan sebagai berikut:
<%@taglib uri="http://example.com/functions" prefix="f" %>
...
Amount: ${f:calculateAmount(row.balance)}">
Pendekatan lain adalah dengan menggunakan 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}
Jika Anda melewatkan opsional
var="rowBalance"
maka<s:eval>
akan mencetak hasil ekspresi ke output.sumber
'the_string_argument'
- tidak perlu menari dengan melarikan diri.Jika kelas Java Anda adalah:
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"; } } }
Kemudian Anda dapat memanggil metode statis 'getStatusDesc' seperti di bawah ini di halaman JSP.
Gunakan JSTL useBean untuk mendapatkan kelas di bagian atas halaman JSP:
<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>
Kemudian panggil fungsi di mana Anda perlu menggunakan Expression Language:
<table> <td>${cmnUtilFunc.getStatusDesc('A')}</td> </table>
sumber
Bean seperti StaticInterface juga dapat digunakan
<h:commandButton value="reset settings" action="#{staticinterface.resetSettings}"/>
dan kacang
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(); } }
sumber
Settings.reset()
adalah pemanggilan metode statis. Lukas mengusulkan untuk membuat ManagedBean mirip pembungkus dengan metode non-statis untuk setiap metode statis, yang ingin dipanggil dari EL. Itu solusi yang valid.EL 2.2 memiliki mekanisme inbuild dari metode pemanggilan. Lebih lanjut di sini: situs oracle . Tetapi tidak memiliki akses ke metode statis. Meskipun Anda masih dapat menyebutnya melalui referensi objek. Tetapi saya menggunakan solusi lain, yang dijelaskan dalam artikel ini: Memanggil Metode Statis Dari EL
sumber
<web-app> → <filter>
).Jika Anda menggunakan struts2, Anda bisa menggunakan
<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>
dan kemudian mereferensikan 'myVar' dalam atribut tag html atau html sebagai
${myVar}
sumber
Berdasarkan jawaban @Lukas Anda dapat menggunakan metode kacang dan panggilan itu dengan refleksi:
@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, menjadi tombol perintah misalnya:
<p:commandButton action="#{staticCaller.call('org.company.Calculate', 'getAmount', row.balance)}" process="@this"/>
sumber
SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost/127.0.0.1:8080-5) java.lang.IllegalArgumentException: wrong number of arguments
.<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>
Dalam solusi ini, kami menetapkan nilai (Melalui tag inti) ke variabel dan kemudian kami mengambil nilai variabel tersebut dalam skrip.
sumber
Di Struts2 atau Webwork2, Anda dapat menggunakan ini:
<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>
Kemudian referensi
#tourLanguage
di jsp Andasumber