我是 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 标记中插入小脚本。
您不能直接在 EL 中调用静态方法。 EL 只会调用实例方法。
至于你失败的 scriptlet 尝试,你不能混合 scriptlet 和 EL。使用其中之一。由于 scriptlet discouraged 已有十年之久,因此您应该坚持仅使用 EL 的解决方案。
您基本上有 2 个选项(假设 balance
和 Calculate#getAmount()
都是 double
)。
只需将其包装在实例方法中即可。 public double getAmount() { return Calculate.getAmount(balance);并改用它: Amount: ${row.amount} 或者,将 Calculate#getAmount() 声明为 EL 函数。首先创建一个/WEB-INF/functions.tld 文件:
另一种方法是使用 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>
会将表达式的结果打印到输出。
'the_string_argument'
- 无需转义。
如果您的 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>
也可以使用像 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();
}
}
Settings.reset()
是一个静态方法调用。 Lukas 建议创建一个类似包装器的 ManagedBean,其中每个静态方法都有一个非静态方法,人们想从 EL 调用它。这是一个有效的解决方案。
EL 2.2 具有调用方法的内置机制。更多信息:oracle site。但它无法访问静态方法。尽管您仍然可以通过对象引用来调用它。但我使用本文中描述的另一种解决方案:Calling a Static Method From EL
<web-app> → <filter>
中)。
如果你使用 struts2,你可以使用
<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>
然后将 html 或 html 标记属性中的“myVar”引用为 ${myVar}
基于@Lukas的回答,您可以使用该bean并通过反射调用方法:
@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"/>
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>
在这个解决方案中,我们将值(通过核心标签)分配给一个变量,然后我们在 scriplet 中获取该变量的值。
在 Struts2 或 Webwork2 中,你可以使用这个:
<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>
然后在您的 jsp 中引用 #tourLanguage