Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF & динамическое значение из bundle


Автор: MisterCleric 20.10.2009, 16:49
Привет, господа!
Давно я вопросы тут не задавал...
Ну да ладно - поехали.

Собственно есть страничка на JSF.  что-то типа такого:
dataTable, который рисует строки по результату запроса, т.е. перебирает колекцию.
И в одной из колонок мне нужно нарисовать динамический текст.
Вот
Код

<h:outputText value="#{_statistics.criteriaType > 2 ? _statistics.criteriaName : bundle.criterion + _statistics.criteriaType}"/>


Т.е. первые две три строки у меня имеют локализованное название в этой колонке:

Код

criterion0=Всего                   
criterion1=Ручная обработка        
criterion2=Автоматическая обработка


и как мне сформировать вот в том тернарном операторе динамическое значение ключа? 
Вот на остальных фреймворках получалось это просто... А как в JSF? Не хочется писать java-код

Автор: sidslog 20.10.2009, 17:03
Если Tomahawk используете, там есть t:buffer
Код

                <t:buffer into="#{key}">
                    <h:outputText value="criterion.#{_statistics.criteriaType}"  />
                </t:buffer>

В #{key} будет нужная строка

Автор: MisterCleric 20.10.2009, 17:07
Цитата

Если Tomahawk


не-а - richfaces

Автор: sidslog 20.10.2009, 20:26
Ну для richfaces придется подождать

https://jira.jboss.org/jira/browse/RF-724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12413788

Можете пока подключить tomahawk как временную меру, либо в el заменить 

Код

: bundle.criterion + _statistics.criteriaType


на 

Код

: (_statistics.criteriaType == 0 ? bundle.criterion1 : (...))


Автор: MisterCleric 20.10.2009, 22:11
Цитата

Ну для richfaces придется подождать


Супер! Тянет на плюс. Ну.... само высказывание
мне, кажется, или другие должны быть решения. Или все-таки придется данную логику зашить на уровне метода в классе.
Недавно читал книгу по SEAM. так вот не обратил внимание как там усе на этих EL-ах работает.
Надо еще поковырять в сторону JSTL...

Автор: powerOn 21.10.2009, 08:01
а если rendered посмотреть? правда если строк 50, то будет не очень красиво smile

Код

<h:outputText rendered="#{_statistics.criteriaType > 2}"   value="#{_statistics.criteriaName}""/>
<h:outputText rendered="#{_statistics.criteriaType == 0}" value="#{bundle.criterion0 + _statistics.criteriaType}"/>
<h:outputText rendered="#{_statistics.criteriaType == 1}" value="#{bundle.criterion1 + _statistics.criteriaType}"/>
<h:outputText rendered="#{_statistics.criteriaType == 2}" value="#{bundle.criterion2 + _statistics.criteriaType}"/>

Автор: MisterCleric 21.10.2009, 10:01
powerOn,

вот как раз проблема в том, что  такое выражение
Цитата

#{bundle.criterion0 + _statistics.criteriaType}

не рабоает...

Автор: sidslog 21.10.2009, 11:22
MisterClericpowerOn видимо имел в виду

Код

<h:outputText rendered="#{_statistics.criteriaType > 2}"   value="#{_statistics.criteriaName}""/>
<h:outputText rendered="#{_statistics.criteriaType == 0}" value="#{bundle.criterion0}"/>
<h:outputText rendered="#{_statistics.criteriaType == 1}" value="#{bundle.criterion1}"/>
<h:outputText rendered="#{_statistics.criteriaType == 2}" value="#{bundle.criterion2}"/>


Автор: MisterCleric 21.10.2009, 11:31
Не, ребятя, все это клево. Но не годится. Наверное буду читать бандл в методе. Т.е. все показанную логику инкапсулирую на уровне метода бина. Хотя это идет в разрез логики, так как вот этот _statistics - это сущность, которая достаеться из базы...

Автор: MisterCleric 22.10.2009, 09:52
Привет.
Итого решение пришлось реализовывать в java-класса. Вышло так:
Код

public class StatisticsBean implements Serializable {

    @Autowired
    private SessionFacade sessionFacade;

    @Autowired
    private CommonBean commonBean;

    private ResourceBundle bundle;

    private Date dateFrom;
    private Date dateTo;

    private List<Statistics> statisticsList;


    @PostConstruct
    public void init() {
        Locale currentLocale = new Locale(commonBean.getLocale());
        bundle = ResourceBundle.getBundle("LocalizationResources", currentLocale);
        dateTo = new Date();
        Calendar now = Calendar.getInstance();
        now.add(Calendar.MONTH, -1);
        dateFrom = now.getTime();
    }

    public void getStatistics() {
        statisticsList = sessionFacade.getStatisticsByPeriod(dateFrom, dateTo);
        localizeCriterionNames(statisticsList);
    }

    private void localizeCriterionNames(List<Statistics> statisticsList) {
        for (Statistics statistics : statisticsList) {
            String localizedName = getStringOrNull(bundle, "criterion" + statistics.getCriteriaType());
            if (localizedName != null) {
                statistics.setCriteriaName(localizedName);
            }
        }
    }

    private String getStringOrNull(ResourceBundle bundle, String key) {
        try {
            return bundle.getString(key);
        }
        catch (MissingResourceException ex) {
            // Assume key not found
            // -> do NOT throw the exception to allow for checking parent message source.
            return null;
        }
    }

}

Автор: MisterCleric 22.10.2009, 10:07
Итого, наверное, тема закрыта.
Хотя такой маленький вопрос: 
нету ли у JSF какого-нибудь TextProvide или MessageSource
А то как-то бедновато выходит читать напрямую ResourceBundle ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)