45

JSTL/EL を使用して、JSP から Java クラスで定義された引数を持つ Java メソッドを呼び出す方法。メソッドは配列を返しています。任意の戻り値を使用できます。

4

4 に答える 4

64

web.xml宣言された適合サーブレット3.0を使用してサーブレット3.0互換コンテナ(Tomcat 7、Glassfish 3、JBoss AS 6など)をターゲットにして実行している場合にのみ、ELで引数を使用してメソッドを呼び出すことができます。このサーブレットバージョンには、引数を使用して任意のインスタンスメソッドを呼び出すことができるEL2.2が付属しています。

${bean}のようなメソッドを持つクラスのインスタンスを参照するスコープ内にいると仮定すると、次のようpublic Object[] getArray(String key)に実行できるはずです。

<c:forEach items="${bean.getArray('foo')}" var="item">
    ${item} <br />
</c:forEach>

または引数として別の変数を使用する場合でも

<c:forEach items="${bean.getArray(foo)}" var="item">
    ${item} <br />
</c:forEach>

ただし、サーブレット3.0コンテナを対象としない場合は、ELで引数を使用してメソッドを呼び出すことはできません。最善の策は、Duffymoによって提案されているように、前処理サーブレットでジョブを実行することです。

Object[] array = bean.getArray("foo");
request.setAttribute("array", array);
// ...

まったく別の方法として、メソッド呼び出しを委任するEL関数を作成できます。このブログの下部近くにキックオフの例があります。あなたは次のようなものになりたいです:

<c:forEach items="${util:getArray(bean, 'foo')}" var="item">
    ${item} <br />
</c:forEach>

public static Object[] getArray(Bean bean, String key) {
    return bean.getArray(key);
}
于 2011-08-19T13:57:23.400 に答える
4

上記の解決策は私にはうまくいきませんでした。getRemitanceProfileInformation(user)Javaクラスに関数がありました 。Javaクラスのusebeanを作成してから呼び出しました

<c:set var="paymentValueCode" value='remittanceaddr.getRemitanceProfileInformation("${user}")'/>

そしてそれはうまくいった。

于 2012-05-25T17:05:18.993 に答える
2

メソッドを持つクラスのインスタンスへの参照を JSP に与え、それを呼び出します。

おそらく、誰が JSP にそのインスタンスを与えるのかと尋ねているでしょう。これは、モデル 2 MVC 配置のサーブレットです。

フローの仕組みは次のとおりです。

  1. JSP からサーブレットに GET/POST リクエストを送信します。
  2. サーブレットはその要求に応じて動作し、JSP に代わっていくつかの作業を行います。必要なすべてのオブジェクトをリクエスト、セッション、またはその他の適切なスコープに入れます。
  3. サーブレットは、次の JSP に応答をルーティングします。これは、要求元の JSP と同じである可能性があります。
  4. すすぎ、繰り返します。
于 2011-08-19T12:09:59.360 に答える
0

JSFを使用している場合は、BeanをView Scopeのモデルとして使用し、データソースから自動的にロードできます。また、JSPを使用している場合は、TLDタグを使用してみてはどうでしょうか。そしてJSTLタグを使用してい<c:foreach>ますか?セッションに保存することからメモリを節約しますか、それともセッションに保存してロードイベントが完了したときにそれを削除しますか?このようなもの(JSTL + TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p">
     Product name: ${p.productName}
</c:forEach>
于 2011-08-19T12:16:45.313 に答える