12 ) Como criar minhas próprias tags utilizando o Mentawai?
Qualquer projeto sério exigirá o desenvolvimento de novas tags para a camada view, pois sempre haverá uma complexidade ou lógica que você não deve deixar "jogada" no meio do HTML.
O Mentawai suporta de uma maneira muito simples e eficiente a criação de novas tags que já estarão automaticamente integradas com o framework. Veja os exemplos abaixo:
org.mentawai.tag.util.PrintTag: Tag para imprimir alguma coisa na tela.
Code:
public class PrintSomething extends PrintTag {
@Override
public String getStringToPrint() throws JspException {
String s = getMyString(); // lógica louca e complexa para obter sua string está aqui...
return s;
}
}
E no seu taglib.tld vc coloca: (isso é especificação da API de Servlets e não do Mentawai, é claro!)
Code:
<tag>
<name>printSomething</name>
<tag-class>org.myproject.tag.PrintSomething</tag-class>
<body-content>empty</body-content>
<display-name></display-name>
</tag>
E para usar a tag:
Code:
<minhasTags:printSomething />
Além da simplicidade do código acima, o grande barato é que sua tag já terá disponível os seguintes membros protected: application (ServletContext), session (HttpSession), req (HttpServletRequest), res (HttpServletResponse), action (org.mentawai.core.Action) e loc (java.util.Locale). Vale notar que a action só será diferente de null se a página onde a tag estiver contida estiver recebendo um forward de alguma action, ou seja, se você estiver acessando a página diretamente pelo browser (Ex: http://www.mysite.com/mypage.jsp) a action será nula como tem que ser.
Outra facilidade interessante que você já recebe de mão-beijada da classe pai (PrintTag) é o atributo max, que vai limitar o tamanho da string impressa em um número máximo de caracteres, colocando "..." no final.
Para usar esse atributo nas suas tags, tudo que vc tem que fazer é adicioná-lo no arquivo tld.
Code:
<tag>
<name>printSomething</name>
<tag-class>org.myproject.tag.PrintSomething</tag-class>
<body-content>empty</body-content>
<display-name></display-name>
<attribute>
<name>max</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>int</type>
</attribute>
</tag>
E para usá-la:
Code:
<minhasTags:printSomething max="300" />
org.mentawai.tag.util.ConditionalTag: Tag que só mostra o seu conteúdo se alguma condição for verdadeira.
Veja a implementação abaixo da tag do Mentawai isNull:
Code:
package org.mentawai.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import org.mentawai.tag.util.ConditionalTag;
import org.mentawai.tag.util.Context;
public class IsNull extends ConditionalTag {
private String test = null;
public void setTest(String test) {
this.test = test;
}
public boolean testCondition() throws JspException {
if (test != null) {
// O atributo test está presente, então estamos querendo
// algum valor que está no pageContext, output, session ou application
// nessa ordem...
// O ultimo parametro do método abaixo (false) serve para indicar que não queremos procurar
// por tipos booleanos através dos métodos isMyObject (assumindo que o valor de test seja "myObject")
Object value = Out.getValue(test, pageContext, false);
if (value == null) return true;
return false;
}
// o atributo test não foi passado, então temos que estar falando de um contexto, ou seja,
// deverá haver uma tag do tipo Context englobando essa tag e que fornecerá o objeto
// para o teste da tag isNull.
Tag parent = findAncestorWithClass(this, Context.class);
if (parent == null) {
throw new JspException("IsNull: Could not find context!");
}
Context tag = (Context) parent;
return tag.getObject() == null;
}
}
E no arquivo TLD:
Code:
<tag>
<name>isNull</name>
<tag-class>org.mentawai.tag.IsNull</tag-class>
<body-content>JSP</body-content>
<display-name></display-name>
<attribute>
<name>negate</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
<attribute>
<name>test</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
Repare que da mesma maneira que a tag PrintTag, a tag ConditionalTag também fornece os membros protected: application, session, req, res, action e loc.
Repare que a tag base ConditionalTag tb já implementa de mão-beijada o atributo "negate", que funciona basicamente como um ELSE, ou seja, ele é a negaçao da condiçao.
Logo para usar a tag condicional isNull vc faz:
Code:
<mtw:isNull test="mySuperObject">
<h1>Não consegui achar em lugar nenhum um objeto com o nome "mySuperObject"</h1>
</mtw:isNull>
<mtw:isNull test="mySuperObject" negate="true">
<h1>Parabéns! Aqui está o objeto super object: <mtw:out value="mySuperObject" /></h1>
</mtw:isNull>
<mtw:bean value="mySuperObject">
<mtw:isNull>
<h1> mySuperOjbect está null! </h1>
</mtw:isNull>
<mtw:isNull negate="true">
<h1> mySuperOjbect não está null! </h1>
</mtw:isNull>
</mtw:bean>
org.mentawai.tag.LoopTag: Tag para loopar itens de uma Collection qualquer!
(Coming soon...)