Desenvolvendo uma TagLib com suporte a template Introdução Um dos grandes problemas dos frameworks atuais é o desenvolvimento de novos componentes visuais e a grande quantidade de "copy/paste" que são feitos durante a codificação de um projeto. Neste tutorial abordaremos como desenvolver uma taglib usando as bibliotecas que o NEO te fornece, usando o engine do jsp como template. Criando o arquivo tld A primeira etapa para a criação de um novo componente é o desenvolvimento da tld, que é um xml que faz um mapeamento das propriedades criadas no tld para o objeto que representa a sua tag. <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 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/webjsptaglibrary_2_0.xsd" version="2.0"> <description>Neo library</description> <display-name>Neo library</display-name> <tlib-version>1.0</tlib-version> <short-name>neoframeworkutil</short-name> <uri>neoframeworkutil</uri> <tag> <description></description> <name>label</name> <tag-class>org.neoframework.tutorial.tag.LabelTag</tag-class> <body-content>empty</body-content> <attribute> <description></description> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description></description> <name>label</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> • • • a tag "<tag>" define o início da tag que estaremos montando em questão. a tag - filha "<description>" define apenas uma descrição da tag que iremos montar. a tag "<name>" define o nome que será usado para a tag. Exemplo: <util:label/> • a tag "<body-content>" define a maneira que é utilizada a tag. Quando tem o atributo empty significa que a tag nao tem corpo (<util:label/>) caso use scriptless a tag possui copo como conteudo (<util:label>conteudo aqui</util:label>) Em seguinda temos uma série de atributos, como como o próprio nome diz são atributos da sua tag. <attribute> <description></description> (Define a descrição do atributo) <name>value</name> (Define o nome. ex: <util:label value="algumacoisa"/>) <required>false</required> (Define se o atributo é obrigatório) <rtexprvalue>true</rtexprvalue> (Define se você pode usar EL. ex: <util:label value="$ {bean.value}"/>) </attribute> Desenvolvimento do arquivo java da tag. public class LabelTag extends TemplateTag { protected String value; protected String label; @Override protected void doComponent() throws Exception { pushAttribute("value", value); pushAttribute("label", label); includeJspTemplate(); popAttribute("label"); popAttribute("value"); } public String getLabel() { return label; } public String getValue() { return value; } public void setLabel(String label) { this.label = label; } public void setValue(String value) { this.value= value; } } Primeiro criamos a nossa classe qualquer e extendemos a TemplateTag. Esta que possibilita que o componente utilizado seja utitizado dentro de panelGrid, sem que perca a formatação, caso não queira esta funcionalidade, extenda a classe BaseTag. Em seguida criamos as mesmas propriedades que foram feitas na tld, que foram "value" e "label": protected String value; protected String label; Depois faremos os getters e setters, que são usados para que a api do jsp injete os valores inseridos na sua tela passe para o arquivo da tag. Devemos sobrescrever o método "doComponent" que é o responsável de renderizar a tag. Em seguida vamos mandar os dados recebidos da tela pelas propriedades e vamos enviar para o template os dados necessários. Para isso utilizaremos o método pushAttribute, que é semelhante ao request.setAttribute da action, que poe um objeto no escopo e envia para o jsp. No nosso caso a finalidade deste método é o mesmo, envia o dado para o nosso template. Em seguida usaremos o método includeJspTemplate, que chama o nosso template. No caso o método includeJspTemplate() põe por default o caminho da classe java. Ex. se temos uma classe que está em org.neoframework.teste.TutorialTag, significa que tem um jsp no pacote org.neoframework.teste de nome TutorialTag.jsp. Depois usamos o popAttribute para remover o objeto do escopo da tag. Desenvolvimento do jsp arquivo LabelTag.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="n" uri="neo"%> <%@ taglib prefix="t" uri="template"%> <n:panel>${label}</n:panel> <n:panel>${value}</n:panel> Como você pode perceber, o desenvolvimento de tags extra no neo é feita de maneira simples, e você também pode usar uma tag já pronta dentro de outra tag que você irá montar, desta maneira os códigos são aproveitados.