Как установить JSTL locale из Java-кода?
Я хочу установить локаль JSTL, которая используется <fmt:formatNumber>
и друзей. Я знаю, что это возможно с <fmt:setLocale>
, но мне нужно сделать это динамически (в зависимости от пользовательских данных, полученных из моей БД) и предпочел бы Java - код-класс фильтра, если быть точным.
Я думал, что Установка атрибута сеанса javax.servlet.jsp.jstl.fmt.locale
до желаемого Locale
экземпляр сделал бы трюк, но он игнорируется: теги JSTL продолжают использовать языковой стандарт браузера.
Я проверил, что нет контекста страницы или атрибуты с одинаковым именем.
так что я делаю не так? Или мне действительно нужно сделать это из JSP?
читая код JSTL, я нашел ссылки на LocalizationContext
и думаю, что мне нужно установить один. Однако я не мог точно понять, как он вписывается в картину или как ее установить.
5 ответов
вам нужна 2-я:
3 способа установить локаль JSTL: /а также набор ресурсов приложения по умолчанию, часовой пояс и источник данных/
-
Set с помощью действия JSTL-это позволяет определять область по атрибуту scope.
<fmt:setLocale value="en_US" scope="session"/>
-
установить программно-позволяет спецификацию области через 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)
-
установлен контекст инициализация Параметры-задает значение, используемое, если параметр не найден ни в одной из стандартных областей.
<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.сервлет.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");