JSF 2: обертка тега для инкапсуляции значений общих атрибутов? - PullRequest
2 голосов
/ 20 декабря 2010

Исходя из этого предыдущего вопроса Как получить идентификатор вызывающего компонента в методе получения? , вот еще одна идея, о которой я хочу спросить ваше мнение:

существует много дублирующегося кодана страницах jsf, таких как эти примеры (обратите внимание на повторяющийся атрибут size и maxlength) между компонентами:

<h:inputText label="#{msgs.userId}" id="UserId" value="#{userBean.userId}" 
   required="true" 
   size="#{variableConfigBean.getSize(component.id)}" 
   maxlength="#{variableConfigBean.getMaxLength(component.id)}"
/>
<h:inputSecret label="#{msgs.password}" id="Password" value="#{userBean.password}" 
   required="true"  
   size="#{variableConfigBean.getSize(component.id)}" 
   maxlength="#{variableConfigBean.getMaxLength(component.id)}"
/>

Я думаю о:

  1. с использованием составного компонента для этого входного текстового тега,
  2. жестко задал размер и макс. Длину в разделе реализации этого составного компонента,
  3. , чтобы мне не приходилось дублировать все эти элементы каждый раз, когда мне нужно использовать этот компонент.
  4. но мне придется открыть все атрибуты в разделе интерфейса этого составного компонента

Эта идея в порядке, или, возможно, есть другие более эффективные способы решения этой проблемы?

1 Ответ

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

Вы могли бы сделать это.Я также реализовал это в некоторых проектах.Это только добавляет (незначительные) накладные расходы.Для этой конкретной цели вы также можете просто использовать файл тегов Facelets вместо составного компонента JSF.Тогда не обязательно определять атрибуты.В вашем конкретном случае вы можете в значительной степени дублировать дубликаты, если повторно используете имя свойства компонента в качестве идентификатора и ключ для метки пакета сообщения.

Например

<my:input type="text" bean="#{userBean}" property="userId" required="true" />
<my:input type="secret" bean="#{userBean}" property="password" required="true" />

со следующим в файле тегов Facelets:

<c:set var="id" value="#{not empty id ? id : property}" />
<c:set var="required" value="#{not empty required and required}" />

<c:choose>
    <c:when test="#{type == 'text'}">
        <h:inputText id="#{id}" 
            label="#{msgs[property]}"
            value="#{bean[property]}" 
            size="#{config.size(id)}" 
            maxlength="#{config.maxlength(id)}" 
            required="#{required}" />
    </c:when>
    <c:when test="#{type == 'secret'}">
        <h:inputSecret id="#{id}" 
            label="#{msgs[property]}"
            value="#{bean[property]}" 
            size="#{config.size(id)}" 
            maxlength="#{config.maxlength(id)}" 
            required="#{required}" />
    </c:when>
    <c:otherwise>
        <h:outputText value="Unknown input type: #{type}" />
    </c:otherwise>            
</c:choose>

Однако я реализовал его с <h:outputLabel> до и <h:message> после, что делает рефакторинг, подобный этому, более разумным.

...