Моя наименее любимая часть кодирования форм JSF 2.0 связана с обработкой атрибутов id различных элементов ввода.У меня навсегда возникают проблемы с кодированием clientID целевого компонента из базового компонента, особенно потому, что PrimeFaces tabView теперь включает идентификатор элемента p: tab как часть clientID.Я трачу кучу времени на кодирование, тестирование, а затем перекодирование этих клиентских идентификаторов.
Это напоминает программирование на ассемблере более старого стиля, где вам приходится генерировать тонны имен меток для ваших ветвей и циклов.Этого хватило на всю жизнь.
Один из подходов, которые я пытаюсь использовать, - это использовать только автоматически сгенерированные id атрибуты.Например, одна строка моей формы может выглядеть следующим образом.
<h:outputLabel value="Full Name:" />
<p:inputText value="#{editUser.user.fullName}"
binding="#{editUser.compFullName}"/>
<p:message for="#{editUser.compFullName.clientId}" />
Обратите внимание, что у меня нет явного атрибута id .Затем в компоненте поддержки:
String clientID = getCompFullName().getClientId();
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
"Summary Message For Full Name", "Detail Message Full Name");
FacesContext.getCurrentInstance().addMessage(clientID, msg);
Это всегда работает, даже если компонент имеет сложный clientID, например, когда PrimeFaces вставляет идентификатор p: tab в clientID.(Что он делает начиная с v 3).Перестановка формы никогда ничего не нарушает.
Это, однако, кропотливо, так как я должен создать свойства, методы получения и установки UIComponent и связать их в форме с привязкой атрибутов.Кто-нибудь может предложить лучший способ сделать это?