Este artigo apresenta de maneira prática, o processo de criação de um componente JSF customizado. A idéia é que quem leia este artigo aprenda como construir seu próprio componente. Pois às vezes, falta alguma documentação ou até mesmo um pequeno artigo como este, que mostre como se fazer o que se quer fazer. Aqui vamos utilizar o Tomahawk (Myfaces) para embasamento de um componente. Bom, vamos começar….
Para um componente qualquer, precisamos criar uma TLD com as propriedades do componente, um faces-config com os mapeamentos necessários, e finalmente as classes que definem as funcionalidades e o próprio componente. (Levando em consideração que certas classes que adicionam recursos como Javascript e imagens, já foram desenvolvidas pelo myfaces, bastando apenas talvez, extendê-las para aplicar funcionalidades específicas. Como aqui não é o objetivo, estarei postando este artigo em outra oportunidade).
Criamos então um projeto com uma pasta chamada META-INF. Nesta pasta incluímos o faces-config e a nossa TLD.
META-INF/faces-config.xml:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE faces-config PUBLIC
“-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN”
“http://java.sun.com/dtd/web-facesconfig_1_1.dtd”>
<faces-config xmlns=”http://java.sun.com/JSF/Configuration”>
<component>
<component-type>tipoDoComponente</component-type>
<component-class>pacote.ClasseDoComponente</component-class>
</component><converter>
<converter-for-class>[Ljava.lang.String;</converter-for-class>
<converter-class>org.apache.myfaces.convert.StringArrayConverter</converter-class>
</converter><render-kit>
<render-kit-id>HTML_BASIC</render-kit-id>
<renderer>
<component-family>tipoDoComponente</component-family>
<renderer-type>familiaDoComponente</renderer-type>
<renderer-class>pacote.ClasseDoRenderizador</renderer-class>
</renderer>
</render-kit>
<managed-bean>
…..
</managed-bean>
</faces-config>
Neste arquivo definimos qual a classe do nosso componente, qual o nosso renderizador, se houver um managed-bean para ele, especificamos (da mesma forma que o comum) e os eventuais conversores que poderemos utilizar(inseri apenas um para o exemplo).
META-INF/nomeDaTLD.tld :
<?xml version = ‘1.0′ encoding = ‘UTF-8′?>
<taglib xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd” version=”2.0″ xmlns=”http://java.sun.com/xml/ns/j2ee”>
<display-name>nomeDaTLD</display-name>
<tlib-version>1.0</tlib-version>
<short-name>nomeReduzido</short-name>
<uri>http://auri.algumacoisa</uri>
<tag>
<name>nomeDoComponente</name>
<tag-class>classeTagDoComponente</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
Especificamos alguns atributos ( todos do tipo String ), o nome do componente e a URI para acesso a nossa taglibrary. No próximo artigo estarei comentando sobre as classes e dando alguns exemplos simplificados de como construí-las. (Neste momento veremos o porque de definirmos os arquivos acima desta forma. )
Até breve.
[...] Parte 1 Parte 3 [...]
[...] Parte 1 Parte 2 [...]
Estou tentando criar um componente segui todos os passos, mas e fiz também igualzinho sugere neste outro artigo: http://www.fusioncharts.com/forum/Topic8629-33-1.aspx
mas minha nova tag é completamente ignorada, nenhuma mensagem de erro, e ela não é rederizada como o componente mas apenas mantida intacta.
Obrigado
Você pode verificar se declarou corretamente seu Renderer no faces-config.xml da sua taglibrary, ou seja:
1) Se o valor de é o mesmo que em .
2) Que sua classe Tag (que extende UIComponentTag) retorne em getComponentType() o mesmo valor que possui.
3) Que sua classe Tag (que extende UIComponentTag) retorne em getRendererType() o mesmo valor que em possui.
4) Que sua classe Renderer (que extende Renderer) tenha o mesmo nome definido em de .
5) Se você está conseguindo utilizar o ResponseWriter em algum dos métodos de decode do seu Renderer.
Se tudo isto estiver correto e sua taglibray (que idealmente se encontra num jar) esteja no classpath da aplicação, então seu componente deve ser ao menos renderizado.
Abraço!