0

最近、カスタム タグの作成に関する知識を習得することにしました。そして問題があります。

私の Web アプリでは、いくつかの JSTL タグを使用し、すべての JSP ページで同じコードを使用しています。

<c:if test="${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}" >
    <fmt:setBundle basename="locale_ru_RU" />
</c:if>
<c:if test="${sessionScope.locale == 'locale_en_US'}">
    <fmt:setBundle basename="locale_en_US" />
</c:if>

ご覧のとおり、この構造は正しいリソース バンドルを設定します。

したがって、このコードをまとめて、代わりに単一のタグを使用する可能性があるかどうかを知りたいです (別の方法があることはわかっています。このコードを個々の JSP ページに配置し、 <%@ include % を使用するだけです)。 > ディレクティブですが、タグを試してみたいです)?

私が理解しているように、何らかの方法でボディコンテンツを設定し(JSPからではなくタグクラス内に)、それを実行するコンテナを作成する必要がありますが、それに関する例は見つかりません。

私が今持っているもの:

tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib   xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 version="2.0">
<tlib-version>1.0</tlib-version>
<tag>
    <name>setLocale</name>
    <tag-class>com.test.tags.LocaleBundleTag</tag-class>
    <body-content>empty</body-content>
</tag>
</taglib>

そして私のタグ:

public class LocaleBundleTag extends BodyTagSupport {

@Override
public void setBodyContent(BodyContent b) {

    try {
        b.clear();
        b.append("<c:if test=\"${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}\" >");
        b.append("<fmt:setBundle basename=\"locale_ru_RU\" />");
        b.append("</c:if>");
        b.append("<c:if test=\"${sessionScope.locale == 'locale_en_US'}\">");
        b.append("<fmt:setBundle basename=\"locale_en_US\" />");
        b.append("</c:if>");
    } catch (IOException e) {
    }

    super.setBodyContent(b);
}
}

コンパイルはしますが、正しく何もしません。

4

3 に答える 3

1

いいえ、それは機能しません。なぜなら、本文のコンテンツも JSP コンパイラによって処理されるとは考えられないからです。むしろ、タグ内に fmt:setBundle を自分で実装する必要があります。

JSP タグ ファイルの方が簡単です。操作上は、あなたが言及したインクルードからそれほど離れていませんが、このようなリファクタリングは本当に簡単になります。

ここに拡張された例があります: JSP トリックでテンプレートを簡単に作成できますか?

于 2011-09-06T21:06:00.670 に答える
0

これに取り組む最善の方法は、サーブレット フィルタを使用することです。フィルターはすべてのリクエストをインターセプトし、リクエスト スコープで属性を設定できます。fmt:bundleタグに相当する Javaは次のようなものです。

Config.set(request, Config.FMT_LOCALE, "ru_RU")
于 2011-09-06T21:18:17.623 に答える
0

そのようなカスタムタグ (つまり、Java クラスで作成されたもの) 内で他の JSP タグを使用することはできません。ただし、JSP ページを定義するのとほとんど同じように、カスタム タグを定義できる「タグ ファイル」を作成できます。開始するためのリンクは次のとおりです: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags5.html

しかし、あなたがやろうとしていることは、他の何かがあなたのためにできるはずのことのように見えます. アプリで Spring を使用していますか? もしそうなら、Spring の MessageSource と LocaleResolver を見ることを検討してください。

于 2011-09-06T21:03:26.857 に答える