Как установить JSTL locale из Java-кода?

Я хочу установить локаль JSTL, которая используется <fmt:formatNumber> и друзей. Я знаю, что это возможно с <fmt:setLocale>, но мне нужно сделать это динамически (в зависимости от пользовательских данных, полученных из моей БД) и предпочел бы Java - код-класс фильтра, если быть точным.

Я думал, что Установка атрибута сеанса javax.servlet.jsp.jstl.fmt.locale до желаемого Locale экземпляр сделал бы трюк, но он игнорируется: теги JSTL продолжают использовать языковой стандарт браузера.

Я проверил, что нет контекста страницы или атрибуты с одинаковым именем.

так что я делаю не так? Или мне действительно нужно сделать это из JSP?

читая код JSTL, я нашел ссылки на LocalizationContext и думаю, что мне нужно установить один. Однако я не мог точно понять, как он вписывается в картину или как ее установить.

5 ответов


вам нужна 2-я:

3 способа установить локаль JSTL: /а также набор ресурсов приложения по умолчанию, часовой пояс и источник данных/

  1. Set с помощью действия JSTL-это позволяет определять область по атрибуту scope.

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. установить программно-позволяет спецификацию области через 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. установлен контекст инициализация Параметры-задает значение, используемое, если параметр не найден ни в одной из стандартных областей.

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

jstl-быстрая ссылка (PDF)


вы можете просто использовать 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.сервлет.JSP-страница.тегов JSTL.формат.locale " переопределяется языковым стандартом браузера. JSTL использует локаль браузера, и если это не найдено, он использует резервную локаль. Таким образом, вы можете установить атрибут запроса, чтобы указать эту локаль. Добавьте эту строку в контроллер

request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");

использование этого установит локаль, которую будет использовать JSTL. Примечание .запрос в имени атрибута, если вы установите этот атрибут в другую область, вам придется использовать другой суффикс. Для HttpSession суффикс .сеанс, для ServletContext суффикс .применение


Если вы зависите от данных из БД, может быть, есть лучший способ вставить эту логику в ваш 'router' или 'controller' (зависит от того, какую структуру вы используете). Просто расширьте url с параметром ?lang='en'

надеюсь, что это помогает


есть другой способ. В сервлете вы можете установить локаль, создав атрибут сеанса, например:

request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");