How to set JSTL locale from Java code?

Jens Bannmann picture Jens Bannmann · May 25, 2011 · Viewed 27.2k times · Source

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.

Answer

monsterclub picture monsterclub · Mar 31, 2012

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)