Хобрук: Ваш путь к мастерству в программировании

Как установить значение составного компонента вне составного компонента

Итак, у меня составной компонент. Внутри него у меня есть обычный текстовый ввод, использующий один из атрибутов составного компонента для значения.

<h:inputTextarea id="#{cc.attrs.id}Text" value="#{cc.attrs.value}">
    <f:ajax event="blur" listener="#{someBean.onBlur}" />
</h:inputTextarea>

Как видите, у меня есть событие внутри текстового поля. Это событие открывает всплывающее окно и заполняет его текстом составного элемента управления. Он также сохраняет ссылку на составной элемент управления, вызвавший его. Позволь мне показать тебе:

public void onBlur(AjaxBehaviorEvent event) {
    this.fieldReference = (UIInput) event.getSource();

    this.formula = this.fieldReference.getValueExpression("value")
            .getValue(FacesContext.getCurrentInstance().getELContext())
            .toString();

    this.displayPopup = true;
}

Все идет нормально. Теперь проблема возникает, когда я пытаюсь закрыть всплывающее окно, а затем обновить значение составного компонента значением, введенным во всплывающем окне. Я пытаюсь сделать это:

public void accept(ActionEvent event) {
    this.fieldReference
            .getValueExpression("value")
            .setValue(FacesContext.getCurrentInstance().getELContext(), this.formula);
    this.displayPopup = false;
}

Когда я пытаюсь это сделать, я получаю:

javax.el.PropertyNotFoundException: //C:/myProject/Path/compositeComponentPage.xhtml at line 22 and column 183 value="#{cc.attrs.value}": Target Unreachable, identifier 'cc' resolved to null

Мне кажется, что контекст EL в этом запросе отличается и, следовательно, не может разрешать переменные в выражениях составного компонента... но если я попытаюсь также сохранить ссылку на объект ELContext из запроса составного компонента (в методе onBlur() ), то когда я пытаюсь использовать его в accept(), я получаю:

javax.faces.event.AbortProcessingException: java.lang.IllegalStateException: Error the FacesContext is already released!

Используя MyFaces 2.0.2 (версия, которая поставляется с WebSphere 8.5, я думаю, что они модифицируют ее) и RichFaces 4.2.3.

Любые идеи?


  • Небольшой вопрос: пробовали ли вы (пробовали, не говоря уже об использовании в продакшене) более новую версию myfaces? 2.0.2 5 лет 15.07.2015
  • Вы также можете решить эту клиентскую сторону с помощью java-скрипта, это вариант? Или установите значение, на которое ссылается компонент (bean), и выполните повторную визуализацию компонента. 15.07.2015
  • @Kukeltje К сожалению, это не вариант :( Версия библиотеки определяется контейнером, а контейнер определяется клиентом проекта. 15.07.2015
  • @WvdL Установка значения, на которое ссылается компонент, - это именно то, что я пытался сделать, к сожалению, это нельзя определить статически (т.е. во время компиляции), потому что это компонент, который будет использоваться в нескольких местах для редактирования различных свойств моего сущности. Поэтому мне нужно определить во время выполнения, что я передаю компоненту в cc.attrs.value. 15.07.2015
  • Библиотека, на самом деле, не всегда требуется контейнером. Много сообщений на SO об обновлении версий JSF в контейнерах. stackoverflow.com/questions/18141728/. Может быть, можно обновить таким образом. Я бы, конечно, расследовал это. 15.07.2015
  • Хорошо, извините, я не был достаточно конкретным. Я имел в виду, что контейнер как есть определяется клиентом. Мы ничего не можем изменить. Я знаю, это звучит безумно, но на это есть веская причина... в конце концов, я их понимаю. 15.07.2015

Ответы:


1

Ну, кажется, я нашел решение. Оглядевшись, я нашел эту небольшую часть знаний в совершенно не связанном с этим статья в блоге BalusC:

Экземпляр компонента поддержки имеет в основном время существования ровно одного HTTP-запроса. Это означает, что он воссоздается при каждом отдельном HTTP-запросе, например, в качестве управляемого компонента с областью действия запроса.

Таким образом, сохранение ссылки на компонент — очень плохая вещь. Вместо этого я сохранил идентификатор клиента компонента и просматривал его при закрытии всплывающего окна, а затем использовал setValue, который ранее не работал. Нравится:

public void onBlur(AjaxBehaviorEvent event) {
    UIInput component = (UIInput) evento.getSource();
    this.componentId = component.getClientId(FacesContext.getCurrentInstance());

    this.formula = component.getValueExpression("value")
        .getValue(FacesContext.getCurrentInstance().getELContext())
        .toString();

    this.displayPopup = true;
}

public void accept(ActionEvent evento) {
    UIInput component = (UIInput) FacesUtil.findComponent(this.componentId);
    component.setValue(this.formula);

    this.displayPopup = false;
}

Итак... Думаю, спасибо, BalusC, ты снова спас положение!! :)

15.07.2015
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..