Desenvolvendo uma TagLib com suporte a template

Propaganda
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.
Download