2009-03-28 18 views
5

私はJava Webアプリケーションを書くときに、私は通常JSTLタグを使います。私は、これらのタグは、私を怒らせるものを除いて、素晴らしいものだと思います。表現言語ではBeanのプロパティにアクセスできますが、そのメソッドを呼び出すことはできません。ELのメソッド呼び出し

リリース1.0では、文字列の長さやコレクション内の要素数を取得することさえできませんでした。リリース1.1の時点で、FN:あなたは物事を行うことができますので、長さ機能は、このような追加されました:

よりも(つまり私見)より冗長多くの醜いです
... 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
... 
<c:if test="${fn:length(str) > 10}"> 
    ... 
</c:if> 
... 

... 
<c:if test="${str.length() > 10}"> 
    ... 
</c:if> 
... 

JSTL 2.0では新しい関数を定義することができますが、(静的な)メソッドを定義するための特別なクラスを作成する必要があります。また、そのメソッドを定義するTLDファイルも作成する必要があります。これらの機能を使用するすべてのJSPに組み込むことができます。

カスタム関数を定義する場合でも、別の回避策を使用する場合でも、追加のコードを書く必要があります。

私は、JCPが表現言語からメソッドを呼び出すことを自発的に許可していなかったと読んでいます。

誰かが私たちにこれをやっているJCPの理由を理解するのを助けることができますか?

+0

これはいつも私の麺を完全に焼いたものです。なぜこれがELで許されないのか理解できない –

答えて

3

希望する機能は、JSR 245more here)で定義されています。今すぐご希望の場合は、UEL projectまたは別の実装(例:JUEL)からダウンロードしてください。それが標準の一部であるのを待つ必要がある場合、それはJEE6に含まれます。それまで...まあ、あなたはすでにあなたのオプションを知っています。

0

StringTemplateのように、厳密なモデルビュー分離を実行することが目標だと思います。

アイデアはかなりシンプルです。メソッドにアクセスできない場合は、コントローラ内のすべてのデータを計算し、ビューでフォーマットするだけです。もちろん、それらは関数へのアクセスを許可することでメッセージを混乱させました。タプルのマップのリスト(クラスなしで構造化されたデータを読み込みます)をJavaでそのまま組み立てるのは簡単ではないという事実によって助けられませんでしたPython、Rubyなど

とにかく、arbitrary methodsと呼ぶことができるタグを書いている記事は、参考になるかもしれません。

+0

これはまだできません。さらに、IMHOはモデルに可視性を持たせ、他の方法では可視性を持たなくてはならない一方で、モデルはビューで何が行われているかを認識させることがよくあります。 –

+0

直接操作とは対照的に、MVCのビューの主なポイントは、SQLのビューが複数の表に結合してフィルタリングできるように、ビューにはモデルを変換するロジックがあることです。それをテンプレートエンジンに制限することは不吉なことです。 –

4

あなたが私にこれをやっているJCPの理由を理解するのを助けてくれる人はいますか?

これは、誰もがアプリケーションを作成するべき真の方法を知っているJavaプログラマーの特定のサブセットの考え方の一部です。

テンプレートを書くときに自由にフルパワーの言語を使用することは信頼できません。ビジネスロジックやプレゼンテーションを悪用して混乱させる可能性があるためです。 Eurgh、想像して!

プログラマーは敵であり、悪をすることを防ぐ必要があります。プログラマが実際に何かをデバッグしようとしていることや、アプリを一時的に稼動させるために簡単にハックしていることが判明するかもしれません。あるいは、プレゼンテーションロジックのようなものがあるとわかるかもしれませんし、アプリケーション内のたくさんのタグとBeanクラスにそのようなものを移動させることは、他の方法と同じように不愉快です。

でも問題ありません。 Javaの純潔を守る目的を果たすことに不便を感じることがあります。

[スナークのため申し訳ありませんが、それはすでにかなりranty質問EHた。]

PS。私が推測するのはいつものGroovyです。

+1

LOL。私はあなたのユーモアに感謝します –

2

Seamをご覧ください! Seamを使用すると、ELはそれがすべき方法になりました。パラメータを指定してもメソッドを呼び出すと、微風のように機能します。