English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Rótulos personalizados são elementos da linguagem JSP definidos pelo usuário. Quando uma página JSP contém um rótulo personalizado, ele é convertido em servlet, e o rótulo é convertido em operações para ser Operações do objeto chamado tag handler, que são chamadas pelo Web container quando o servlet é executado.
A extensão de rótulos JSP permite que você crie novos rótulos e os insira diretamente em uma página JSP. JSP 2A especificação .0 introduziu Simple Tag Handlers para escrever esses rótulos personalizados.
Você pode herdar a classe SimpleTagSupport e sobrescrever o método doTag() para desenvolver o rótulo personalizado mais simples.
Em seguida, queremos criar um rótulo personalizado chamado <ex:Hello>, o formato do rótulo é:
<ex:Hello />
Para criar um rótulo JSP personalizado, você deve primeiro criar uma classe Java que manipula o rótulo. Portanto, vamos criar uma classe HelloTag, conforme mostrado a seguir:
package com.w3codebox; 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 seguinte código sobrescreve 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 os classes acima, copie-as para o diretório CLASSPATH da variável de ambiente. Finalmente, crie a seguinte biblioteca de rótulos: <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.w3codebox.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
A seguir, podemos usar o rótulo Hello no arquivo JSP:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello/> </body> </html>
O resultado de saída do programa acima é:
Hello Custom Tag!
Você pode incluir o conteúdo da mensagem no rótulo, como a biblioteca de rótulos padrão. Se quisermos incluir conteúdo no nosso personalizado Hello, o formato é o seguinte:
<ex:Hello> This is message body </ex:Hello>
Podemos modificar o arquivo da classe do processador de rótulo, o código é o seguinte:
package com.w3codebox; 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()); } }
Em seguida, precisamos modificar o arquivo TLD, conforme mostrado a seguir:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemplo TLD com Corpo</short-name> <tag> <name>Hello</name> <tag-class>com.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
Agora podemos usar o rótulo modificado no JSP, conforme mostrado a seguir:
<%@ 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>
O resultado de saída do programa acima é mostrado a seguir:
This is message body
Você pode configurar várias propriedades no padrão personalizado, para receber propriedades, a classe de rótulo personalizado deve implementar o método setter, o método setter no JavaBean é mostrado a seguir:
package com.w3codebox; 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) { /* Usar mensagem da propriedade */ JspWriter out = getJspContext().getOut(); out.println( message ); } else { /* Usar mensagem do corpo do conteúdo */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } } }
O nome do atributo é "message", então o método setter é setMessage(). Agora vamos adicionar este atributo no elemento <attribute> do arquivo TLD:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Exemplo TLD com Corpo</short-name> <tag> <name>Hello</name> <tag-class>com.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
Agora podemos usar a propriedade message em arquivos JSP, conforme exemplo a seguir:
<%@ 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>
O resultado da saída do exemplo acima é:
This is custom tag
Você ainda pode incluir os seguintes atributos:
Atributo | Descrição |
---|---|
name | Define o nome do atributo. O nome do atributo de cada tag deve ser único. |
required | especifica se o atributo é obrigatório ou opcional. Se definido como false, é opcional. |
rtexprvalue | declara se o atributo é válido no tempo de execução da expressão. |
type | Define o tipo de classe Java do atributo. O valor padrão é String |
description | informação descritiva |
fragment | Se declarado, o valor do atributo será tratado como um JspFragment。 |
A seguir está um exemplo de atributo relacionado especificado:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
Se você usou dois atributos, modifique o arquivo TLD conforme abaixo:
..... <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> .....