Tags personalizadas são elementos de linguagem JSP definidos pelo usuário. Quando uma página JSP contém uma tag personalizada que é convertida em um servlet, a tag é convertida em operações em um objeto chamado manipulador de tags, que é o que o contêiner da Web chama quando o servlet é executado.
A extensão de tag JSP permite criar novas tags e inseri-las diretamente em uma página JSP. Manipuladores de tags simples foram introduzidos na especificação JSP 2.0 para escrever essas tags personalizadas.
Você pode herdar a classe SimpleTagSupport e substituir o método doTag() para desenvolver a tag personalizada mais simples.
A seguir, queremos criar uma tag personalizada chamada <ex:Hello> com o seguinte formato:
<ex:Olá />
Para criar tags JSP customizadas, você deve primeiro criar a classe Java que manipula as tags. Então, vamos criar uma classe HelloTag da seguinte forma:
pacote com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;classe pública HelloTag estende SimpleTagSupport { public void doTag() lança JspException, IOException { JspWriter fora = getJspContext().getOut(); out.println("Olá, tag personalizada!");
O código a seguir reescreve o método doTag(), que usa o método getJspContext() para obter o objeto JspContext atual e passa "Hello Custom Tag!" para o objeto JspWriter.
Compile a classe acima e copie-a para o diretório da variável de ambiente CLASSPATH. Por fim, crie a seguinte biblioteca de tags: <diretório de instalação do Tomcat> webappsROOTWEB-INFcustom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemplo de TLD</short-name> <tag> <name>Olá</name > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>empty</body-content> </tag></taglib>
A seguir, podemos usar a tag Hello no arquivo JSP:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Um exemplo de tag personalizada</title> </head> <body> <ex:Olá /> </body></html>
A saída do programa acima é:
Olá Tag Personalizada!
Você pode incluir o conteúdo da mensagem em tags assim como na biblioteca de tags padrão. Se quisermos incluir conteúdo em nosso Hello personalizado, o formato é o seguinte:
<ex:Hello> Este é o corpo da mensagem</ex:Hello>
Podemos modificar o arquivo de classe de processamento de rótulos, o código é o seguinte:
pacote com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;classe pública HelloTag estende SimpleTagSupport { StringWriter sw = new StringWriter(); ) lança JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() }}
Em seguida, precisamos modificar o arquivo TLD da seguinte forma:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemplo de TLD com corpo</short-name> <tag> <name>Olá< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>sem script</body-content> </tag></taglib>
Agora podemos usar a tag modificada em JSP conforme mostrado abaixo:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Um exemplo de tag personalizada</title> </head> <body> <ex:Olá > Este é o corpo da mensagem </ex:Hello> </body></html>
A saída do programa acima é a seguinte:
Este é o corpo da mensagem
Você pode definir vários atributos em padrões customizados. Para receber atributos, a classe de tag customizada de valor deve implementar o método setter. O método setter em JavaBean é o seguinte:
pacote com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;classe pública HelloTag estende SimpleTagSupport { private String message; this.message = msg } StringWriter sw = new StringWriter(); JspException, IOException { if (message != null) { /* Use a mensagem do atributo */ JspWriter out = getJspContext().getOut(); out.println( message } else { /* Use a mensagem do atributo ); corpo do conteúdo */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() }); }}
O nome da propriedade é “message”, então o método setter é setMessage(). Agora vamos adicionar este atributo no elemento <attribute> usado no arquivo TLD:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemplo de TLD com corpo</short-name> <tag> <name>Olá< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>sem script</body-content> <attribute> <name>mensagem</name> </attribute> </tag></taglib>
Agora podemos usar o atributo message no arquivo JSP da seguinte maneira:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Um exemplo de tag personalizada</title> </head> <body> <ex:Olá message="Esta é uma tag personalizada" /> </body></html>
O resultado de saída dos dados de exemplo acima é:
Esta é uma tag personalizada
Você também pode incluir os seguintes atributos:
propriedade | descrever |
---|---|
nome | Define o nome do atributo. O nome do atributo deve ser exclusivo para cada tag. |
obrigatório | Especifica se o atributo é obrigatório ou opcional. Se definido como falso, será opcional. |
valorrtexpr | Declara se o atributo label é válido ao executar a expressão. |
tipo | O tipo de classe Java que define esta propriedade. Padrão especificado como String |
descrição | Informações de descrição |
fragmento | Se este atributo for declarado, o valor do atributo será tratado como JspFragment . |
A seguir está um exemplo de especificação de propriedades relevantes:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute>.. ...
Se você estiver usando os dois atributos, modifique o arquivo TLD da seguinte maneira:
..... <attribute> <name>attribute_name1</name> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute > <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute>.....