Как получить идентификатор вызывающего компонента в методе получения? - PullRequest
2 голосов
/ 17 декабря 2010

Учитывая следующий пример:

<h:inputText id="foo" size="#{configBean.size}" />

Я хотел бы получить id вызывающего компонента foo в методе получения, чтобы я мог вернуть размер из файла свойствключ foo.length.

public int getSize() {
    String componentId = "foo"; // Hardcoded, but I should be able to get the id somehow
    int size = variableConfig.getSizeFor(componentId);
    return size;
}

Как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Начиная с JSF 2.0, в области действия компонента появилась новая неявная переменная EL: #{component}, которая ссылается на текущий экземпляр UIComponent.Среди его методов получения есть getId(), который вам нужен.

Так что вы можете просто сделать:

<h:inputText id="foo" size="#{configBean.getSize(component.id)}" />

с

public int getSize(String componentId) {
    return variableConfig.getSizeFor(componentId);
}

В качестве альтернативы вы также можете сделать variableConfig и @ApplicationScoped @ManagedBean, чтобы вы могли просто сделать:

<h:inputText id="foo" size="#{variableConfig.getSizeFor(component.id)}" />

(необходимо использовать полное имя метода в EL вместо имени свойства)всякий раз, когда вы хотите передать аргументы методу, просто variableConfig.sizeFor(component.id) не будет работать, или вы должны переименовать действительный метод getSizeFor() в sizeFor() в классе)

1 голос
/ 19 декабря 2010

Я думаю, что ответ BalusC - лучший из возможных ответов.Это показывает одну из многих небольших причин, почему JSF 2.0 является таким большим улучшением по сравнению с 1.x.

Если вы используете 1.x, вы можете попробовать функцию EL, которая помещает идентификатор компонента вобласть запроса под некоторым именем, которую может получить ваш метод бина.

Например,

<h:inputText id="foo" size="#{my:getWithID(configBean.size, 'foo')}" />

Реализация метода EL может выглядеть примерно так:

public static Object getWithID(String valueTarget, id) {
    FacesContext context = FacesContext.getCurrentInstance();
    ELContext elContext = context.getELContext();

    context.getExternalContext().getRequestMap().put("callerID", id);

    ValueExpression valueExpression = context.getApplication()
        .getExpressionFactory()
        .createValueExpression(elContext, "#{"+valueTarget+"}", Object.class);

    return valueExpression.getValue(elContext);
 }

Вв этом случае всякий раз, когда вызывается метод getSize () bean-компонента config, идентификатор вызывающего компонента будет доступен через "callerID" в области запроса.Чтобы сделать его немного лучше, вам, возможно, следует добавить блок finally, чтобы удалить переменную из области видимости после выполнения вызова.(обратите внимание, что я не пробовал приведенный выше код, но, надеюсь, он демонстрирует идею)

Опять же, это будет последним средством, когда вы используете JSF 1.x.Самое чистое решение - использование JSF 2.0 и метод BalusC.

...