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
Apoio
YourKit
    YourKit is kindly supporting open source projects with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling Java and .NET applications. Take a look at YourKit's leading software products: YourKit Java Profiler and YourKit .NET Profiler.
Últimas postagens
Erro ao fazer update [RESOLVIDO] Autor: Tchaco Erro CrudController Autor: edu_fernandes Artigos, Livros e documentação Autor: Nunes Crud Master Detail Autor: carlos ribeiro [RESOLVIDO] Problema ao iniciar aplicação com NEO Autor: R.Albany gerar relatórios Autor: mouzer [RESOLVIDO] Missing required Java project: 'Neo' Autor: r3n4n The method ognl(String) in the type NeoFunctions is not applicable for the arguments () Autor: r3n4n 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 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 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