web-dev-qa-db-ja.com

JSP / ELで静的メソッドを呼び出す方法

JSPは初めてです。 MySQLとJSPページを接続しようとしましたが、うまくいきます。しかし、ここに私がする必要があります。 「balance」というテーブル属性があります。それを取得し、それを使用して「量」と呼ばれる新しい値を計算します。 (私は「バランス」を印刷していません)。

 <c:forEach var="row" items="${rs.rows}">
        ID: ${row.id}<br/>
        Passwd: ${row.passwd}<br/>
        Amount: <%=Calculate.getAmount(${row.balance})%>
 </c:forEach>

JSTLタグ内にスクリプトレットを挿入することはできないようです。

81
John

ELで静的メソッドを直接呼び出すことはできません。 ELはインスタンスメソッドのみを呼び出します。

失敗したscriptletの試みについては、scriptletsとELを混在させることはできません。どちらかを使用してください。 scriptletsは10年以上 discouraged なので、ELのみのソリューションに固執する必要があります。

基本的に2つのオプションがあります(balanceCalculate#getAmount()の両方がdoubleであると仮定します)。

  1. インスタンスメソッドでラップするだけです。

    _public double getAmount() {
        return Calculate.getAmount(balance);
    }
    _

    代わりにそれを使用してください:

    _Amount: ${row.amount}
    _

  2. または、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)}">
    _
126
BalusC

別のアプローチは、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>は式の結果を出力します。

56
dma_k

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>
4

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();
    }
}
4
Lukas

EL 2.2には、メソッドを呼び出す組み込みのメカニズムがあります。詳細: Oracleサイト 。ただし、静的メソッドにはアクセスできません。あなたはそれをオブジェクトスタイル経由で呼び出すことができますが。しかし、この記事で説明されている別のソリューションを使用します: ELから静的メソッドを呼び出す

3
msangel

@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"/>
2
Juan

Struts2を使用している場合は、使用できます

<s:var name='myVar' value="%{@package.prefix.MyClass#myMethod('param')}"/>

htmlまたはhtmlタグ属性の「myVar」を${myVar}として参照します

2
dhblah

Struts2またはWebwork2では、これを使用できます。

<s:set name="tourLanguage" value="@foo.bar.TourLanguage@getTour(#name)"/>

次に、#tourLanguageあなたのjsp

0
sendon1982
<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で取得しています。

0
ash9