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/web-jsptaglibrary_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.



Tutoriais
Últimas postagens
Dúvida com videos em flash e jsp Autor: thiago cassimiro Criptografar senhas Postgresql Autor: labavel Fazer upload da imagem em disco e no banco Autor: labavel Estilo no detalhe Autor: Tchaco Acessar o equivalente ao Neo.getUser() dentro da JSP Autor: konkix Dúvida de iniciante Autor: Eder Acesso a banco de dados Autor: Nunes Gravar Imagem no Banco Autor: Tchaco Campos AUTOCOMPLETE Autor: vanessa Assinatura Digital Autor: biharck Erro ao fazer update [RESOLVIDO] Autor: Tchaco Projeto NEO pode ser utilizado em um grande cliente do grande ABC. Autor: Nunes Layout Mestre Detalhe Autor: viniciusst Problemas com o type CPFCNPJ Autor: viniciusst Combo de Estado Autor: viniciusst Suporte a dois SGBD's Simultâneos Autor: biharck Many-to-Many Autor: Tux Gerando relatórios Autor: viniciusst Problemas com filtro listagem Autor: vberga Projeto descontinuado Autor: viniciusst Crud com erro - MySQL Autor: viniciusst Erro de cast no DAO Autor: biharck @DescriptionProperty Multiplos Autor: joaopedro Geração de tabelas - CRUD Autor: Nunes iReport Autor: jlevi Impressão de PDF em Bamatech MP20-MI Autor: Alisson Retorno - Novidades Autor: vinicius.janones CRUD Avançado Autor: cassioseffrin CRUD Autor: miltonmmjr Upload Multiplo de Imagem Autor: robmsjr Problema com anotação Autor: tulio Integração com Hibernate Autor: Nunes Dúvida quanto à referência a imagens Autor: mmfalcao Problema com atributo do tipo byte[] Autor: tulio Relacionamento Many to Many Autor: LeonardoBH Artigos, Livros e documentação Autor: Nunes Problema ao subir aplicação de upload de arquivos Autor: cassioseffrin Neo versão 3.4.0 Autor: pedro.goncalves Problemas neo 3.4 + jboss 5 e Cascade no Hibernate Autor: vberga Erro ao anotar @Bean Autor: edson.goncalez Suporte a paginação Autor: int80h Menu vertical Autor: fabricio.costa Crud Autor: fabricio.costa Relatorio JSP Autor: vberga Meu primeiro CRUD Autor: r@mon datagrid Autor: Tchaco Modificar Tag Template Autor: vberga Validação Autor: vberga tela não crud Autor: luizlcfc detalhe com checklist Autor: biharck