JSP - Tags personalizadas
Neste capítulo, discutiremos as tags personalizadas em JSP. Uma tag customizada é um elemento de linguagem JSP definido pelo usuário. Quando uma página JSP contendo uma tag customizada é convertida em um servlet, a tag é convertida em operações em um objeto chamado manipulador de tag. O contêiner da Web então chama essas operações quando o servlet da página JSP é executado.
As extensões de tag JSP permitem criar novas tags que podem ser inseridas diretamente em uma página JavaServer. A especificação JSP 2.0 introduziu os Manipuladores de Tag Simples para escrever essas tags personalizadas.
Para escrever uma tag personalizada, você pode simplesmente estender SimpleTagSupport classe e substituir o doTag() método, onde você pode colocar seu código para gerar conteúdo para a tag.
Criar tag "Hello"
Considere que você deseja definir uma tag personalizada chamada <ex: Hello> e deseja usá-la da seguinte maneira sem um corpo -
<ex:Hello />
Para criar uma tag JSP customizada, você deve primeiro criar uma classe Java que atue como um manipulador de tag. Vamos agora criar oHelloTag classe como segue -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
O código acima tem uma codificação simples onde o doTag() método pega o objeto JspContext atual usando o getJspContext() método e usa-o para enviar "Hello Custom Tag!" para o atual JspWriter objeto
Vamos compilar a classe acima e copiá-la em um diretório disponível na variável de ambiente CLASSPATH. Por fim, crie o seguinte arquivo de biblioteca de tags:<Tomcat-Installation-Directory>webapps\ROOT\WEB-INF\custom.tld.
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
Vamos agora usar a tag personalizada definida acima Hello em nosso programa JSP da seguinte forma -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
Chame o JSP acima e isso deve produzir o seguinte resultado -
Hello Custom Tag!
Acessando o corpo da tag
Você pode incluir uma mensagem no corpo da tag, como viu com as tags padrão. Considere que você deseja definir uma tag personalizada chamada<ex:Hello> e você deseja usá-lo da seguinte maneira com um corpo -
<ex:Hello>
This is message body
</ex:Hello>
Vamos fazer as seguintes alterações no código da tag acima para processar o corpo da tag -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
Aqui, a saída resultante da invocação é primeiro capturada em um StringWriterantes de ser gravado no JspWriter associado à tag. Precisamos alterar o arquivo TLD da seguinte forma -
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
Vamos agora chamar a tag acima com o corpo adequado da seguinte maneira -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello>
This is message body
</ex:Hello>
</body>
</html>
Você receberá o seguinte resultado -
This is message body
Atributos de tag personalizada
Você pode usar vários atributos junto com suas tags personalizadas. Para aceitar um valor de atributo, uma classe de tag personalizada precisa implementar osetter métodos, idênticos aos métodos setter JavaBean, conforme mostrado abaixo -
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String msg) {
this.message = msg;
}
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException {
if (message != null) {
/* Use message from attribute */
JspWriter out = getJspContext().getOut();
out.println( message );
} else {
/* use message from the body */
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
O nome do atributo é "message", então o método setter é setMessage(). Vamos agora adicionar este atributo no arquivo TLD usando o<attribute> elemento da seguinte forma -
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
Vamos seguir JSP com o atributo de mensagem da seguinte forma -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello message = "This is custom tag" />
</body>
</html>
Isso produzirá o seguinte resultado -
This is custom tag
Considere incluir as seguintes propriedades para um atributo -
S.No. | Propriedade e finalidade |
---|---|
1 | name O elemento name define o nome de um atributo. Cada nome de atributo deve ser exclusivo para uma tag específica. |
2 | required Isso especifica se este atributo é obrigatório ou opcional. Seria falso para opcional. |
3 | rtexprvalue Declara se um valor de expressão de tempo de execução para um atributo de tag é válido |
4 | type Define o tipo de classe Java deste atributo. Por padrão, é assumido comoString |
5 | description A descrição informativa pode ser fornecida. |
6 | fragment Declara se este valor de atributo deve ser tratado como um JspFragment. |
A seguir está o exemplo para especificar propriedades relacionadas a um atributo -
.....
<attribute>
<name>attribute_name</name>
<required>false</required>
<type>java.util.Date</type>
<fragment>false</fragment>
</attribute>
.....
Se estiver usando dois atributos, você pode modificar seu 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>
.....