Как передать значение Custom Component в управляемый компонент? - PullRequest
3 голосов
/ 23 сентября 2011

Я создал пользовательский компонент. Я добавляю динамическое текстовое поле ввода (из функции кодирования).

Компонент корректно отображается как HTML.

Но я хочу связать значение текстового поля с некоторым свойством в управляемом компоненте. Поэтому какой-то другой разработчик может использовать компонент на своем JSP со своим управляемым компонентом.

Я хочу знать, что мне делать, чтобы значение, введенное в текстовое поле (которое динамически создает мой компонент), было установлено на некоторое свойство управляемого компонента.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Вы должны убедиться, что ваш пользовательский класс компонентов расширяется UIInput и что вы используете метод encodeEnd() вашего средства визуализации, записывающий идентификатор клиента компонента как name атрибут элемента ввода HTML.Затем вы можете в переопределенном методе decode() вашего средства визуализации просто взять отправленное значение из карты параметров запроса с идентификатором клиента компонента в качестве имени параметра и установить его как UIInput#setSubmittedValue()и позвольте JSF выполнить остаток работы по преобразованию, проверке и обновлению значения модели.

@Override
public void decode(FacesContext context, UIComponent component) {
    // Do if necessary first validation on disabled="true" or readonly="true", if any.

    // Then just get the submitted value by client ID as name.
    String clientId = component.getClientId(context);
    String submittedValue = context.getExternalContext().getRequestParameterMap().get(clientId);
    ((UIInput) component).setSubmittedValue(submittedValue);
}

Не связано с конкретной проблемой, знаете ли вы о новом составномкомпонент поддержки в преемниках JSP Facelets?У меня сложилось впечатление, что вам не обязательно нужен специальный компонент для этой цели.Или вы действительно ограничены использованием устаревшей JSP в качестве технологии просмотра, несмотря на то, что вы уже используете JSF 2.x?Смотрите также Когда использовать, файлы тегов, составные компоненты и / или пользовательские компоненты?

2 голосов
/ 11 октября 2011

Ну, проблема решена.

В методе encodeEnd () я добавил элемент как

HtmlInputHidden hidden = new HtmlInputHidden();
hidden.setParent(this);
hidden.setId("someId");
ValueExpression ve = getValueExpression("value");
hidden.setValueExpression("value", ve);
hidden.encodeBegin(context);
hidden.encodeEnd(context);

Кажется, здесь есть какая-то проблема.

Затем я изменил это на ...

HtmlInputHidden hidden = new HtmlInputHidden();
hidden.setId("someId");
ValueExpression ve = getValueExpression("value");
hidden.setValueExpression("value", ve);
this.getChildren().add(hidden);
hidden.encodeBegin(context);
hidden.encodeEnd(context);

Использование this.getChildren (). Add (); решил мою проблему

P.S. Очевидно, что перед добавлением элемента его необходимо проверить, если элемент уже присутствует.

...