저는 JSP를 처음 사용합니다. MySQL과 내 JSP 페이지를 연결하려고 시도했는데 제대로 작동합니다. 그러나 여기에 내가해야 할 일이 있습니다. “균형”이라는 테이블 속성이 있습니다. 이를 검색하여 “amount”라는 새 값을 계산하는 데 사용합니다. (저는 “잔액”을 인쇄하지 않습니다).
<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은 인스턴스 메서드 만 호출합니다.
실패한 스크립틀릿 시도에 관해서는 스크립틀릿 과 EL을 혼합 할 수 없습니다 . 둘 중 하나를 사용하십시오. 이후 스크립틀릿이 되는 낙담 십 년 동안, 당신은 EL 전용 솔루션에 충실해야한다.
당신은 기본적으로 2 가지 옵션이 있습니다 (두 가정을 balance
하고 Calculate#getAmount()
있습니다 double
).
-
인스턴스 메소드로 감싸십시오.
public double getAmount() { return Calculate.getAmount(balance); }
대신 사용하십시오.
Amount: ${row.amount}
-
또는
Calculate#getAmount()
EL 함수로 선언하십시오 . 먼저/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>
출력 할 표현식의 결과가 인쇄됩니다.
답변
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"/>
그런 다음 Expression Language를 사용하여 필요한 곳에 함수를 호출하십시오.
<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();
}
}
답변
EL 2.2에는 메서드를 호출하는 inbuild 메커니즘이 있습니다. 더 많은 곳 : oracle site . 그러나 정적 메서드에는 액세스 할 수 없습니다. 여전히 호출 할 수 있지만 객체 참조를 통해입니다. 하지만이 기사에서 설명한 다른 솔루션을 사용합니다. EL에서 정적 메서드 호출
답변
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"/>