独自のJSPタグ本体を定義します
-
27-10-2019 - |
質問
最近、カスタムタグの作成に関する知識を得ることにしました。問題があります。
私の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>
ご覧のとおり、この構造は正しいリソースバンドルを設定します。
ですから、このコードを1つのタグを締めくくり、使用する可能性があるかどうかを知りたいです(別の方法があることはわかっています - このコードを個々の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);
}
}
コンパイルしますが、正しく何もしません。
解決
いいえ、それはうまくいきません。なぜなら、ボディの含有量がJSPコンパイラによっても処理されるという期待はないからです。むしろ、FMT:SetBundle自分をタグ内に実装する必要があります。
JSPタグファイルが簡単になります。運用上、あなたが言及したことからそれほど遠くないことではありませんが、このようなリファクタリングを本当に些細なことにします。
ここに拡張例があります: JSPがテンプレートを簡単にするためのトリックですか?
他のヒント
そのようなカスタムタグ(つまり、Javaクラスで作成されたもの)内で他のJSPタグを使用することはできません。ただし、JSPページを定義するように、カスタムタグを定義できる「タグファイル」を作成できます。これがあなたを始めるためのリンクです: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/jsptags5.html.
しかし、あなたがやろうとしていることは、他のことがあなたのためにできるべきことのように見えます。アプリで春を使用していますか?もしそうなら、SpringのMessagesourceとLocaleresolverを見ることを検討してください。
これに取り組む最良の方法は、 サーブレットフィルター. 。フィルターは、すべての要求をインターセプトし、要求スコープで属性を設定できます。に相当するJava fmt:bundle
タグは次のようなものです:
Config.set(request, Config.FMT_LOCALE, "ru_RU")