Как мне сломать тиранию clientID? - PullRequest
1 голос
/ 01 декабря 2011

Моя наименее любимая часть кодирования форм 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 и связать их в форме с привязкой атрибутов.Кто-нибудь может предложить лучший способ сделать это?

1 Ответ

8 голосов
/ 01 декабря 2011

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

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

<p:inputText value="#{editUser.user.fullName}"
             binding="#{compFullName}"/>
<p:message for="#{compFullName.clientId}" />

Чтобы сделать код более самодокументированным, я предлагаю поместить HashMap в область запроса на faces-config.xml:

<managed-bean>
    <description>Holder of all component bindings.</description>
    <managed-bean-name>components</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

с

<p:inputText value="#{editUser.user.fullName}"
             binding="#{components.fullName}"/>
<p:message for="#{components.fullName.clientId}" />

Добавление сообщений должно выполняться Converter или Validator, которые обозначают его как ConverterException или ValidatorException соответственно. Это автоматически окажется в нужном держателе сообщения. Или, если это неформальные сообщения, просто добавьте его в идентификатор клиента UIComponent, который уже доступен в качестве аргумента метода.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...