конкатенация строк в EL

Я хочу отобразить имя (текущего пользователя) в раскрывающемся списке в JSF. Здесь имя — это динамическая переменная, которая заполняется через некоторый класс pojo. Текущий код, который у меня есть,

<f:selectItem itemLabel="#{accessManager.salesManager.displayName} #{' ('.concat(i.m['current user']).concat(') ')}" itemValue="#{accessManager.salesManager.oid}" />

accessManager.salesManager.displayName заполняет имя в пользовательском интерфейсе.

#{' ('.concat(i.m['current user']).concat(') ')}" here I am trying to hard code (current user).

Но это исключения.

Может ли кто-нибудь помочь мне в этом? Это звучит очень просто, но я не привык к EL.


person user3198773    schedule 15.01.2014    source источник
comment
Что именно вы хотите отобразить?   -  person Xtreme Biker    schedule 15.01.2014
comment
Если accessManager.salesManager.displayName оценивается как Bob, я хочу отобразить Bob (текущий пользователь) в раскрывающемся списке.   -  person user3198773    schedule 15.01.2014
comment
Следует отметить, что текущий пользователь зависит от языка. значения текущего пользователя на разных языках сохраняются в файле свойств.   -  person user3198773    schedule 15.01.2014


Ответы (3)


Основываясь на вашем примере, самый простой способ - предоставить дополнительную функцию в управляемом компоненте, которая оценивает, является ли текущий пользователь текущим выбором или нет. Позже вы оцениваете эту функцию с помощью тернарного оператора, который решает, отображать ли связанное (переведенное) значение или нет.

@ViewScoped
public class ChoiceBean{

    public List<SalesManager> getSalesManagers(){
        return salesManagers;
    }

    //Checks if your current choice is the current manager(EL 2.2 required to pass the parameter)
    public boolean checkIfCurrent(SalesManager manager){
        if (manager.getName().equals("Bob")) return true;
        return false;
    }

}
<f:selectItem 
    itemLabel="#{manager.name} #{choiceBean.checkIfCurrent(manager) ? i.m['current user'] : ''}" itemValue="#{salesManager.oid}" />

См. также:

person Xtreme Biker    schedule 15.01.2014
comment
Извините, я думаю, что не смог правильно задать свой вопрос. Приведенный выше код, предоставленный Xtreme, отобразит текущего пользователя Боба. Я хочу отобразить Боба (текущий пользователь). Итак, вопрос в том, как мне объединить '(' & ')' до и после #{i.m['current user'])}. - person user3198773; 15.01.2014

Другим решением является использование функции, выполняющей эту конкатенацию строк за вас. Либо

Но, из любопытства, почему вы не хотите добавить скобки в файл свойств, чтобы значение ресурса содержало (current user) вместо current user?

Надеюсь, поможет...

person L-Ray    schedule 15.01.2014
comment
Нет в файле свойств, это просто текущий пользователь. В .xhtml мы добавляем '(' и ')' к текущему пользователю. - person user3198773; 15.01.2014
comment
Я знаю... так что, я думаю, вы не можете изменить пакеты ресурсов самостоятельно и просто ввести вторую, скобочную версию? Если это так, воспользуйтесь методом статической конкатенации, описанным выше, и перейдите по ссылке. Это работает для нас и не так больно, как кажется на первый взгляд. - person L-Ray; 15.01.2014
comment
Я мог бы изменить пакет ресурсов, чтобы включить (текущий пользователь) = некоторый текст на другом языке. Но программно это было не правильно. - person user3198773; 15.01.2014

Итак, вопрос в том, как объединить '(' & ')' до и после #{i.m['current user'])}

Не делайте этого трудным путем. Просто поместите эти скобки вне выражения EL.

<f:selectItem itemLabel="#{accessManager.salesManager.displayName} (#{i.m['current user']})" itemValue="#{accessManager.salesManager.oid}" />
person BalusC    schedule 15.01.2014
comment
Из того, что говорит @user3198773, я понимаю, что текст (текущий пользователь) должен появляться только тогда, когда текущий selectItem соответствует текущему (зарегистрированному??) пользователю. Таким образом, (#{i.m['current user']}) следует отображать условно (как я понимаю). - person Xtreme Biker; 16.01.2014
comment
@Xtreme: Где он это сказал? Его первоначальная попытка также никоим образом не предполагает этого. - person BalusC; 16.01.2014
comment
Посмотрите на обсуждение, которое у меня было в комментариях под вопросом. Может быть, я неправильно понял это, но было бы странно, если бы все они были обозначены как (текущий пользователь), не так ли? Во всяком случае, сам вопрос нуждается в умывании лица. - person Xtreme Biker; 16.01.2014
comment
@Xtreme: Хм, функциональные требования действительно странные. В любом случае приведенный выше ответ по-прежнему исправляет технический вопрос. - person BalusC; 16.01.2014