<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic " 12 ) Como criar minhas próprias tags utilizando o Mentawai?"]]></title>
		<link>http://forum.mentaframework.org/posts/list/19.page</link>
		<description><![CDATA[Latest messages posted in the topic " 12 ) Como criar minhas próprias tags utilizando o Mentawai?"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title> 12 ) Como criar minhas próprias tags utilizando o Mentawai?</title>
				<description><![CDATA[ <font color='blue'><b> 12 ) Como criar minhas próprias tags utilizando o Mentawai? </b></font>

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:

 :arrow: <b>org.mentawai.tag.util.PrintTag</b>: Tag para imprimir alguma coisa na tela.

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>

public class PrintSomething extends PrintTag {
    
        @Override
	public String getStringToPrint&#40;&#41; throws JspException {

            String s = getMyString&#40;&#41;; // lógica louca e complexa para obter sua string está aqui...

            return s;

        }
}
</pre>
		</div>

E no seu taglib.tld vc coloca: (isso é especificação da API de Servlets e não do Mentawai, é claro!)

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;tag&gt;
	&lt;name&gt;printSomething&lt;/name&gt;
	&lt;tag-class&gt;org.myproject.tag.PrintSomething&lt;/tag-class&gt;
	&lt;body-content&gt;empty&lt;/body-content&gt;
	&lt;display-name&gt;&lt;/display-name&gt;
&lt;/tag&gt;
</pre>
		</div>

E para usar a tag:

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;minhasTags:printSomething /&gt;
</pre>
		</div>

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), <font color='blue'><b>action</b> (org.mentawai.core.Action)</font> 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.

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;tag&gt;
	&lt;name&gt;printSomething&lt;/name&gt;
	&lt;tag-class&gt;org.myproject.tag.PrintSomething&lt;/tag-class&gt;
	&lt;body-content&gt;empty&lt;/body-content&gt;
	&lt;display-name&gt;&lt;/display-name&gt;
	&lt;attribute&gt;
		&lt;name&gt;max&lt;/name&gt;
		&lt;required&gt;false&lt;/required&gt;
		&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
		&lt;type&gt;int&lt;/type&gt;
	&lt;/attribute&gt;
&lt;/tag&gt;
</pre>
		</div>

E para usá-la:

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;minhasTags:printSomething max="300" /&gt;
</pre>
		</div>

 :arrow: <b>org.mentawai.tag.util.ConditionalTag</b>: Tag que só mostra o seu conteúdo se alguma condição for verdadeira.

Veja a implementação abaixo da tag do Mentawai isNull:

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
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&#40;String test&#41; {
        this.test = test;
    }
    
    public boolean testCondition&#40;&#41; throws JspException {
        
	if &#40;test != null&#41; {

            // 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 &#40;false&#41; serve para indicar que não queremos procurar
            // por tipos booleanos através dos métodos isMyObject &#40;assumindo que o valor de test seja "myObject"&#41;
			
            Object value = Out.getValue&#40;test, pageContext, false&#41;;
            
            if &#40;value == null&#41; 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&#40;this, Context.class&#41;;		
        
        if &#40;parent == null&#41; {
        	
            throw new JspException&#40;"IsNull: Could not find context!"&#41;;
        	
        }
            
	Context tag = &#40;Context&#41; parent;
	
	return tag.getObject&#40;&#41; == null;
           
    }
}
</pre>
		</div>

E no arquivo TLD:

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;tag&gt;
	&lt;name&gt;isNull&lt;/name&gt;
	&lt;tag-class&gt;org.mentawai.tag.IsNull&lt;/tag-class&gt;
	&lt;body-content&gt;JSP&lt;/body-content&gt;
	&lt;display-name&gt;&lt;/display-name&gt;
	&lt;attribute&gt;
		&lt;name&gt;negate&lt;/name&gt;
		&lt;required&gt;false&lt;/required&gt;
		&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
		&lt;type&gt;boolean&lt;/type&gt;
	&lt;/attribute&gt;
	&lt;attribute&gt;
		&lt;name&gt;test&lt;/name&gt;
		&lt;required&gt;false&lt;/required&gt;
		&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
		&lt;type&gt;java.lang.String&lt;/type&gt;
	&lt;/attribute&gt;
&lt;/tag&gt;
</pre>
		</div>

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:

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>

&lt;mtw:isNull test="mySuperObject"&gt;

    &lt;h1&gt;Não consegui achar em lugar nenhum um objeto com o nome "mySuperObject"&lt;/h1&gt;

&lt;/mtw:isNull&gt;

&lt;mtw:isNull test="mySuperObject" negate="true"&gt;

     &lt;h1&gt;Parabéns! Aqui está o objeto super object: &lt;mtw:out value="mySuperObject" /&gt;&lt;/h1&gt;

&lt;/mtw:isNull&gt;

&lt;mtw:bean value="mySuperObject"&gt;

    &lt;mtw:isNull&gt;
        &lt;h1&gt; mySuperOjbect está null! &lt;/h1&gt;          
    &lt;/mtw:isNull&gt;

    &lt;mtw:isNull negate="true"&gt;
        &lt;h1&gt; mySuperOjbect não está null! &lt;/h1&gt;          
    &lt;/mtw:isNull&gt;

&lt;/mtw:bean&gt;

</pre>
		</div>

 :arrow:  <b>org.mentawai.tag.LoopTag</b>: Tag para loopar itens de uma Collection qualquer!

<i>(Coming soon...)</i>

]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/766.page#6049</guid>
				<link>http://forum.mentaframework.org/posts/list/766.page#6049</link>
				<pubDate><![CDATA[Mon, 18 Dec 2006 21:09:11]]> GMT</pubDate>
				<author><![CDATA[ boaglio]]></author>
			</item>
			<item>
				<title> 12 ) Como criar minhas próprias tags utilizando o Mentawai?</title>
				<description><![CDATA[ <p></p>

		<cite>boaglio wrote:</cite><br>
		<blockquote>
  ...

 :arrow:  <b>org.mentawai.tag.LoopTag</b>: Tag para loopar itens de uma Collection qualquer!

<i>(Coming soon...)</i>

&nbsp;
		</blockquote>

Ô rapaz isso ia ser bom, estou tentado fazer uma tag parecida. Já li o fonte da LoopTag mas confesso que não entendi muita coisa.]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/766.page#17705</guid>
				<link>http://forum.mentaframework.org/posts/list/766.page#17705</link>
				<pubDate><![CDATA[Tue, 20 Jul 2010 12:39:43]]> GMT</pubDate>
				<author><![CDATA[ Daniel Lima]]></author>
			</item>
			<item>
				<title>Re: 12 ) Como criar minhas próprias tags utilizando o Mentawai?</title>
				<description><![CDATA[ Essa tag já existe !!

&lt;mtw:loop...&gt;]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/766.page#18151</guid>
				<link>http://forum.mentaframework.org/posts/list/766.page#18151</link>
				<pubDate><![CDATA[Wed, 10 Nov 2010 17:54:17]]> GMT</pubDate>
				<author><![CDATA[ ricardojlrufino]]></author>
			</item>
	</channel>
</rss>
