12

JSP EL (Expression Language) に沿って、スタンドアロン アプリケーションでメッセージをテンプレート化/フォーマットするためのフレームワークを推奨できる人はいますか?

ある種のオブジェクトをインスタンス化し、次の行に沿ってテンプレートを与えることができると期待しています

Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}

パラメータ オブジェクトの値ディクショナリを含むコンテキストを提供します (この場合、'customer' という名前の Customer 型のオブジェクトと、'order' という名前の Order 型のオブジェクト)。

多くのテンプレート フレームワークが存在することは知っていますが、その多くは Web アプリケーションのコンテキスト外で動作しますが、これを大きな重量のテンプレート フレームワークとは考えていません。Java がすでに提供している基本的なメッセージ形式機能の改良版

たとえば、次のようなテンプレート (または「パターン」と呼ばれる) を使用して、java.text.MessageFormat で上記を実現できます。

Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}

そして、呼び出し元の Java プログラムで Object 配列を渡すことができます

new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };

ただし、この使用法では、コードとパターンは密接に関連しています。リソース・プロパティー・ファイルにパターンを入れることもできますが、コードとパターンは互いの詳細を知る必要があります。EL のようなシステムでは、コードとパターンの間のコントラクトははるかに高いレベル (たとえば、customer.firstName と order.estimatedDispatchDate ではなく、customer と order) になり、構造、順序、およびコンテンツの変更が容易になります。コードを変更せずにメッセージの。

4

10 に答える 10

12

Universal Expression Language 自体をそのまま使用できます。実装が必要です (ただし、選択できるものはいくつかあります)。その後、ELResolver、FunctionMapper、VariableMapper の 3 つのクラスを実装する必要があります。

Java: using EL outside J2EEというブログ投稿でその方法を説明しています。

于 2008-09-18T11:46:30.367 に答える
4

StringTemplateは、Velocity と Freemarker のより軽量な代替手段です。

于 2008-09-23T16:38:06.043 に答える
3

Apache Velocityを調べることをお勧めします。とてもシンプルで軽量です。

現在、電子メール テンプレートに使用しており、非常にうまく機能しています。

于 2008-09-18T11:28:09.350 に答える
2

I would go for the Spring Expression language:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html

A few examples which demonstrate the power (the first two are from the documentation):

int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);

String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);

// weekday is a String, e.g. "Mon", time is an int, e.g. 1400 or 900
{"Thu", "Fri"}.contains(weekday) and time matches '\d{4}'

Expressions can also use object properties:

public class Data {
    private String name; // getter and setter omitted
}

Data data = new Data();
data.setName("John Doe");

ExpressionParser p = new SpelExpressionParser();
Expression e = p.parseExpression("name == 'John Doe'");
Boolean r = (Boolean) e.getValue(data); // will return true

e = p.parseExpression("Hello " + name + ", how are you ?");
String text = e.getValue(data, String.class); // text will be "Hello John Doe, how are you ?"
于 2015-02-22T20:45:34.713 に答える
2

Java EE の外部で EL 自体を使用するというアイデアは、Ed Burns によって提唱され、The Server Sideで議論されました。Tomcats の実装は別の JAR で出荷されますが、サーバーの外で使用できるかどうかはわかりません。

于 2008-09-18T11:44:58.080 に答える
2

jspと非常によく似た使いやすいCasperを使用できます:Casper

于 2010-12-12T19:04:47.070 に答える
1

Re: Jasper と Juel は 1.5 用にビルドされています: その後、RetroTranslator ( http://retrotranslator.sourceforge.net/ ) を発見しました。一度逆翻訳すると、EL と Jasper は魅力的に機能します

于 2008-09-25T10:49:02.123 に答える
1

あなたが探している種類のライブラリであるOGNLを見たいと思うかもしれません。OGNL はかなり強力で、 WebWork Web フレームワークで使用される式言語です。

于 2008-09-18T11:29:28.100 に答える
0

ああ。一方、MessageFormat を使用すると、次のことができます

Dear {0}. Your order will be dispatched on {1,date,EEE dd MMM yyyy}

ここで、パラメーター #1 は Date オブジェクトであり、パターンに従ってフォーマットされます。EL には同等のものはありません。

JSP では、おそらく format タグを使用していたでしょう。このスタンドアロンの例では、式を評価する前に、コード内で日付を文字列としてフォーマットする必要があります。

于 2008-09-25T12:33:29.407 に答える
0

Freemarker はまさにあなたが必要とすることを行います。これは、JSP と非常によく似た構文を持つテンプレート エンジンです。

http://freemarker.org/

于 2008-09-18T11:49:51.467 に答える