Условный рендеринг в файле тега в зависимости от того, указан ли атрибут или нет

У меня есть файл тега Facelet и вам нужно отображать разные компоненты в зависимости от того, указан ли атрибут или нет. Я попробовал это, как показано ниже,

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pe="http://primefaces.org/ui/extensions"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:panelGrid columns="1">
        <p:outputLabel value="test1" rendered="#{empty myParam}" />
        <p:outputLabel value="test2" rendered="#{not empty myParam}" />
    </h:panelGrid>
</ui:composition>

Что используется ниже,

<mt:myTag myParam="#{myManagedBean.someProperty}" />

Однако это не сработало. Он принимает оцененное значение #{myManagedBean.someProperty}. Если он пуст, он все равно показывает test1. Как я могу проверить, действительно ли установлен атрибут myParam или нет?

Ответы

Ответ 1

Создайте еще один настраиваемый тег с классом taghandler, который проверяет наличие определенного атрибута в переменном mapper текущего контекста Facelet и устанавливает логическое значение в области Facelet, указывающее наличие нужного атрибута. Наконец, используйте его в вашем файле тегов.

например.

<my:checkAttributePresent name="myParam" var="myParamPresent" />
<h:panelGrid columns="1">
    <p:outputLabel value="test1" rendered="#{not myParamPresent}" />
    <p:outputLabel value="test2" rendered="#{myParamPresent}" />
</h:panelGrid>

С этим обработчиком тегов:

public class CheckAttributePresentHandler extends TagHandler {

    private String name;
    private String var;

    public CheckAttributePresentHandler(TagConfig config) {
        super(config);
        name = getRequiredAttribute("name").getValue();
        var = getRequiredAttribute("var").getValue();
    }

    @Override
    public void apply(FaceletContext context, UIComponent parent) throws IOException {
        context.setAttribute(var, context.getVariableMapper().resolveVariable(name) != null);
    }

}

Что зарегистрировано, как показано ниже в .taglib.xml:

<tag>
    <tag-name>checkAttributePresent</tag-name>
    <handler-class>com.example.CheckAttributePresentHandler</handler-class>
    <attribute>
        <name>name</name>
        <required>true</required>
        <type>java.lang.String</type>
    </attribute>
    <attribute>
        <name>var</name>
        <required>true</required>
        <type>java.lang.String</type>
    </attribute>
</tag>