Je suis nouveau sur JSP. J'ai essayé de connecter MySQL et mes pages JSP et cela fonctionne bien. Mais voici ce que je devais faire. J'ai un attribut de table appelé "balance". Récupérez-le et utilisez-le pour calculer une nouvelle valeur appelée "montant". (Je n'imprime pas "balance").
<c:forEach var="row" items="${rs.rows}">
ID: ${row.id}<br/>
Passwd: ${row.passwd}<br/>
Amount: <%=Calculate.getAmount(${row.balance})%>
</c:forEach>
Il semble qu'il ne soit pas possible d'insérer des scriptlets dans les balises JSTL.
Vous ne pouvez pas appeler des méthodes statiques directement dans EL. EL n'invoquera que des méthodes d'instance.
En ce qui concerne votre tentative de scriptlet ayant échoué, vous ne pouvez pas mélanger des scriptlets et EL. Utilisez l'un ou l'autre. Puisque des scriptlets sont déconseillés sur une décennie, vous devez vous en tenir à une solution exclusivement EL.
Vous avez fondamentalement 2 options (en supposant que balance
et Calculate#getAmount()
sont double
).
Enveloppez-le simplement dans une méthode d'instance.
public double getAmount() {
return Calculate.getAmount(balance);
}
Et utilisez-le à la place:
Amount: ${row.amount}
Ou déclarez Calculate#getAmount()
en tant que fonction EL. Commencez par créer un fichier /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>
Et utilisez-le comme suit:
<%@taglib uri="http://example.com/functions" prefix="f" %>
...
Amount: ${f:calculateAmount(row.balance)}">
Une autre approche consiste à utiliser 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}
Si vous ignorez l'option var="rowBalance"
, Alors <s:eval>
Imprimera le résultat de l'expression à afficher.
Si votre classe Java est:
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";
}
}
}
Ensuite, vous pouvez appeler la méthode statique 'getStatusDesc' comme ci-dessous dans la page JSP.
Utilisez JSTL useBean pour obtenir une classe en haut de la page JSP:
<jsp:useBean id="cmnUtilFunc" class="com.test.ejb.util.CommonUtilFunc"/>
Ensuite, appelez la fonction à l'endroit souhaité avec Expression Language:
<table>
<td>${cmnUtilFunc.getStatusDesc('A')}</td>
</table>
Bean comme StaticInterface peut également être utilisé
<h:commandButton value="reset settings" action="#{staticinterface.resetSettings}"/>
et haricot
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 a un mécanisme inbuild de méthodes d'appel. Plus ici: site Oracle . Mais il n'a pas accès aux méthodes statiques. Bien que vous puissiez toujours appeler, c'est par référence d'objet. Mais j'utilise une autre solution, décrite dans cet article: Appel d'une méthode statique à partir d'EL
Basé sur la réponse de @Lukas, vous pouvez utiliser cette méthode d'appel et de haricot par réflexion:
@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, dans un bouton de commande par exemple:
<p:commandButton action="#{staticCaller.call('org.company.Calculate', 'getAmount', row.balance)}" process="@this"/>
Si vous utilisez struts2, vous pouvez utiliser
<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>
et référence ensuite 'myVar' dans l'attribut de balise html ou html comme ${myVar}
Dans Struts2 ou Webwork2, vous pouvez utiliser ceci:
<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>
Puis référence #tourLanguage
dans votre jsp
<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>
Dans cette solution, nous affectons une valeur (via une balise principale) à une variable, puis nous extrayons la valeur de cette variable dans scriplet.