[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

12 ) Como criar minhas próprias tags utilizando o Mentawai?  XML
Forum Index -> F.A.Q.
Author Message
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

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...)


http://www.boaglio.com
[WWW]
Daniel Lima



Joined: 08/07/2009 14:48:10
Messages: 16
Offline

boaglio wrote:

...

org.mentawai.tag.LoopTag: Tag para loopar itens de uma Collection qualquer!

(Coming soon...)

 


Ô 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.
ricardojlrufino


[Avatar]

Joined: 30/03/2008 20:07:28
Messages: 227
Location: Teresina PI
Offline

Essa tag já existe !!

<mtw:loop...>

Ricardo JL Rufino <ricardo.jl.rufino@gmail.com> < UNYK > :: Q4Soft :: Teresina - PI
"Existe apenas um bem, o saber, e apenas um mal, a ignorância" - Sócrates
"Devemos julgar um homem mais pelas suas perguntas que pelas respostas" - Voltaire




Mentawai Developer

[WWW] [MSN]
 
Forum Index -> F.A.Q.
Go to:   
Powered by JForum 2.1.6 © JForum Team