<fmt:formatNumber>
とその仲間たちが使うJSTLロケールを設定したい。これは<fmt:setLocale>
で可能であることはわかっていますが、動的に行う必要があり(DBから取得したユーザーデータに応じて)、Javaコード-フィルタークラスである正確。
セッション属性javax.servlet.jsp.jstl.fmt.locale
を目的のLocale
インスタンスに設定することでうまくいくと思いましたが、無視されます。JSTLタグはブラウザのロケールを使用し続けます。
同じ名前のページコンテキストまたはリクエスト属性がないことを確認しました。
だから私は何が間違っているのですか?それとも、JSPから本当に行う必要がありますか?
JSTLコードを読んで、LocalizationContext
への参照を見つけ、それを設定する必要があると思いました。しかし、それがどのように写真に収まるのか、またはどのように設定するのかを正確に理解することはできませんでした。
あなたは2番目が必要です:
JSTLロケールを設定する3つの方法:/およびデフォルトのアプリケーションリソースバンドル、タイムゾーン、データソース/
JSTLアクションによって設定されます–これにより、スコープ属性によるスコープの指定が可能になります。
<fmt:setLocale value="en_US" scope="session"/>
プログラムで設定– ConfigAPIを介してスコープを指定できます。
import javax.servlet.jsp.jstl.core.Config;
(...)
Config.set( session, Config.FMT_LOCALE, new Java.util.Locale("en", "US") )
// or Locale.forLanguageTag("en-US") (Java 1.7 and later)
Context初期化パラメーターによって設定–標準スコープのいずれにも設定が見つからない場合に使用される値を指定します。
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en_US</param-value>
</context-param>
ELは_<fmt:setLocale>
_で使用できます。ハードコードされた値などである必要はありません。
次に例を示します。
_<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
_
言語がlanguage
という名前のリクエストパラメータとして提供された場合、それが設定されます。それ以外の場合、言語が以前に属性名language
によってセッションで設定されている場合は、代わりにそれに固執します。それ以外の場合は、リクエストヘッダーでユーザー指定のロケールを使用します。
フィルタコードでsession.setAttribute("language", language)
を実行すると、リクエストパラメータが設定されていない場合に使用されます。
私の知る限り、「javax.servlet.jsp.jstl.fmt.locale」はブラウザのロケールによって上書きされます。 JSTLはブラウザのロケールを使用し、それが見つからない場合はフォールバックロケールを使用します。したがって、リクエスト属性を設定してそのロケールを指定できます。この行をコントローラーに追加します
request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");
これを使用すると、JSTLが使用するロケールが設定されます。属性名の。requestに注意してください。この属性を他のスコープに設定する場合は、別のサフィックスを使用する必要があります。 HttpSessionの場合、サフィックスは。sessionであり、ServletContextの場合、サフィックスは。applicationです。
別の方法があります。サーブレットでは、次のようにセッション属性を作成してロケールを設定できます。
request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");
DBからのデータに依存している場合は、このロジックを'router'
または'controller'
に挿入するより良い方法があるかもしれません(使用しているフレームワークによって異なります)。パラメータ?lang='en'
でURLを拡張するだけです
お役に立てれば