Added: velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html URL: http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html?rev=1854714&view=auto ============================================================================== --- velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html (added) +++ velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html Sun Mar 3 13:56:00 2019 @@ -0,0 +1,2285 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + + + + + + + + + + +<html> + <head> + <title>Apache Velocity - GuÃa del Usuario de Velocity</title> + <style type="text/css" media="all"> + @import url("../css/maven-base.css"); + @import url("../css/maven-theme.css"); + @import url("../css/site.css"); + </style> + <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" /> + <link rel="alternate" href="http://feeds.feedburner.com/ApacheVelocitySiteNews" type="application/rss+xml" title="Apache Velocity - GuÃa del Usuario de Velocity News" /> + <meta name="author" content="Velocity Documentation Team" /> + <meta name="author" content="John Castura" /> + <meta name="author" content="Juan Pablo Morales" /> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + </head> + <body class="composite"> + <div id="banner"> + <a href="../../" id="bannerLeft"> + + <img src="../images/velocity_project_wide.png" alt="" /> + + </a> + <span id="bannerRight"> + + <img src="../images/velocity-logo.png" alt="" /> + + </span> + <div class="clear"> + <hr/> + </div> + </div> + <div id="breadcrumbs"> + + + + + + + + + <div class="xleft"> + + <a href="http://www.apache.org/">Apache</a> + > + + <a href="../../../">Velocity</a> + > + + <a href="../">Velocity Engine</a> + </div> + <div class="xright"> <a href="../">Engine</a> + | + <a href="../../../tools/devel/">Tools</a> + | + <a href="../../../anakia/devel/">Anakia</a> + | + <a href="../../../texen/devel/">Texen</a> + | + <a href="../../../docbook/">DocBook</a> + | + <a href="../../../dvsl/devel/">DVSL</a> + + + + + + + + + </div> + <div class="clear"> + <hr/> + </div> + </div> + <div id="leftColumn"> + <div id="navcolumn"> + + + + + + + + + <h5>Velocity</h5> + <ul> + + <li class="none"> + <a href="../index.html">General</a> + </li> + + <li class="none"> + <a href="../overview.html">Overview</a> + </li> + + <li class="none"> + <a href="../getting-started.html">Getting Started</a> + </li> + + <li class="none"> + <a href="../webapps.html">Web Applications</a> + </li> + + <li class="none"> + <a href="../../../download.cgi">Download</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/VelocityFAQ">FAQ (Wiki)</a> + </li> + </ul> + <h5>Docs</h5> + <ul> + + <li class="none"> + <a href="../user-guide.html">User Guide</a> + </li> + + <li class="none"> + <a href="../developer-guide.html">Developer Guide</a> + </li> + + <li class="none"> + <a href="../vtl-reference-guide.html">VTL Reference</a> + </li> + + <li class="none"> + <a href="../glossary.html">Glossary</a> + </li> + </ul> + <h5>Developers</h5> + <ul> + + <li class="none"> + <a href="../license.html">License</a> + </li> + + <li class="none"> + <a href="../apidocs/index.html">Javadoc</a> + </li> + + <li class="none"> + <a href="../changes-report.html">Changes</a> + </li> + + <li class="none"> + <a href="../jira-report.html">Resolved Issues</a> + </li> + + <li class="none"> + <a href="../upgrading.html">Upgrading</a> + </li> + + <li class="none"> + <a href="../jar-dependencies.html">Dependencies</a> + </li> + + <li class="none"> + <a href="http://svn.apache.org/viewvc/velocity/engine/trunk/">Source Code Repository</a> + </li> + + <li class="none"> + <a href="../build.html">Building from Source</a> + </li> + </ul> + <h5>Community</h5> + <ul> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/">Wiki</a> + </li> + + <li class="none"> + <a href="../../../news.html">Recent News</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/PoweredByVelocity">Powered By Velocity</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/VelocityEditors">IDE/Editor Plugins</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/PublishedArticlesAndBooks">Articles and Books</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/GetInvolved">Get Involved</a> + </li> + + <li class="none"> + <a href="../../../contact.html">Mailing Lists</a> + </li> + </ul> + <h5>Velocity Development</h5> + <ul> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/RoadMap">Road Map</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/CodeStandards">Coding Standards</a> + </li> + + <li class="none"> + <a href="http://wiki.apache.org/velocity/DocumentationGuidelines">Documentation Guidelines</a> + </li> + + <li class="none"> + <a href="https://issues.apache.org/jira/browse/VELOCITY">Issues</a> + </li> + + <li class="none"> + <a href="../../../who-we-are.html">Who we are</a> + </li> + </ul> + <h5>Translations</h5> + <ul> + + <li class="none"> + <a href="http://www.jajakarta.org/velocity/">Site (Japanese)</a> + </li> + + <li class="none"> + <a href="../translations/user-guide_fi.html">User's Guide (Finnish)</a> + </li> + + <li class="none"> + <a href="../translations/user-guide_fr.html">User's Guide (French)</a> + </li> + + <li class="none"> + <strong>User's Guide (Spanish)</strong> + </li> + </ul> + <h5>Project Documentation</h5> + <ul> + + + + + + + + + + + + + + <li class="collapsed"> + <a href="../project-info.html">Project Information</a> + </li> + + + + + + + + + + + + + + + + + + + + + + + + + + <li class="collapsed"> + <a href="../project-reports.html">Project Reports</a> + </li> + </ul> + + + + <a class="poweredBy" href="../../../" title="Apache Velocity" ><img class="poweredBy" alt="Apache Velocity" src="../images/pbv90x30.png" /></a> + + + + <a class="poweredBy" href="../../../rss/news.rss" title="Velocity News Feed" ><img class="poweredBy" alt="Velocity News Feed" src="../images/feed-icon-24x24.jpg" /></a> + + <iframe src="http://www.apache.org/ads/buttonbar.html" + style="border-width:0; float: left" frameborder="0" scrolling="no" + width="135" + height="265" ></iframe> + + + + + + + + + + </div> + </div> + <div id="bodyColumn"> + <div id="contentBox"> + <div class="section"><h2><a name="Tabla_de_Contenidos"></a>Tabla de Contenidos</h2> +<ol type="1"><li><a href="#AcercadeestaguÃa">Acerca de esta guÃa</a></li> +<li><a href="#¿QuéesVelocity?">¿Qué es Velocity?</a></li> +<li><a href="#¿QuépuedehacerVelocitypormi?">¿Qué puede hacer Velocity por mi?</a><ol type="1"><li><a href="#ElEjemplodelatiendadeLodo">El Ejemplo de la tienda de + Lodo</a></li> +</ol> +</li> +<li><a href="#ElLenguajedePlantillasdeVelocity(VTL):UnaIntroducción">El Lenguaje de Plantillas de Velocity (VTL): Una Introducción</a></li> +<li><a href="#¡HolaMundoVelocity!">¡Hola Mundo Velocity!</a></li> +<li><a href="#Comentarios">Comentarios</a></li> +<li><a href="#Referencias">Referencias</a><ol type="1"><li><a href="#Variables">Variables</a></li> +<li><a href="#Propiedades">Propiedades</a></li> +<li><a href="#Métodos">Métodos</a></li> +</ol> +</li> +<li><a href="#NotaciónFormaldeReferencias">Notación Formal de Referencias</a></li> +<li><a href="#NotaciónSileciosadeReferencias">Notación Sileciosa de Referencias</a></li> +<li><a href="#Literalmente">Literalmente</a><ol type="1"><li><a href="#Dinero">Dinero</a></li> +<li><a href="#EscapandoReferenciasVTLVálidas">Escapando Referencias VTL Válidas</a></li> +</ol> +</li> +<li><a href="#SustitucióndeMayúsculasyMinúsculas">Sustitución de Mayúsculas y Minúsculas</a></li> +<li><a href="#Directivas">Directivas</a><ol type="1"><li><a href="#Set">Set</a></li> +<li><a href="#CadenasdeCaracteres">Cadenas de Caracteres</a></li> +<li><a href="#SentenciasIf-Else">Sentencias If-Else</a><ol type="1"><li><a href="#OperadoresLógicosyRelacionales">Operadores Lógicos y Relacionales</a></li> +</ol> +</li> +<li><a href="#CiclosForeach">Ciclos Foreach</a></li> +<li><a href="#Include">Include</a></li> +<li><a href="#Parse">Parse</a></li> +<li><a href="#Stop">Stop</a></li> +<li><a href="#Velocimacros">Velocimacros</a></li> +</ol> +</li> +<li><a href="#EscapandoDirectivasVTL">Escapando Directivas VTL</a></li> +<li><a href="#VTL:AsuntosdeFormato">VTL: Asuntos de Formato</a></li> +<li><a href="#OtrasCaracterÃsticasyMiscelánea">Otras CaracterÃsticas y Miscelánea</a><ol type="1"><li><a href="#Matemáticas">Matemáticas</a></li> +<li><a href="#ElOperadordeRango">El Operador de Rango</a></li> +<li><a href="#TemasAvanzados:Escapandoy!">Temas Avanzados: Escapando y !</a></li> +<li><a href="#MisceláneadeVelocimacro">Miscelánea de Velocimacro</a></li> +<li><a href="#ConcatenacióndeCadenas">Concatenación de Cadenas</a></li> +</ol> +</li> +<li><a href="#Retroalimentación">Retroalimentación</a></li> +</ol> +</div> +<div class="section"><h2><a name="Acerca_de_esta_guÃa"></a>Acerca de esta guÃa</h2> +<p> +La GuÃa del usuario de Velocity busca ayudar a los diseñadores de páginas y a +los proveedores de contenido a sentirse a gusto con Velocity y con la sintáxis +de su simple pero poderoso lenguaje de script, el Lenguaje de Plantillas de +Velocity (VTL por sus siglas en inglés). Muchos de los ejemplos de esta guÃa +muestran como usar Velocity para incluir contenidos dinámicos en sitios web, +pero todos los ejemplos de VTL son igualmente aplicables a otras páginas y +plantillas. +</p> +<p>Gracias por escoger Velocity!</p> +</div> +<div class="section"><h2><a name="aQué_es_Velocity"></a>¿Qué es Velocity?</h2> +<p> +Velocity es un motor de plantillas basado en Java. Le permite a los diseñadores +de páginas hacer referencia a métodos definidos dentro del código Java. Los +diseñadores Web pueden trabajar en paralelo con los programadores Java para +desarrollar sitios de acuerdo al modelo de Modelo-Vista-Controlador (MVC), +permitiendo que los diseñadores se concentren únicamente en crear un sitio bien +diseñado y que los programadores se encarguen solamente de escribir código de +primera calidad. Velocity separa el código Java de las páginas Web, haciendo el +sitio más mantenible a largo plazo y presentando una alternativa viable a <a href="http://java.sun.com/products/jsp/" class="externalLink">Java Server Pages</a> (JSP) o <a href="http://www.php.net" class="externalLink">PHP</a>. +</p> +<p> +Velocity se puede utilizar para crear páginas web, SQL, PostScript y cualquier +otro tipo de salida de plantillas. Se puede utilizar como una aplicación +independiente para generar código fuente y reportes, o como un componente +integrado en otros sistemas. Cuando este completo Velocity proveerá servicios +para el conjunto de aplicaciones web de <a href="http://jakarta.apache.org/turbine" class="externalLink">Turbine</a>. Velocity+Turbine +proveerá un servicio de plantillas que facilitará el desarrollo de aplicaciones +web de acuerdo a un verdadero modelo MVC. +</p> +</div> +<div class="section"><h2><a name="aQué_puede_hacer_Velocity_por_mi"></a>¿Qué puede hacer Velocity por mi?</h2> +<div class="section"><h3><a name="El_Ejemplo_de_la_tienda_de_Lodo"></a>El Ejemplo de la tienda de Lodo</h3> +<p> +Suponga que usted es un diseñador para una tienda en lÃnea que se especializa +en vender lodo a la que llamaremos "La Tienda de Lodo en lÃnea". Los negocios +están muy bien. Sus clientes ordenan diferentes tipos y cantidades de +lodo. +Ellos ingresan en su sitio con su nombre de usuario y su clave secreta, lo que +les permite ver sus órdenes y pedir más lodo. En estos momentos el Lodo +Terracota, que es muy popular, esta en oferta. Una minorÃa de sus clientes +usualmente compra Lodo Rojo Brillante, que también esta en oferta, pero no es +tan popular y usualmente esta relegado al márgen de su página web. La +información sobre cada cliente esta dentro de su base de datos por lo que surge +la pregunta: ¿Por qué no usar Velocity para enfocar las ofertas especiales para +los clientes que están más interesados en ciertas clases de lodo? +</p> +<p> +Velocity hace fácil el personalizar las páginas para sus visitantes. Como un +diseñador dentro de "El Cuarto de Lodo", usted quiere crear la página que sus +usuarios verán después de entrar a su sitio. +</p> +<p> +Usted se encuentra con los ingenieros de su compañÃa, y todos acuerdan que +<em>$cliente</em> contendrá la información pertienente al cliente que está +dentro de la página en un momento dado, que <em>$lodosEnOferta</em> contendrá +todos los tipos de lodo que están en oferta hoy en dÃa. Además, el objeto +<em>$flogger</em> contendrá métodos para ayudar con la promoción. Para la tarea +actual, solo se utilizarán estas tres referencias. Recuerde, usted no necesita +preocuparse por como los ingenieros de software extraen la información +necesaria de la base de datos; sólo tiene que saber que funciona. Esto le +permite a usted continuar con su trabajo a la vez que deja a los ingenieros +hacer el de ellos. +</p> +<p>Usted podrÃa incluir el siguiente código VTL dentro de su página:</p> +<div class="source"><pre> + +<HTML> +<BODY> +Hello $cliente.Nombre! +<table> +#foreach( $lodo in $lodosEnOferta ) +#if ( $cliente.haComprado($lodo) ) +<tr> +<td> +$flogger.obtenerPromocion( $lodo ) +</td> +</tr> +#end +#end +</table> + +</pre> +</div> +<p> +Los detalles exactos de la sentencia <i>foreach</i> serán descritos en +profundidad próximamente; lo que es importante es el impacto que este pequeño +script pueda tener en su sitio. Cuando un cliente con una debilidad por el +Lodo Rojo Brillante ingrese, si el Lodo Rojo Brillante esta en oferta, eso +será lo que el cliente verá, de manera prominente. Si otro cliente, con una +historia larga de compras de Lodo Terracota ingresa, entonces para él la +noticia de un rebaja de Lodo Terracota estará en un lugar muy importante. La +flexibilidad de Velocity es enorme y sólo esta limitada por su creatividad. +</p> +<p> +En la referencia de VTL están documentados muchos otros elementos de Velocity +que, colectivamente le dan el poder y la flexibilidad que usted necesita para +hacer de su sitio en la red una <em>presencia</em> en la red. A medida que +usted se familiarice con estos elementos usted comenzará a aprovechar el poder +de Velocity. +</p> +</div> +</div> +<div class="section"><h2><a name="El_Lenguaje_de_Plantillas_de_Velocity_VTL:_Una_Introducción"></a>El Lenguaje de Plantillas de Velocity (VTL): Una Introducción</h2> +<p> + El Lenguaje de Plantillas de Velocity (VTL) fue creado para prover la + manera mas fácil, simple y limpia de incorporar contenido dinámico + dentro de una página web. Incluso un desarrollador de páginas web con + poca y ninguna experiencia puede rápidamente ser capaz de utilizar VTL + para incluir contenido dinámico en un sitio web. + </p> +<p> + VTL usa <em>referencias</em> para incluir contenido dinámico dentro + de un sitio web. Una variable es un tipo de referencia que puede + referirse a algo definido dentro del código Java o obtener su valor + de un <em>enunciado</em> VTL en la página misma. A continuación hay + un ejemplo de un enunciado VTL que se puede incluir en un documento + HTML: + </p> +<div class="source"><pre> +#set( $a = "Velocity" ) +</pre> +</div> +<p> + Este enunciado VTL, como todos los enunciados VTL comienza con el + caracter <em>#</em> y contiene una directiva: <em>set</em>. Cuando + un visitante solicita su página, el Motor de Plantillas de Velocity + buscará dentro del contenido de su página y encontrará todos los + sÃmbolos <em>#</em>, para luego determinar cuáles marcan el comienzo + de enunciados VTL y cuáles no tienen nada que ver con VTL. + </p> +<p> + El caracter <em>#</em> viene seguido por una directiva <em>set</em>. + La directiva <em>set</em> utiliza una expresión (encerrada entre + paréntesis) -- una ecuación que asigna un <em>valor</em> a una + <em>variable</em>. + La variable se encuentra en el lado derecho y el valor está en el lado + izquierdo; los dos se encuentran separados por un signo igual + (<em>=</em>). + </p> +<p> + En el ejemplo en la parte superior, la variable es <em>$a</em> y el + valor es <em>Velocity</em>. Esta variable, al igual que todas las + referencias, comienza con el caracter <em>$</em>. Los valores siempre + se encuentran ente comillas; con Velocity no hay confusión acerca de + los tipos de datos, ya que solamente cadenas (información basada en + texto) pueden ser pasados a las variables. + </p> +<p> + La siguiente regla puede ser útil para entender mejor como funciona + Velocity: <strong>Las Referencias comienzan con <em>$</em> y se + utilizan para obtener algo. Las directivas comienzan con <em>#</em> + y se utilizan para hacer algo</strong></p> +<p> + En el ejemplo anterior <em>#set</em> se utilizó para asignarle un valor + a una variable. La variable, <em>$a</em>, puede utilizarse dentro de la + plantilla para escribir la palabara "Velocity". + </p> +</div> +<div class="section"><h2><a name="aHola_Mundo_Velocity"></a>¡Hola Mundo Velocity!</h2> +<p> + Una vez un valor ha sido asignado a una variable, usted puede + referenciar la variable en cualquier lugar dentro del documento + HTML. En el ejemplo siguiente, un valor es asignado a la variable + <em>$foo</em>, que luego es referenciada. + </p> +<div class="source"><pre> +<html> +<body> +#set( $foo = "Velocity" ) +¡Hola Mundo $foo! +</body> +<html> +</pre> +</div> +<p> + El resultado es una página web que imprime "¡Hola Mundo Velocity!" + </p> +<p> + Para hacer los enunciados con directivas VTL más legibles, nosotros le + recomendamos comenzar cada enunciado VTL en una nueva lÃnea, aunque + usted no esta obligado a hacerlo asÃ. La directiva <em>set</em> ser + verá con mayor detalle más adelante. + </p> +</div> +<div class="section"><h2><a name="Comentarios"></a>Comentarios</h2> +<p> +Los comentarios es posible incluir texto que no aparecerá como parte de +la salida del motor de plantillas. Los comentarios sirven para recordar +e indicar a otros que es lo que están haciendo los enunciados VTL, o +para cualquier otro propósito que usted considere útil. A continuación +hay un ejemplo de un comentario de VTL. +</p> +<div class="source"><pre> +## Este es un comentario de una sola lÃnea +</pre> +</div> +<p> + Un comentario de una sola lÃnea comienza con <em>##</em> y termina + al final de la lÃnea. Si usted desea escribir varias lÃneas de + comentario no es necesario tener numerosos comentarios de una sóla + lÃnea. Los comentarios de varias lÃneas, que comienzan con + <em>#*</em> y terminan con <em>*#</em> le permiten manejar + fácilmente esta situación. + </p> +<div class="source"><pre> + Este es un texto que esta fuera de un comentario de múltiples lÃneas. + Los visitantes de su página lo pueden ver. + +#* + He aquà un comentario de varias lÃneas. Los visitantes + de su sitio no verán esto, ya que el Motor de Plantillas + de Velocity lo ignorará +*# + +Aquà hay texto fuera del comentario, este si es visible. +</pre> +</div> +<p> + A continuación hay algunos ejemplos para aclarar como funcionan + los comentarios de una y varias lÃneas: + </p> +<div class="source"><pre> +Este texto es visible. ## Este no lo es +Este texto es visible. +Este texto es visible. #* Este texto, como parte de un comentario de +varias lÃneas, no es visible. Este texto no es visible; tambiés es parte +del comentario. Este texto aún no es visible. *# Este texto esta fuera +del comentario, por lo que es visible. +## Este texto no es visible. +</pre> +</div> +<p> + Existe un tercer tipo de comentario, el bloque de comentario VTL, + que puede ser utilizado para almacenar datos como el autor y la + información de versiones: +</p> +<div class="source"><pre> +#** +Este es un bloque de comentario VTL y +puede utilizarse para almacenar datos +como el nombre del autor y la +información de versiones: +@author +@version 5 +*# +</pre> +</div> +</div> +<div class="section"><h2><a name="Referencias"></a>Referencias</h2> +<p> + Existen tres tipos de referencias en VTL: variables, propiedades y + métodos. Como un diseñador que utilizar VTL, usted y sus ingenieros + deben llegar a un acuerdo respecto a los nombres de las referencias + para que usted pueda utilizarlas correctamente en sus plantillas. + </p> +<p> + Todo lo que entra y sale de una referencia se trata como una cadena + de caracteres (un objeto String). Si existe un objeto que representa + <em>$foo</em> (por ejemplo, un objeto Integer), entonces Velocity + llamará el método <code>.toString()</code> de ese objeto para + convertirlo en una cadena de caracteres. + </p> +<p><a name="Variables"><strong>Variables</strong></a><br /> + + La notación breve de una variable esta compuesta por un signo "$" + inicial seguido de un <em>Identificador</em>. Un identificador VTL + debe comenzar con un caracter alfabético (a .. z ó A .. Z). El resto + de los caracteres deb ser de alguno de los siguiente tipos: + </p> +<p><ul><li>alfabético (a .. z, A .. Z)</li> +<li>numérico (0 .. 9)</li> +<li>lÃnea ("-")</li> +<li>underscore ("_")</li> +</ul> +</p> +<p> + A continuación hay algunos ejemplos de referencias válidas en VTL: + </p> +<div class="source"><pre> +$foo +$lanzaLodo +$lanza-lodo +$lanza_lodo +$lanzaLodo1 +</pre> +</div> +<p> + Cuando VTL hace referencia una variable, po ejemplo, <em>$foo</em>, + la variable puede obtener su valor de una directiva <em>set</em> + dentro de la plantilla, o del código Java. Por ejemplo, si la + variable de Java <em>$foo</em> tiene el valor <em>bar</em> en el + momento en que se solicita la plantilla, entonces <em>bar</em> + reemplaza todas las ocurrencias (o instancias) de <em>$foo</em> + dentro de la página web. De manera alterna, si se incluye el + enunciado + </p> +<div class="source"><pre> +#set( $foo = "bar" ) +</pre> +</div> +<p> + La salida será la misma para todas las instancias de <em>$foo</em> + que se encuentren a continuación es esta directiva. + </p> +<p><a name="Propiedades"><strong>Propiedades</strong></a><br /> + + El segundo sabor de referencias VTL son las propiedades; las + propiedades tienen un formato particular. La versión corta se + compone de un signo <em>$</em> seguido de un identificador VTL, + seguido de un punto y de otro identificador VTL. A continuación hay + ejemplos de referencias de propiedades válidas en VTL: + </p> +<div class="source"><pre> +$cliente.Direccion +$compra.Total +</pre> +</div> +<p> + Tome el primer ejemplo, <em>$cliente.Direccion</em>. Puede tener dos + significados. Puede significar, Busque en la tabla de hashing + identificada como <em>cliente</em> y devuelva el valor asociado con + la llave <em>Direccion</em>. Pero <em>$customer.Address</em> puede + también referirse a un método (las referencias que se relacionan con + métodos se discutirán en la sección siguiente); + <em>$customer.Address</em> puede ser una manera corta de escribir + <em>$customer.getAddress()</em>. Cuando su página sea solicitada + Velocity determinará cuál de las dos posibilidades tiene sentido, y + luego devolverá el valor apropiado. + </p> +<p><a name="Métodos"><strong>Methods</strong></a><br /> + + Un método esta definido dentro del código de Java y es capaz de + hacer algo útil, como desarrollar un cálculo o llegar a una + decisión. Los métodos son referencias compuestas de un signo "$" + inicial seguido en un identificador VTL, seguido de un <em>Cuerpo de + Método</em> VTL. Un cuerpo de método VTL, a su vez esta formado + por un identificador VTL seguido por un paréntesis izquierdo ("("), + seguido, opcionalmente, por una lista de parámetros, para terminar + en un paréntesis derecho. A continuación hay ejemplos de referencias + de métodos válidas dentro de VTL: + + </p> +<div class="source"><pre> +$cliente.getDireccion() +$compra.getTotal() +$pagina.setTitulo( "My Página Principal" ) +$persona.establecerAtributos( ["Extraño", "Raro", "Excitado"] ) +</pre> +</div> +<p> + Los primeros dos ejemplos -- <em>$cliente.getDireccion()</em> y + <em>$compra.getTotal()</em> -- pueden parecer similares a aquellos + utilizados en la sección de propiedades, <em>$cliente.Direccion</em> + y <em>$compra.Total</em>. Si usted supuso que estos ejemplos están + relacionados de alguna manera, usted esta en lo cierto. + </p> +<p> + Las Propiedades VTL pueden utilizarse como notación abreviada para + los métodos de VTL. La propiedad <em>$cliente.Direccion</em> tiene + exactamente el mismo efecto que el método + <em>$cliente.getDireccion()</em> (Nótese el uso de la palabra + inglesa <em>get</em> en lugar de la castellana <em>obtener</em>). + Generalmente es preferible utilizar una Propiedad si esta + disponible. La diferencia principal entre las propiedades y los + métodos es que usted le puede dar una lista de parámetros a un + Método. + </p> +<p> + La notación breve se puede utilizar en los Métodos siguientes: + </p> +<div class="source"><pre> +$sol.getPlanetas() +$anhelido.getMugre() +$album.getFoto() +</pre> +</div> +<p> + PodrÃamos esperar que estos métodos devolvieran los nombres de los + planetas que giran alrededor del sol, alimentaran un gusano de + tierra y extrajeran una foro de un album. Los siguientes Métodos + solo se pueden referenciar por medio de la notación larga: + </p> +<div class="source"><pre> +$sol.getPlaneta( ["Tierra", "Marte", "Neptuno"] ) +## No es posible pasar una lista de parámetros con $sun.Planets + +$sisifo.empujarPiedra() +## Si dijera $sisifo.piedra Velocity asumirÃa $sisifo.pushPiedra() + +$libro.setTitulo( "Homenaje a Colombia" ) +## No se puede pasar un parámetro en la notación abreviada. +</pre> +</div> +<p><a name="NotaciónFormaldeReferencias"><strong>Notación Formal de + Referncias</strong></a><br /> + + La notación abreviada para referencias fue utilizada en los ejemplos + anteriores, pero también existe una notación formal para referencias, + que se demuestra a continuación: + </p> +<div class="source"><pre> +${lanzaLodo} +${cliente.Direccion} +${compra.getTotal()} +</pre> +</div> +<p> +Casi en todos los casos usted utilizará la notación abreviada, pero +existen escenarios en los cuales la notación formal se requiere para +procesar corectamente la plantilla. + </p> +<p> + Suponga que usted estuviera creando una frase en la que <em>$vicio</em> + se utilizará como prefijo para el ajetivo de una clase. La idea es + permitir a alguién escoger la palabra base para producir uno de los dos + siguientes resultados: "Juan es un pirómano." ó "Juan es un + cleptómano.". En este caso la notación abreviada no es apropiada; + considere el siguiente ejemplo: + </p> +<div class="source"><pre> +Juan is a $viciomano. +</pre> +</div> +<p> +Hay ambigüedad aquÃ, y Velocity asume que <em>$viciomano</em>, no +<em>$vicio</em>, es el Identificador que usted querÃa utilizar. Al no +encontrar ningún valor para <em>$viciomano</em> Velocity escribirá +simplemente <em>$viciomano</em>. Este problema se resueklve usando +notación formal. + </p> +<div class="source"><pre> +Juan es un ${vicio}mano. +</pre> +</div> +<p> + Ahora Velocity save que la referencia es <em>$vicio</em> y no + <em>$viciomano</em>. La notación formal es útil cuando las + referencias están ubicadas directamente al lado del texto dentro de + una plantilla. + </p> +<p><a name="NotaciónSileciosadeReferencias"><strong>Notación de Referenias + Silenciosas</strong></a><br /> + + Cuando Velocity encuentra una referencia indefinida, su + comportamiento normal es es de escribir el nombre de la referencia. + Por ejemplo, suponga que la siguiente referencia aparece como parte + de una plantilla VTL. + </p> +<div class="source"><pre> +<input type="text" name="correo" value="$correo"/> +</pre> +</div> +<p> + Cuando el formulario se carga por primera vez la referencia + <em>$correo</em> no tiene valor, pero usted probablemente preferirÃa + un texto en blanco a uno con el valor de "$correo". Usando la + notación de referencias silenciosa se pasa por alto el + comportamiento normal de Velocity. Para lograr eso en lugar de + <em>$correo</em> en el VTL usted utilizarÃa <em>$!correo</em>. Con + esta modificación el ejemplo anterior quedarÃa asÃ: + </p> +<div class="source"><pre> +<input type="text" name="correo" value="$!correo"/> +</pre> +</div> +<p> + Ahora cuando el formulario se carga por primera vez y $correo no + tenga valor una cadena vacÃa se escribirá en lugar de "$correo". + </p> +<p> + La notación formal y la silenciosa se puede usar juntas como se + muestra en el ejemplo siguiente: + </p> +<div class="source"><pre> +<input type="text" name="correo" value="$!{correo}"/> +</pre> +</div> +</div> +<div class="section"><h2><a name="Literalmente"></a>Literalmente</h2> +<p> + VTL hace uso de caracteres especiales, como <em>$</em> y <em>#</em>, + para hacer su trabajo por lo que se debe tener algo de cuidado en el + momento de utilizar estos caracteres dentro de las plantillas. Esta + sección habla de como escapar el caracter <em>$</em>. + </p> +<p><a name="Dinero"><strong>Dinero</strong></a><br /> + + No hay ningún problema en escribir "Yo compré un saco de maÃz de + 2 kg. en el mercado de lagranja por sólo $2.50!". Como se mencionó + anteriormente, un identificador VTL siempre comienza con una letra + mayúscula o minúscula por lo que $2.50 no se confunde con una + referencia. + </p> +<p><a name="EscapandoReferenciasVTLVálidas"><strong>Escapando Referencias + VTL Válidas</strong></a><br /> + + Pueden existir casos en donde haya la posibilidad de que Velocity se + confunda. <em>Escapar</em> caracteres especiales es la mejor manera de + manejar los caracteres partÃculares de VTL dentro de sus plantillas, y + esto se puede hacer utilizando el caracter palote o backslash ( + <em>\</em> ). + </p> +<div class="source"><pre> +#set( $correo = "foo" ) +$correo +</pre> +</div> +<p> + Si Velocity encuentra una referencia en su plantilla VTL a + <em>$correo</em>, el buscará el contexto ppor un valor + correspondiente. En este caso el resultado será <em>foo</em> por + qué <em>$correo</em> esta definido. Si <em>$correo</em> no esta + definido el resultado será <em>$correo</em>. + </p> +<p> + Suponga que <em>$correo</em> está definido (por ejemplo, que tiene + el valor <em>foo</em>) y que usted desea escribir <em>$correo</em>. + Existen varias maneras de hacer esto pero la más sencilla es usar el + caracter de escape. + </p> +<div class="source"><pre> +## La siguiente lÃnea define $correo en esta plantilla: +#set( $correo = "foo" ) +$correo +\$correo +\\$correo +\\\$correo +</pre> +</div> +<p> + se muestra como + </p> +<div class="source"><pre> +foo +$correo +\foo +\$correo +</pre> +</div> +<p> + Note que el caracter <em>\</em> se asocia con <em>$</em> por la + izquierda. La regla de asociación por la izquierda hace que + <em>\\\$correo</em> se muestre como <em>\\$correo</em>. Compare estos + ejemplos con lo siguientes, en los que <em>$correo</em> no esta + definido. + </p> +<div class="source"><pre> +$correo +\$correo +\\$correo +\\\$correo +</pre> +</div> +<p> + se muestra como + </p> +<div class="source"><pre> +$correo +\$correo +\\$correo +\\\$correo +</pre> +</div> +<p> + Note que Velocity maneja de manera diferentes las referencias que + están definidas de aquellas que no lo están. A continuación se + encuentra una directiva que da a <em>$foo</em> el valor + <em>verde</em>. + </p> +<div class="source"><pre> +#set( $foo = "verde" ) +$luna = $foo +</pre> +</div> +<p> +La salida será: <em>$luna = verde</em> -- donde <em>$luna</em> se +escribe literalmente porqué esta indefinido y <em>verde</em> se escribe +en lugar de <em>$foo</em></p> +<p> + También es posible escapar directivas de VTL; esto se describe con + más detalle en la sección de Directivas. + </p> +</div> +<div class="section"><h2><a name="Sustitución_de_Mayúsculas_y_Minúsculas"></a>Sustitución de Mayúsculas y Minúsculas</h2> +<p> +Ahora que usted esta familiarizado con las referencias, puede comenzar a +aplicarlas de manera efectiva en sus plantillas. Las referencias de +Velocity aprovechan algunos principios de Java que los diseñadores de +plantillas encontraránm fáciles de utilizar. Por ejemplo: + </p> +<div class="source"><pre> +$foo + +$foo.getBar() +## el lo mismo que +$foo.Bar + +$data.setUser("jon") +## es lo mismo que +#set( $data.User = "jon" ) + +$data.getRequest().getServerName() +## es lo mismo que +$data.Request.ServerName +## que a su vez, es igual a +${data.Request.ServerName} +</pre> +</div> +<p> +Estos ejemplos ilustran usos alternativos para la mismas referencias. +Velocity se aprovechas de la instrospección y las capacidades de beans +de Java para resolver los nombre de referencias tanto en el Contexto +como en los métodos de los objetos. Es posible incluir y evaluar +referencias casi en cualquier lugar de su plantilla. + </p> +<p> + Velocity, que ha sido modelado con las especificaciones de Bean + definidas por Sun Microsystems, distingue entre mayúsculas y + minúsculas; sin embargo sus desarrolladores se han esforzado para + encontrar y corregir los errores del usuario cuando sea posible. + Cuando el método <em>getFoo()</em> es referenciado dentro de una + plantilla como <code>$bar.foo</code>, Velocity intentará primero + <code>getfoo()</code>. Si esto falla, intentará <code>getFoo()</code>. + De la misma manera, cuando una plantilla se refiera a + <code>$bar.Foo</code>, Velocity intentará <em>$getFoo()</em> primero + y luego <em>getfoo()</em>. + </p> +<p> + Nota: <em>Las Referencias a variables de instancia dentro de una + plantilla no se resuelven.</em> Solo las referencias a los + atributos get y set de los JavaBeans se resuelven (i.e. + <code>$foo.Nombre</code> se resuelve como el método de instancia + <code>getNombre()</code> de la clase Foo, pero no como su variable + de instancia <code>Nombre</code>). + </p> +</div> +<div class="section"><h2><a name="Directivas"></a>Directivas</h2> +<p> + Las Referencias le permiten a los diseñadores de plantillas generar + contenido dinámico para sitios web, mientras que las + <em>directivas</em> -- elementos de script fáciles de usar que se + pueden usar para manipular de manera creativa la salida del código + Java -- les permiten a los diseñadores realmente estar a cargo de la + apariencia y en contenido del sitio web. + </p> +<a name="Set"><strong>#set</strong></a><p> + La directiva <em>#set</em> se utiliza para establecer el valor de una + referencia. El valor se puede asignar a una referencia de variable o + una referencia de propiedad, siempre entre paréntesis, como se muestra + a continuación: + </p> +<div class="source"><pre> +#set( $primate = "mono" ) +#set( $cliente.Comportamiento = $primate ) +</pre> +</div> +<p> + El lado izquierdo (LI) de la asignación debe ser una referencia de + variable o una referencia de propiedad. El lado derecho (LD) puede + ser de alguno de los siguientes tipos: + </p> +<p><ul><li>Referencia de Variable</li> +<li>Constante de Cadena</li> +<li>Referencia de Propiedad</li> +<li>Referencia de Método</li> +<li>Literal Numérico</li> +<li>Lista de elementos como arreglo</li> +</ul> +</p> +<p> + These examples demonstrate each of the aforementioned types: + </p> +<div class="source"><pre> +#set( $mono = $pedro ) ## Referencia de Variable +#set( $mono.Amigo = "monica" ) ## Constante de Cadena +#set( $mono.Culpar = $casablanca.Fuga ) ## referencia de propiedad +#set( $mono.Plan = $doctor.llamar($web) ) ## referencia de método +#set( $mono.Numero = 123 ) ##Literal Numérico +#set( $mono.Decir = ["No", "es", $mi, "culpa"] ) ##Arreglo +</pre> +</div> +<p> + NOTA: En el último ejemplo los elementos definidos con el operador + [..] son accesibles usando los métodos definidos en la clase ArrayList. + AsÃ, por ejemplo, usted podrÃa acceder el primer elemento del arreglo utilizando $mono.Decir.get(0), con lo que obtendrÃa la palabra "No". + </p> +<p> + El lado derecho también puede ser una expresión aritmética sencilla: + </p> +<div class="source"><pre> +#set( $value = $foo + 1 ) +#set( $value = $bar - 1 ) +#set( $value = $foo * $bar ) +#set( $value = $foo / $bar ) +</pre> +</div> +<p> + Si el Lado Derecho es una propiedad o referencia de método que se + evalúa como <em>null</em>, <b>no</b> será asignada al lado + izquierdo. No es posible remover una referencia existente del + contexto utilizando este mecanismo. Esto puede ser confuso para los + recién llegados a Velocity. Por ejemplo: + </p> +<div class="source"><pre> +#set( $resultado = $consulta.criterio("nombre") ) +El resultado de la primera consulta en $resultado + +#set( $resultado = $consulta.criterio("direccion") ) +El resultado de la segunda consulta es $resultado +</pre> +</div> +<p> + Si <em>$consulta.criterio("nombre")</em> retorna la cadena "pedro", + y <em>$consulta.criterio("direccion")</em> retorna <em>null</em>, el + VTL anterio se mostrarÃa de la siguiente manera: + </p> +<div class="source"><pre> +El resultado de la primera consulta en pedro + +El resultado de la primera consulta en pedro +</pre> +</div> +<p> + Esto tiende a confundir a quines están comenzando, que construyen + ciclos <em>#foreach</em> que intentan hacer <em>#set</em> de una + referencia por medio de una propiedad o un método e inmediatamente + evalúan la referencia con una directiva <em>#if</em>. Por ejemplo: + </p> +<div class="source"><pre> + +#set( $criterios = ["nombre", "direccion"] ) + +#foreach( $criterio in $criterios ) + + #set( $resultado = $consulta.criterios($criterio) ) + + #if( $result ) + La consulta tuvo éxito + #end + +#end +</pre> +</div> +<p> + En el ejemplo anterior, no serÃa inteligente confiar en la + evaluación de <em>$resultado</em> para determinar si una consulta + tuvo éxito. Después de que <em>$result</em> ha sido agregado al + contexto (por medio de una directiva <em>#set</em>), no puede volver + a establecerse a <em>null</em> (quitarse del contexto). Los detalles + de las directivas <em>#if</em> y <em>#foreach</em> son cubiertos con + mayor detalle posteriormente en esta guÃa. + </p> +<p> + Una solución para este problema puede ser predefinir + <em>$resultado</em> a <em>false</em>. Luego, si la llamada a + <em>$consulta.criterios()</em> falla, es posible verificar. + </p> +<div class="source"><pre> + +#set( $criterios = ["nombre", "direccion"] ) + +#foreach( $criterio in $criterios ) + + #set( $resultado = false ) + #set( $resultado = $consulta.criterios($criterio) ) + + #if( $resultado ) + La consulta tuvo éxito + #end + +#end +</pre> +</div> +<p> + A diferencia de algunas de las otras directivas de Velocity, la + directiva <em>#set</em> no tiene un enunciado <em>#end</em>. + </p> +<a name="CadenasdeCaracteres"><strong>Cadenas de Caracteres</strong></a><p> + Cuando se utiliza la directiva <em>#set</em>, los literales de + cadena que están encerrados en comillas dobles serán evaluados y + mostrados en la plantilla, como se demuestra a continuación: + </p> +<div class="source"><pre> +#set( $directorioRaiz = "www" ) +#set( $nombrePlantilla = "indice.vm" ) +#set( $plantilla = "$directorioRaiz/$nombrePlantilla" ) +$plantilla +</pre> +</div> +<p> + La salida será: + </p> +<div class="source"><pre> +www/indice.vm +</pre> +</div> +<p> + Sin embargo, cuando la cadena de caracteres esta encerrada en + comillas sencillas, no será evaluada: + </p> +<div class="source"><pre> +#set( $foo = "bar" ) +$foo +#set( $blarg = '$foo' ) +$blarg +</pre> +</div> +<p>Se muestra como:</p> +<div class="source"><pre> + bar + $foo +</pre> +</div> +<p> + Por defecto, la caracterÃstica de las comillas sencillas para + mostrar texto sin evaluar esta disponible en Velocity; sin embargo + este valor por defecto se puede cambiar editando el archivo + <code>velocity.properties</code> de tal manera que + <code>stringliterals.interpolate=false</code>. + </p> +</div> +<div class="section"><h2><a name="Sentencias_If-Else"></a>Sentencias If-Else</h2> +<strong>Condicionales</strong><p> + La directiva <em>#if</em> en Velocity permite que se incluya texto + dentro de la plantilla generada, con la condición de que el + enunciado condicional evalue a verdadero. Por ejemplo: +</p> +<div class="source"><pre> +#if( $foo ) + <strong>Velocity!</strong> +#end +</pre> +</div> +<p> + La variable <em>$foo</em> se evalúa para determinar si es verdadera, + cosa que ocurrirá bajo una de dos circunstancias: (i) <em>$foo</em> + es un valor booleano (verdadero ó falso) que tiene un valor de + verdadero, ó (ii) el valor no es <em>null</em>. Recuerde que el + contexto de Velocity solamente contiene objetos, por lo que cuando + se dice 'booleano' se habla en realidad de la clase Boolean. Esto es + cierto incluso para los métodos que devuelven un valor de tipo + <code>boolean</code> - la infraestructura de introspección devolverá + un <code>Boolean</code> del mismo valor lógico. +</p> +<p> + El contenido que se encuentra entre el enunciado <em>#if</em> y el + enunciado <em>#end</em> es lo que se escribe en la plantilla si la + evaluación resulta en un valor verdadero. En este caso, si + <em>$foo</em> es verdadero, la salida será: "Velocity!". De manera + análoga, si <em>$foo</em> tiene un valor <em>null</em>, o evalua a + falso, entonces el enunciado completo es falso y no se escribe nada. +</p> +<p> + Un elemento <em>#elseif</em> ó <em>#else</em> puede utilizarse junto + con una sentencia <em>#if</em> para indicar condiciones adicionales + o la labor por defecto. Note que el Motor de Plantillas de Velocity + parará en la primera expresión que evalue a verdadero. En el ejemplo + siguiente suponga que <em>$foo</em> tiene un valor de 15 y + <em>$bar</em> tiene un valor de 6. +</p> +<div class="source"><pre> +#if( $foo < 10 ) + <strong>Vaya hacÃa el Norte</strong> +#elseif( $foo == 10 ) + <strong>Vaya hacÃa el Este</strong> +#elseif( $bar == 6 ) + <strong>Vaya al Sur</strong> +#else + <strong>Vaya al Oeste</strong> +#end +</pre> +</div> +<p>En este ejemplo, <em>$foo</em> es mayor que diez, por lo que las + dos primeras comparaciones fallan. A continuación se compara + <em>$bar</em> con 6, como son iguales, la salida es <strong>Vaya al + Sur</strong></p> +<p><a name="OperadoresLógicosyRelacionales"><strong>Operadores + Lógicos y Relacionales</strong></a></p> +<p> + Velocity usa el operador de equivalencia para determinar las + relaciones entre las variables. A continuación hay un ejemplo + sencillo para ilustrar como se utiliza el operador de igualdad. + </p> +<div class="source"><pre> +#set ($foo = "ácido desoxiribonucleico") +#set ($bar = "ácido ribonucleico") + +#if ($foo == $bar) + En este caso es claro que no son equivalentes por lo que.... + In this case it's clear they aren't equivalent. So... +#else + No son equivalentes y esta será la salida. +#end +</pre> +</div> +<p> + Velocity tiene también operadores lógicos para el Y, el O y el NO + (AND, OR y NOT). Para mayor información vea la <a href="../vtl-reference-guide.html">GuÃa de Referencia VTL</a>. + A continuación se encuentran ejemplos que demuestran la utilización + de los operadores lógicos AND, OR y NOT. + </p> +<div class="source"><pre> + +## Y lógico + +#if( $foo && $bar ) + <strong>Esto Y aquello</strong> +#end + +</pre> +</div> +<p> + La directiva <em>#if()</em> solamente evaluará a verdadero si tanto + <em>$foo</em> como <em>$bar</em> son ciertos. Si <em>$foo</em> es + falso la expresión evaluará a falso; <em>$bar</em> no será evaluada. + Si <em>$foo</em> es verdadero el Motor de Plantillas de Velocity + verificará el valor de <em>$bar</em>; si <em>$bar</em> es cierto, + entonces toda la expresión es cierto y la salida es <strong>Esto Y + aquello</strong>. Si <em>$bar</em> es falso, entonces no habrá + ninguna salida porque toda la expresión es falsa. + </p> +<p> + El O lógico trabaja de la misma manera, pero sólo una de las + referencias debe evaluar a verdadero para que toda la expresión + evalue a verdadero. Considere el ejemplo siguiente. + </p> +<div class="source"><pre> + +## O lógico + +#if( $foo || $bar ) + <strong>Esto O Aquello</strong> +#end +</pre> +</div> +<p> + Si <em>$foo</em> es verdadero, el Motor de Plantillas de Velocity no + necesita consultar <em>$bar,</em>; sin importar si <em>$bar</em> es + cierto o falso, la expresión será cierta, y <strong>Esto O + Aquello</strong> será la salida. Si <em>$foo</em> es falso, en + cambio, es necesario verificar <em>$bar</em>. En este caso, si + <em>$bar</em> es falso, entonces la expresión es falsa y no se + escribe nada. De otro lado, si <em>$bar</em> es verdadero, entonces + toda la expresión es verdadera y el resultado es <strong>Esto O + Aquello</strong></p> +<p> + Con el operador lógico NO, solo hay un argumento : + </p> +<div class="source"><pre> + +## NO lógico + +#if( !$foo ) +<strong>eso NO</strong> +#end + +</pre> +</div> +<p> + Aquà si <em>$foo</em> es cierto, entonces <em>!$foo</em> es falso, y + no se escribe nada. Por el contrario, si <em>$foo</em> es falso, + entonces <em>!$foo</em> será verdadero y <strong>eso NO</strong> + será escrito. Tenga cuidado de no confundir este operador con la + <em>referencia sileciosa $!foo</em>, que es algo completamente + distinto. + </p> +</div> +<div class="section"><h2><a name="Ciclos_Foreach"></a>Ciclos Foreach</h2> +<strong>Ciclo Foreach</strong><p> + El elemento <em>#foreach</em> permite la construcción de ciclos. Por + ejemplo: + </p> +<div class="source"><pre> +<ul> +#foreach( $producto in $todosProductos ) + <li>$producto</li> +#end +</ul> +</pre> +</div> +<p> + Este cilco <em>#foreach</em> hace que el objeto correspondiente a la + lista de $todosProductos sea iterado buscando todos los productos de + la lista. En cada iteración del ciclo, el valor de + <em>$todosProductos</em> se asigna a la variable <em>$producto</em>. + </p> +<p> + El contenido de la variable <em>$todosProductos</em> es un Vector, + una tabla de Hashing (Hashtable) o un arreglo (Array). El valor + asignado a la variable <em>$producto</em> es un objeto Java y se + puede referenciar desde una variabkle como tal. Por ejemplo, si + <em>$product</em> fuera realmente un elemento de la clase Producto + en Java, su nombre se podrÃa obtener referenciando el método + <em>$producto.Nombre</em> (ie: <em>$Product.getName()</em>). + </p> +<p> + Ahora supongamos que <em>$todosProductos</em> es una tabla de + Hashing. Si usted quisiera recuperar los valores de las llaves de la + tabla de Hashing, al igual que los objetos dentro de esta, usted + podrÃa utilizar código como el siguiente: + </p> +<div class="source"><pre> +<ul> + #foreach( $llave in $todosProductos.keySet() ) + <li>Llave: $llave -> Valor: $todosProductos.get($llave)</li> +#end +</ul> +</pre> +</div> +<p> + Velocity proporciona una manera sencilla de obtener el contador del + ciclo para que usted pueda hacer algo como lo siguiente: +</p> +<div class="source"><pre> +<table> + #foreach( $cliente in $listaClientes ) + <tr><td>$foreach.count</td><td>$cliente.Nombre</td></tr> +#end +</table> +</pre> +</div> +</div> +<div class="section"><h2><a name="Include"></a>Include</h2> +<p> + El elemento de script <em>#include</em> le permite al diseñador de + plantillas importar un archivo local, que después es insertado en la + localización donde se encuentra la sentencia <em>#include</em>. Los + contenidos del archivo no se muestran por intermedio del motor de + plantillas por lo que si se hacen referencias dentro del archivo, + estas no serán reemplazadas. Por motivos de seguridad el archivo que + va a ser incluido debe encontrarse en el directorio indicado por la + propiedad TEMPLATE_ROOT. + </p> +<div class="source"><pre> +#include( "uno.txt" ) +</pre> +</div> +<p> + El archivo al que se refiere la directiva <em>#include</em> se + encierra entre comillas. Si mas de un archivo será incluido, los + nombres de los archivos a incluir deben ir separados por comas. + </p> +<div class="source"><pre> +#include( "uno.gif","dos.txt","tres.htm" ) +</pre> +</div> +<p> + El archivo a incluir no tiene que ser referenciado por nombre, de + hecho, muchas veces es preferible usar una variable, en lugar de un + nombre de archivo. Esto puede ser útil para dirigir la salida de + acuerdo a criterios determinados cuando la solicitud de la página es + enviada, es decir, que dependa de factores como los datos del + usuario que visita la página, el momento del dÃa, etc. A + continuación se muestra un ejemplo en el que se usan tanto un nombre + como una variable. + </p> +<div class="source"><pre> +#include( "greetings.txt", $seasonalstock ) +</pre> +</div> +</div> +<div class="section"><h2><a name="Parse"></a>Parse</h2> +<p> + El elemento de script <em>#parse</em> le permite al diseñadore de + plantillas importar un archivo local que contiene VTL. Velocity + procesará el VTL y mostrará la plantilla especificada. +</p> +<div class="source"><pre> +#parse( "yo.vm" ) +</pre> +</div> +<p> + Al igual que la directiva <em>#include</em>, <em>#parse</em> puede + utilizar una variable, en lugar de una plantilla. Todas las + plantillas a las que <em>#parse</em> se refiera deben incluirse bajo + TEMPLATE_ROOT. A diferencia de la directva <em>#include</em>, + <em>#parse</em> solo recibe un argumento. +</p> +<p> + Las plantillas de VTL puede tener sentencias <em>#parse</em> que se + refieran a plantillas que a su vez tengan sentencias + <em>#parse</em>. La lÃnea <em>parse_directive.maxdepth</em> del + archivo <code>velocity.properties</code>, cuyo valor por defecto es + 10, permite a los usuarios configurar el máximo número de + referencias a <em>#parse</em> que pueden ocurrir desde una única + plantilla. (Nota: Si la propiedad <em>parse_directive.maxdepth</em> + no esta dentro del archivo <code>velocity.properties</code>, + Velocity establecerá el valor por defecto en 10.) La recursión esta + permitida, por ejemplo, si la plantilla <code>hacerfoo.vm</code> + contiene las siguientes lÃneas: + </p> +<div class="source"><pre> +Cuenta Regresiva. +#set( $cuenta = 8 ) +#parse( "parsefoo.vm" ) +Listo hacerfoo.vm! +</pre> +</div> +<p> + Hay una referencia a la plantilla <code>parsefoo.vm</code>, que + contiene el siguiente código VTL: +</p> +<div class="source"><pre> +$cuenta +#set( $cuenta = $cuenta - 1 ) +#if( $cuenta > 0 ) + #parse( "parsefoo.vm" ) +#else + Listo parsefoo.vm! +#end +</pre> +</div> +<p> + Después de que se muestra "Cuenta Regresiva.", Velocity pasa por + <code>parsefoo.vm</code>, contando hacÃa abajo desde 8. Cuando el + conteo llegue a 0, mostrará el mensaje "Listo parsefoo.vm!". En este + punto Velocity volverá a <code>dofoo.vm</code> y escribirá el + mensaje "Listo hacerfoo.vm!". + </p> +</div> +<div class="section"><h2><a name="Stop"></a>Stop</h2> +<p> +El elemento de script <em>#stop</em> permite al diseñador parar la +ejecución del motor de plantillas y volver. Esto es útil para propósitos +de corrección de errores. +</p> +<div class="source"><pre> +#stop +</pre> +</div> +</div> +<div class="section"><h2><a name="Velocimacros"></a>Velocimacros</h2> +<p> + El elemento de script <em>#macro</em> script permite definir un + segmento de plantilla VTL repetitivo. Los Velocimacros son muy + útiles en una amplia gama se situaciones, tanto simples como + complejas. El siguiente Velocimacro, creado con el único propósito + de ahorrar tecleo y minimizar errores tipográficos, provee una + introducción al concepto de Velocimacros + element allows template designers to. + </p> +<div class="source"><pre> +#macro( d ) +<tr><td></td></tr> +#end +</pre> +</div> +<p> + El Velocimacro que se define en este ejemplo es <em>d</em>, y se + puede llamar de manera similar a cualquier otra directiva VTL: + </p> +<div class="source"><pre> +#d() +</pre> +</div> +<p> +Cuando esta plantilla sea solicitada, Velocity reemplazará <em>#d()</em> +por una fila conteniendo un única celda vacia. +</p> +<p> +Un Velocimacro puiede tomar cualquier número de argumentos -- no tener +ningún argumento, como se mostró en el primer ejemplo, es una opción -- +pero cuando sea invocado el Velocimacro debe ser llamado con el mismo +número de argumentos con el que fue definido. Muchos Velocimacros se +relacionan con el entorno mucho más con su entorno que el ejemplo +demostrado anteriormente. Aquà hay un Velocimacro que recibe dos +argumentos, un color y un arreglo. +</p> +<div class="source"><pre> +#macro( filastabla $color $algunalista ) +#foreach( $algo in $algunalista ) + <tr><td bgcolor=$color>$algo</td></tr> +#end +#end +</pre> +</div> +<p> +El Velocimacro que se define en este ejemplo, <em>filastabla</em>, toma +dos argumentos. El primer argumento toma el lugar de <em>$color</em>, y +el segundo argumento el de <em>$algunalista</em></p> +<p> +Cualquier cosa que se pueda incluir dentro de una plantilla VTL puede +formar parte delcuerpo de un Velocimacro. El Velocimacro +<em>filastabla</em> es una sentencia <em>foreach</em>. Hay dos +sentencias <em>#end</em> dentro del Velocimacro; la primera pertenece al +<em>foreach</em> y a segunda termina la definición del Velocimacro. + </p> +<div class="source"><pre> +#set( $grandeslagos = ["Superior","Michigan","Huron","Erie","Ontario"] ) +#set( $color = "blue" ) +<table> + #filastabla( $color $grandeslagos ) +</table> +</pre> +</div> +<p> + Note que <em>$grandeslagos</em> toma el lugar de + <em>$algunalista</em>. Cuando el Velocimacro es llamado en esta + situación, la siguiente salida es generada: + </p> +<div class="source"><pre> +<table> + <tr><td bgcolor="blue">Superior</td></tr> + <tr><td bgcolor="blue">Michigan</td></tr> + <tr><td bgcolor="blue">Huron</td></tr> + <tr><td bgcolor="blue">Erie</td></tr> + <tr><td bgcolor="blue">Ontario</td></tr> +</table> +</pre> +</div> +<p> +Los Velocimacro pueden ser definidos <em>inline</em> dentro de una +plantilla. Esto quiere decir que la definición del macro no esta +disponible para otras plantillas dentro del mimso sitio Web. Definir un +Velocimacro de tal forma que sea compartido por todas las plantillas +tiene ventajas obvias: Reduce la necesidad de redefinir el macro en +varias plantillas, ahorrando trabajo y disminuyendo las posiblidades de +error, además de asegurar que un único cambio en un archivo quedará +disponible para todas las plantillas. +</p> +<p> +Si el Velocimacro <em>#filastabla($color $lista)</em> fuera definido en +una librerÃa, se podrÃa utilizar en cualquiera de la plantillas +normales; se podrÃa utilizar muchas veces con propósitos distintos. En +la plantilla <code>vegetal.vm</code> dedicado a todas las plantas, el +Velocimacro <em>#filastabla</em> podrÃa invocarse para listar las partes +de un vegetal tÃpico: + </p> +<div class="source"><pre> +#set( $partes = ["raÃz","tallo","hojas","flores","frutos"] ) +#set( $colorCelda = "#CC00FF" ) +<table> + #filastabla( $colorCelda $parts ) +</table> +</pre> +</div> +<p> +Cuando atendiera ls solicitud de <code>vegetal.vm</code>, Velocity +encontrarÃa el macro <em>#filastabla</em> en la librerÃa de plantillas +(definida en el archivo <code>velocity.properties</code>) y generarÃa el +siguiente resultado: + </p> +<div class="source"><pre> +<table> + <tr><td bgcolor="#CC00FF">raÃz</td></tr> + <tr><td bgcolor="#CC00FF">tallo</td></tr> + <tr><td bgcolor="#CC00FF">hojas</td></tr> + <tr><td bgcolor="#CC00FF">flores</td></tr> + <tr><td bgcolor="#CC00FF">frutos</td></tr> +</table> +</pre> +</div> +<strong>Argumentos de un Velocimacro</strong><p> +Los Velocimacros pueden recibir como argumentos cualquiera de los +siguientes elementos de VTL: + </p> +<ul><li> + Referencia : cualquier cosa que comience con '$' + </li> +<li> + Cadena de caracteres : algo como "$foo" u 'hola' + </li> +<li> + Número : 1, 2 etc + </li> +<li> + Rango de enteros : [ 1..2] ó [$foo .. $bar] + </li> +<li> + ObjectArray : [ "a", "b", "c"] + </li> +<li> + El valor booleano "verdadero" + </li> +<li> + El valor booleano "falso" + </li> +</ul> +<p> + Cuando pase referencias como argumentos para los Velocimacros tenga + en cuenta que las referencias se pasan 'por nombre'. Esto quiere + decir que su valor es 'generado' cada vez que se usa dentro del + Velocimacros. Esta caracterÃstica le permite pasar referencias con + las llamadas de método y hacer que el método se llame cada vez. Por + ejemplo, cuando llame el siguiente Velocimacro + </p> +<div class="source"><pre> + #macro( llamame $a ) + $a $a $a + #end + +#llamame( $foo.bar() ) + </pre> +</div> +<p> + Esa llamada hace que el método bar() de la referencia $foo sea + llamado 3 veces. + </p> +<p> + A primera vista, esta caracterÃstica parece sorprendente, pero + cuando se tiene en cuenta la motivación original de los Velocimacros + -- eliminar la duplicación de "copiar y pegar" del VTL usado varias + veces -- tiene mucho sentido. Permite pasar al Velocimacro objetos + con estado, como un objeto que genera colores en una secuencia + repetitiva para colorear las filas de una tabla. + </p> +<p> + Si usted no desea utilizar esta caracterÃstica siempre es posible + simplemente obtener el valor del método como una nueva referencia y + pasar ese valor: + </p> +<div class="source"><pre> + #set( $mivalor = $foo.bar() ) + #llamame( $mivalor ) + </pre> +</div> +<strong>Propiedades de un Velocimacro</strong><p> + Varias lÃneas en al archivo <code>velocity.properties</code> permiten + flexibilizar la implementación de los Velocimacro. Tenga en cuenta + que estas propiedades también están documentadas en la <a href="../developer-guide.html">GuÃa de Desarrolladores</a>. + </p> +<p><code>velocimacro.library</code> - Una lista, separada por comas de + todas la librerias de plantillas de Velocimacros. Por defecto, + Velocity busca una sola librerÃa: <em>VM_global_library.vm</em>. El + directorio en el que se buscan las plantillas también se utiliza para + localizar las librerÃas. + </p> +<p><code>velocimacro.permissions.allow.inline</code> - Esta propiedad, + que tiene como valores posibles verdadero y falso (true y false), + determina si los Velocimacros pueden ser definidos dentro de las + plantillas normales. + El valor por defecto, verdadero, le permite a los diseñadores + definir por si mismos macros en las plantillas. + </p> +<p><code>velocimacro.permissions.allow.inline.to.replace.global</code> - + Con valores posibles verdadero y falso (true y false), esta + propiedad le permite al usuario decidir si un Velocimacro definido + inline dentro de una plantilla puede reemplazar a la plantilla + global, que fue cargada al comienzo por medio de la propiedad + <code>velocimacro.library</code>. El valor por defecto, falso + (<code>false</code>), evita que los Velocimacros definidos en una + plantilla reemplacen a los que fueron cargados al inicio. + </p> +<p><code>velocimacro.permissions.allow.inline.local.scope</code> - + Con valores posibles verdadero y falso (true y false), valor por + defecto falso, esta propiedad dice si los Velocimacros definidos + inline son 'visibles' únicamente para la plantilla que los define. + Usted puede usar esta caracterÃstica para hacer algunos trucos de + VM - si un VM global llama a otro VM global, con ancance inline, una + plantilla puede definir una implementación privada del segundo VM, + que será llamada por el primer VM cuando sea invocado en esa + plantilla. Ninguna de las otras templates es afectada. + </p> +<p><code>velocimacro.library.autoreload</code> - Esta propiedad + controla el cargado automático de la libreria de Velocimacros. El + valor por defecto es <code>false</code>. Cuando es verdadero + (<code>true</code>) la librerÃa fuente de un Velocimacro que ha sido + invocado será verificada para comprobar que no haya cambiado, y si + lo ha hecho será recargada. Esta caracterÃstica le permite cambiar y + probar librerÃas de macros sin necesidad de reiniciar la aplicación + o el contenedor de servlets, de la misma manera que se hace con + plantillas normales. + Este modo solo funciona cuando el caché esta <i>apagado</i> + en los cargadores de recursos( e.g. <code>file.resource.loader.cache + = false</code>). + Esta caracterÃstica esta pensada para el proceso de desarrollo, no + el de producción. + This property + </p> +<strong>Cosas y Casos de Velocimacros</strong><p> + Actualmente los Velocimacros deben ser definidos antes de ser + utilizados por primera vez dentro de una plantilla. Esto significa + que sus declaraciones de #macro() deben aparecerantes de que usted + utilice los Velocimacros. + </p> +<p> + Esto es importante recordarlo cuando usted intenta hacerle #parse() + a una plantilla que contiene directivas #macro(). Como el #parse() + ocurre en tiempo de ejecución, y el parser decide si un elemento que + parece una VM es realmente un VM cuando esta haciendo el #parse(), + entonces probablemente el #parse() de un conjunto de declaraciones + no funciona como se esperarÃa. Para evitar este problema, + simplemente utilice la propiedad + <code>velocimacro.library</code>para cargar todos sus VM cuando se + inicie la aplicación. + </p> +</div> +<div class="section"><h2><a name="Escapando_Directivas_VTL"></a>Escapando Directivas VTL</h2> +<p> +Las directivas de VTL se pueden escapar con el palote invertido o +backslash ("\") de manera similar a como se escapan las referencias de +VTL válidas. +</p> +<div class="source"><pre> +## #include( "a.txt" ) se muestra como <contenidos of de a.txt> +#include( "a.txt" ) + +## \#include( "a.txt" ) se muestra como #include( "a.txt" ) +\#include( "a.txt" ) + +## \\#include ( "a.txt" ) se muestra como \<contenidos de a.txt> +\\#include ( "a.txt" ) +</pre> +</div> +<p> +Se debe tener especial cuidado cuando se escapan directivas de VTL que +contienen varios elementos de script en una misma directiva (como en las +sentencias if-else-end). A continuación seencuentra un ejemplo de un +condicional tÃpico de VTL: + </p> +<div class="source"><pre> +#if( $jazz ) + Vyacheslav Ganelin +#end +</pre> +</div> +<p> + Si <em>$jazz</em> es cierto la salida es + </p> +<div class="source"><pre> +Vyacheslav Ganelin +</pre> +</div> +<p> + Si <em>$jazz</em> es fals, no hay salida. Escapar elementos de script + altera la salida. Considere el siguiente caso: + </p> +<div class="source"><pre> +\#if( $jazz ) + Vyacheslav Ganelin +\#end +</pre> +</div> +<p> +Sin importar si <em>$jazz</em> es verdadero o falso, la salida será: +</p> +<div class="source"><pre> + #if($ jazz ) + Vyacheslav Ganelin + #end + </pre> +</div> +<p> + De hecho, como todos los elementos de script están escapados, + <em>$jazz</em> nunca se evalúa por su valor booleano. + Suponga que los palotes invertidos preceden a elementos de script que + están legitimamente escapados: + </p> +<div class="source"><pre> +\\#if( $jazz ) + Vyacheslav Ganelin +\\#end +</pre> +</div> +<p> +En este caso, si <em>$jazz</em> es verdadero, la salida es +</p> +<div class="source"><pre> +\ Vyacheslav Ganelin +\ +</pre> +</div> +<p> +Para entender esto tenga en cuenta que <code>#if( arg )</code>, cuando +es terminado por un caracter de fin de lÃnea (retorno) omitirá ese +caracter de la salida. Por lo tanto, el cuerpo del bloque +<code>#if()</code> va a continuación del primer '\', que se generó a +partir del '\\' que precedÃa el <code>#if()</code> dentro de la +pantilla. El último \ está en una lÃnea distinta que el texto porqué hay +un retorno después de 'Ganelin', por lo que el \\ final, que precede el +<code>#end</code> hace parte del cuerpo del bloque. + </p> +<p> + Si <em>$jazz</em> es falso, la salida es + </p> +<div class="source"><pre> +\ +</pre> +</div> +<p> + Tenga en cuenta que las + cosas dejan de funcionar si los elementos de script no son escapados + de manera correcta. + </p> +<div class="source"><pre> +\\\#if( $jazz ) + Vyacheslave Ganelin +\\#end +</pre> +</div> +<p> + Aquà el <em>#if</em> esta escapado, pero hay un <em>#end</em> que + sobra; al haber demasiados cierres (end) sin sus correspondientes + aperturas (foreach ó if) se generará un error de procesamiento. + </p> +</div> +<div class="section"><h2><a name="VTL:_Asuntos_de_Formato"></a>VTL: Asuntos de Formato</h2> +<p> +A pesar de que el VTL mostrado en esta guÃa del usuario se muestra en la +mayorÃa de los casos con cambios de lÃnea y espacios en blanco, el VTL +que se muestra a continuación + </p> +<div class="source"><pre> +#set( $imperial = ["Munetaka","Koreyasu","Hisakira","Morikune"] ) +#foreach( $shogun in $imperial ) + $shogun +#end +</pre> +</div> +<p> +es tan válido como el siguiente trozo de código que Geir Magnusson Jr. +publicó a la lista de correo de usuarios de Velocity para ilustrar un +punto sin ninguna relación: +</p> +<div class="source"><pre> +Enviame #set($foo = ["$10 y ","un pastel"])#foreach($a in $foo)$a #end +por favor. +</pre> +</div> +<p> +El comportamiento de Velocity es el de ingnorar el espacio vacÃo de +exceso. La directiva descrita anteriormente puede reescribirse como: +</p> +<div class="source"><pre> +Enviame +#set( $foo = ["$10 y ","un pastel"] ) +#foreach( $a in $foo ) +$a +#end +por favor. +</pre> +</div> +<p> + o como + </p> +<div class="source"><pre> +Enviame +#set($foo = ["$10 y ","un pastel"]) + #foreach ($a in $foo )$a + #end por favor. +</pre> +</div> +<p> +En cada caso la salida será la misma + </p> +</div> +<div class="section"><h2><a name="Otras_CaracterÃsticas_y_Miscelánea"></a>Otras CaracterÃsticas y Miscelánea</h2> +<div class="section"><h3><a name="Matemáticas"></a>Matemáticas</h3> +<p> +Velocity tiene varias funciones matemáticas incluidas que pueden ser +utilizadas en plantillas con la directiva <em>set</em>. Las siguientes +ecuaciones son ejemplos de suma, resta, multiplicación y división +respectivamente: +</p> +<div class="source"><pre> +#set( $foo = $bar + 3 ) +#set( $foo = $bar - 4 ) +#set( $foo = $bar * 6 ) +#set( $foo = $bar / 2 ) +</pre> +</div> +<p> + Cuando una operación de división se realiza + entre dos operandos enteros, el resultado será un + valor entero, correspondiente al valor truncado de la + división. El valor del resto puede obtenerse + utilizando el operador módulo (<em>%</em>). +</p> +<div class="source"><pre> +#set( $foo = $bar % 5 ) +</pre> +</div> +</div> +<div class="section"><h3><a name="El_Operador_de_Rango"></a>El Operador de Rango</h3> +<p> +El operador de rango se puede usar en conjunción con las directivas +<em>#set</em> y <em>#foreach</em>. Es muy útil por su capacidad para +crear arreglos de objetos compuestos por enteros. La construcción del +operador rango es como sigue: +</p> +<div class="source"><pre> +[n..m] +</pre> +</div> +<p> +Tanto <em>n</em> como <em>m</em> debe ser o producir enteros. El hecho +de que <em>m</em> sea mayor o menor que <em>n</em> no importa; en ese +caso el rango cimplemente contará hacÃa abajo. A continuación se +muestran varios ejemplos de uso del operador rango: +</p> +<div class="source"><pre> +Primer ejemplo: +#foreach( $foo in [1..5] ) +$foo +#end + +Segundo ejemplo: +#foreach( $bar in [2..-2] ) +$bar +#end + +Tercer ejemplo: +#set( $arr = [0..1] ) +#foreach( $i in $arr ) +$i +#end + +Cuarto ejemplo: +[1..3] +</pre> +</div> +<p> + Produce lo siguiente: + </p> +<div class="source"><pre> +Primer ejemplo: +1 2 3 4 5 + +Segundo ejemplo: +2 1 0 -1 -2 + +Tercer ejemplo: +0 1 + +Cuarto ejemplo: +[1..3] +</pre> +</div> +<p> +enga en cuenta que el operador de rango solamente produce un arreglo +cuando se utiliza junto con las directivas <em>#set</em> y +<em>#foreach</em>, como se demuestra en el cuarto ejemplo. +</p> +<p> +Los diseñadores de páginas preocupados con hacer los tamaños de las +tablas iguales, pero con información que puede no se suficiente para +llenar la tabla, encontrarán el operador de rango particularmente útil. +</p> +</div> +<div class="section"><h3><a name="Temas_Avanzados:_Escapando_y_"></a>Temas Avanzados: Escapando y !</h3> +<p> +Cuando una referencia se hace silenciona con el caracter <em>!</em> y el +caracter <em>!</em> viene precedido por un caracter de escape +<em>\</em> la referencia se maneja de una manera diferente. Observe las +diferencias entre el escape sencillo y el caso especial en el que +<em>\</em> precede a <em>!</em>: +</p> +<div class="source"><pre> +#set( $foo = "bar" ) +$\!foo +$\!{foo} +$\\!foo +$\\\!foo +</pre> +</div> +<p> + Se muestra como: + </p> +<div class="source"><pre> +$!foo +$!{foo} +$\!foo +$\\!foo +</pre> +</div> +<p> + A diferencia del escape normal, donde <em>\</em> precede a <em>$</em>: + </p> +<div class="source"><pre> +\$foo +\$!foo +\$!{foo} +\\$!{foo} +</pre> +</div> +<p> + Se muestra como: + </p> +<div class="source"><pre> +$foo +$!foo +$!{foo} +\bar +</pre> +</div> +</div> +<div class="section"><h3><a name="Miscelánea_de_Velocimacro"></a>Miscelánea de Velocimacro</h3> +<p> +Esta sección contiene un conjunto de preguntas frecuentes (FAQ) +relacionadas con Velocimacros. Esta sección cambiará con el tiempo, por +lo que es bueno revisar si hay información nueva de cuando en cuando. +</p> +<p> +Nota : A través de esta sección 'Velocimacro' será abreviado como 'VM'. +</p> +<strong>¿Puedo usar una directiva u otro VM como argumento para un VM?</strong><p> +Ejemplo : <code>#center( #bold("hola") )</code></p> +<p> +No. Una directiva no es un argumento válido para una directiva y, para +la mayorÃa de los propósitos prácticos, un VM es una directiva. +</p> +<p><i>Sin embargo...</i>, hay cosas que usted puede hacer. Una solución +sencilla es aprovechar el hecho de que la doble comilla (") muestra sus +contenidos, por lo que usted puede hacer algo como +</p> +<div class="source"><pre> +#set($cosas = "#bold('hola')" ) +#center( $cosas ) +</pre> +</div> +<p> +Puede tener un paso... +</p> +<div class="source"><pre> +#center( "#bold( 'hola' )" ) +</pre> +</div> +<p> +Tenga en cuenta que en segundo ejemplo el argumentos es evaluado <i> + dentro</i> de la VM, no a nivel del llamador. En otras palabras, el +argumento para el VM es pasado completo y evaluado dentro del VM al que +se le pasa. Esto le permite hacer cosas como : +</p> +<div class="source"><pre> + +#macro( interno $foo ) + interno : $foo +#end + +#macro( externo $foo ) + #set($bar = "externolala") + externo : $foo +#end + +#set($bar = 'calltimelala') +#externo( "#interno($bar)" ) + +</pre> +</div> +<p> +Donde la salida es +</p> +<div class="source"><pre> +externo : interno : externolala +</pre> +</div> +<p> +la evaluación de "#interno($bar)" se lleva a cabo dentro de #externo(), +por lo que el valor $bar establecido dentro de #externo() es el que se +utiliza. +</p> +<p> +Estas es una caracterÃstica intencional y celosamente protegina - los +argumentos se pasan por nombre a los VM para que usted le pueda +'entregar' a los VMs referencias con estado como +</p> +<div class="source"><pre> +#macro( foo $color ) + <tr bgcolor=$color><td>Hola</td></tr> + <tr bgcolor=$color><td>Todos</td></tr> +#end + +#foo( $bar.colorFila() ) +</pre> +</div> +<p> +Y lograr que colorFila() se llame varias veces, en lugar de solo una. +Par evitar que eso ocurra invoque el método fuera del VM y pásele el +valor al VM. +</p> +<div class="source"><pre> +#set($color = $bar.colorFila()) +#foo( $color ) +</pre> +</div> +<strong>¿Puedo registrar Velocimacros por medio de #parse() ? </strong><p> +Actualmente, los Velocimacros deben ser definidos antes de ser usados +por primera vez dentro de una plantilla. Esto significa que sus +declaraciones de #macro() deben venir antes de que usted use los +Velocimacros. +</p> +<p> + Esto es importante recordarlo cuando usted intenta hacerle #parse() + a una plantilla que contiene directivas #macro(). Como el #parse() + ocurre en tiempo de ejecución, y el parser decide si un elemento que + parece una VM es realmente un VM cuando esta haciendo el #parse(), + entonces probablemente el #parse() de un conjunto de declaraciones + no funciona como se esperarÃa. Para evitar este problema, + simplemente utilice la propiedad + <code>velocimacro.library</code>para cargar todos sus VM cuando se + inicie la aplicación. + </p> +<strong>¿Qué es la auto recarga de Velocimacros?</strong><p> + Existe una propiedad, pensada para usarse en <i>desarrollo</i>, no + en producción : + </p> +<p><code>velocimacro.library.autoreload</code></p> +<p> + que tiene como valor por defecto falso. Cuando se hace verdadera + <em>junto con</em><code><tipo>.resource.loader.cache = false</code> + (where <tipo> es el nombre del cargador de recursos que usted + esta utilizando, como 'file' para archivos) entonces el motor de + Velocity recargará automáticamente los cambios en su librerÃas en el + momento en que los haga para que usted no tenga que reinicar el motor + de servlets o la aplicación, o hacer otros trucos para lograr que sus + Velocimacros se recarguen. + </p> +<p> + A continuación se muestra un conjunto sencillo de propiedades de + configuración. + </p> +<div class="source"><pre> + file.resource.loader.path = templates + file.resource.loader.cache = false + velocimacro.library.autoreload = true + </pre> +</div> +<p>No utilice esto en producción</p> +</div> +<div class="section"><h3><a name="Concatenación_de_Cadenas"></a>Concatenación de Cadenas</h3> +<p> +Una pregunta común que los desarrolladores formulan es <i>¿Cómo + concateno cadenas de caracteres? ¿Existe algún análogo al operador + '+' en Java?</i></p> +<p> + Para concatenar referencias en VTL usted solo tiene que 'ponerlos + juntos'. El contenido del contexto en donde usted desee juntar las + referencias es importante, por lo que ilustraremos con algunos + ejemplos. + </p> +<p> + En el código regular de una plantilla (cuando usted lo mezcla con + contenido normal) + </p> +<div class="source"><pre> + #set( $tam = "Big" ) + #set( $nombre = "Ben" ) + + El reloj es $tam$nombre. + </pre> +</div> +<p> + y la salida será 'El reloj es BigBen'. Para caso más interesantes, + como cuando ested desea concatenar las cadenas que pasará a un + método, o establecer el valor de una nueva referencia use + </p> +<div class="source"><pre> + #set( $tam = "Big" ) + #set( $nombre = "Ben" ) + + #set($reloj = "$tam$nombre" ) + + El reloj es $reloj. + </pre> +</div> +<p> + Que resultará en la mismo que el ejemplo anterior. Como un ejemplo + final, cuando usted desea mezclar cadenas 'estáticas' con sus + referencias usted puede necesitar 'referencias formales': + </p> +<div class="source"><pre> + #set( $tam = "Big" ) + #set( $nombre = "Ben" ) + + #set($reloj = "${tam}Alto$nombre" ) + + El reloj es $reloj. + </pre> +</div> +<p> + Ahora el resultado es 'El reloj es BigAltoBen'. La notación formal + es necesaria para que el procesador de las plantillas sepa que usted + quiso usar la referencia '$tam', en lugar de '$tamAlto', que serÃa + lo que entenderÃa si los corchetes '{}' no estuvieran presentes. + </p> +</div> +</div> +<div class="section"><h2><a name="Retroalimentación"></a>Retroalimentación</h2> +<p> +Si encuentra algún error en este manual o tiene algún otro comentario o +retroalimentación relacionada con la guÃa del usuario de Velocity, por +favor envie un correo a <a href="mailto:[email protected]" class="externalLink">La lista de usuarios + de Velocity</a>. +Gracias! + </p> +</div> + + </div> + </div> + <div class="clear"> + <hr/> + </div> + <div id="footer"> + <div class="xright">© + 2000-2010 + + The Apache Software Foundation + + + + + + + + + Last Published: 2010-11-29 23:49:23 + </div> + <div class="clear"> + <hr/> + </div> + </div> + </body> +</html>
