javajstllocalesetlocale

How to set JSTL locale from Java code?


I want to set the JSTL locale which is used by <fmt:formatNumber> and friends. I know this is possible with <fmt:setLocale>, but I need to do it dynamically (depending on user data retrieved from my DB) and would prefer Java code - a filter class, to be precise.

I thought setting the session attribute javax.servlet.jsp.jstl.fmt.locale to my desired Locale instance would do the trick, but it is ignored: The JSTL tags keep using the browser locale.

I verified there are no page context or request attributes of the same name.

So what am I doing wrong? Or do I really need to do it from a JSP?

Reading the JSTL code, I found references to a LocalizationContext and think I need to set one. I couldn't quite figure out exactly how it fits into the picture or how to set one, though.


Solution

  • you need the 2nd:

    3 ways to set JSTL locale: /as well as default application resource bundle, time zone, and data source/

    1. Set by a JSTL action – this allows specification of scope by the scope attribute.

      <fmt:setLocale value="en_US" scope="session"/>
      
    2. Set Programmatically – allows specification of scope via the Config API.

      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)
      
    3. Set by Context Initialization Parameters – specifies value used if setting not found in any of the standard scopes.

      <context-param>
          <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
          <param-value>en_US</param-value>
      </context-param>
      

    jstl-quick-reference (PDF)