Como usar EL com no atributo id de um componente JSF

Eu tenho o seguinte código:

     

No entanto, quando abro a página, ele comete o seguinte erro:

identificador de componente não deve ser uma cadeia de comprimento zero

Mas é impresso corretamente no . Como isso é causado e como posso resolvê-lo?

Você pode usar EL no atributo id de um componente JSF, mas a variável EL deve estar disponível durante o tempo de construção da visualização , enquanto a tree de componentes JSF deve ser construída. No entanto, o é executado durante o tempo de renderização da exibição , enquanto a saída HTML deve ser gerada com base na tree de componentes JSF. O não está disponível durante o tempo de compilation da visualização e #{class2.name} avaliado como null que explica totalmente o erro recebido. Isso funciona em porque ele é executado durante o tempo de renderização da exibição.

Se você replace por , que é executado durante o tempo de criação da visualização, ele funcionará como você pretendia. O irá gerar fisicamente vários componentes na tree do componente JSF, cada qual gerando individualmente sua própria saída HTML (ao contrário de , onde o mesmo componente é reutilizado várias vezes para gerar saída em HTML).

      

No entanto, eu realmente me pergunto por que você precisa fazer isso. Geralmente não há necessidade de atribuir dinamicamente os IDs dos componentes. O JSF já garantirá a exclusividade do ID. O exemplo abaixo,

      

terminará em vários formulários, cada um com um ID único, com o índice de iteração do . Se você realmente precisa usar o #{class2.name} para alguns propósitos de JavaScript / jQuery (você não fez nenhum #{class2.name} requisito funcional concreto na pergunta para a qual você pensou que esta seria a solução correta, então é apenas uma suposição), então apenas envolvê-lo em um elemento HTML simples:

  

Ou defini-lo como class de estilo de um componente JSF, que também é apenas selecionável através de um seletor CSS:

      

Veja também:

  • JSTL no JSF2 Facelets … faz sentido?