На основе схемы PrimeFaces outputLabel для составного компонента

у меня проблема с использованием p:outputLabel при использовании составного компонента. У меня есть составной компонент с p:inputText поле (я удалил ненужные детали из компонента):

<cc:interface>
  <cc:editableValueHolder name="myInput" targets="myInput"/>
  <cc:attribute name="required" required="true" type="java.lang.Boolean" default="false"/>
</cc:interface>

<cc:implementation>
  <p:inputText id="myInput" required="#{cc.attrs.required}"/>
</cc:implementation>

теперь я буду использовать этот компонент с p:outputLabel:

<p:outputLabel for="myComponent:myInput" value="#{resources['myLabel']}:"/>
<my:myComponent id="myComponent" required="#{myBean.required}"/>

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

1 ответов


это, к сожалению, "дизайн". Оценка #{} выражения откладываются до точного момента времени доступа. Они не похожи на "стандартные" EL ${} в JSP не оценивается в тот момент, когда они были проанализированы обработчиком тегов и "кэшированы" для будущего доступа во время того же запроса/представления. На данный момент <p:outputLabel> оказывается, и таким образом #{cc.attrs.required} как ссылка UIInput#isRequired() необходимо оценить, нет никаких средств #{cc} в EL контекст. Так что ни один из его атрибутов ни к чему не приведет. Только когда вы сидите внутри <cc:implementation>, the #{cc} доступен в контексте EL, и все его атрибуты, таким образом, успешно оцениваются.

технически, это неудачный угловой случай надзора в дизайне <p:outputLabel>. Стандартные JSF и EL ведут себя именно так, как указано. В принципе, представление звездочки метки в зависимости от входных данных required атрибут должен быть оценен наоборот: на данный момент <p:inputText> внутри композит должен быть визуализирован или, возможно, даже уже тогда, когда он будет построен. Таким образом, компонент метки не должен запрашивать входной компонент, если он необходим, но входной компонент должен каким-то образом уведомлять компонент метки, что он необходим. Это, в свою очередь, трудно и неуклюже (и, следовательно, неэффективно) реализовать.

если перемещение метки внутрь композита не является вариантом, то лучше всего создать файл тегов вместо этого составного компонента вокруг входного компонента. Для этого требуется только дополнительный шаблон XML.

/WEB-INF/tags/input.xhtml:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui"
>
    <c:set var="id" value="#{not empty id ? id : 'myInput'}" />
    <c:set var="required" value="#{not empty required and required}" />

    <p:inputText id="#{id}" required="#{required}"/>
</ui:composition>

/WEB-INF/my.taglib.xml:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0"
>
    <namespace>http://example.com/my</namespace>

    <tag>
        <tag-name>input</tag-name>
        <source>tags/input.xhtml</source>
    </tag>
</facelet-taglib>

/WEB-INF/web.xml:

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/my.taglib.xml</param-value>
</context-param>

использование:

<html ... xmlns:my="http://example.com/my">
...
<p:outputLabel for="myInput" value="#{resources['myLabel']}:" />
<my:input id="myInput" required="#{myBean.required}" />

я просто сделал быстрый тест и она отлично работает для меня.

Читайте также: