Lenguajes de tecnologías Web
A continuación, se definirán de manera general algunos de los lenguajes de programación Web más populares en el mercado. Algunos de ellos son de carácter privativos, y se requieren la compra de licencia para su uso, o viene incluido en la compra de otro producto; otros por lo contrario pertenecen a la familia del Software Libre, y se rigen por la Licencia GPL (General Public License), y puede ser usado libremente.
PHP
Según el manual del PHP (2007): “PHP, acrónimo de "PHP: Hypertext Preprocessor", es un lenguaje "Open Source" interpretado de alto nivel, especialmente pensado para desarrollos Web y el cual puede ser embebido en páginas HTML. La mayoría de su sintaxis es similar a C, Java y Perl y es fácil de aprender. La meta de este lenguaje es permitir escribir a los creadores de páginas Web, páginas dinámicas de una manera rápida y fácil, aunque se pueda hacer mucho más con PHP.” [7]
Para explicar que es el PHP, se puede observar éste sencillo ejemplo:
___________________________________________________________________________
<html><head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
echo "Hola, ¡soy un script PHP!";
?>
</body></html>
___________________________________________________________________________
Puede apreciarse que no es lo mismo que un script escrito en otro lenguaje de programación como Perl o C -- En vez de escribir un programa con muchos comandos para crear una salida en HTML, escribimos el código HTML con cierto código PHP embebido (incluido) en el mismo, que producirá cierta salida (en nuestro ejemplo, producirá un texto). El código PHP se incluye entre etiquetas especiales de comienzo y final que nos permitirán entrar y salir del modo PHP.
Lo que distingue a PHP de la tecnología Javascript, la cual se ejecuta en la máquina cliente, es que el código PHP es ejecutado en el servidor. Si tuviésemos un script similar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibiría el resultado de su ejecución en el servidor, sin ninguna posibilidad de determinar qué código ha producido el resultado recibido. El servidor Web puede ser incluso configurado para que procese todos los archivos HTML con PHP. (PHP Manual, 2007)[7].
Según Castillo (2005), PHP funciona de la siguiente forma: “PHP es una extensión para servidores Web. Lo que hace es ponerse "entre" el servidor y el cliente.” [8].
Figura 2. Funcionamiento del PHP.
Fuente: Wikilearning (2005).
PHP toma código dentro de las páginas, lo ejecuta en el servidor y envía el resultado al cliente. El cliente no puede visualizar el código del programa, sólo su resultado. Además, por ser un lenguaje de scripting, los programas no se compilan, sino sólo se interpretan; esto significa que es más lento en ejecutarse que, por ejemplo, un programa en C, pero al mismo tiempo los cambios en el código PHP tienen efecto de inmediato.
No todos los archivos son interpretados por el plug-in de PHP, sino sólo aquellos que hayan sido definidos en la configuración del servidor como tales, puesto que la interpretación de código es un proceso que toma un tiempo mayor al que se emplea en enviar una página tal como está. Es común utilizar una o varias de las siguientes extensiones para informar al servidor que debe interpretarlas: .php, .phtml, .php3 y .php4. (Castillo, 2005) [8].
ASP
Según Wikipedia (2008), “Active Server Pages (ASP) es una tecnología del lado del servidor de Microsoft para páginas Web generadas dinámicamente, que ha sido comercializada como un anexo a Internet Information Server (IIS). La tecnología ASP está estrechamente relacionada con el modelo tecnológico de su fabricante. Intenta ser solución para un modelo de programación rápida ya que programar en ASP es como programar en VisualBasic.” [9].
(...)
Lo interesante de este modelo tecnológico es poder utilizar diversos componentes ya desarrollados como algunos controles ActiveX. ASP ha pasado por cuatro iteraciones mayores, ASP 1.0 (distribuido con IIS 3.0), ASP 2.0 (distribuido con IIS 4.0), ASP 3.0 (distribuido con IIS 5.0) y ASP.NET (parte de la plataforma .NET de Microsoft). Las versiones pre-.NET se denominan actualmente (desde 2002) como ASP clásico.
(...)
En el último ASP clásico, ASP 3.0, hay siete objetos integrados disponibles para el programador, Application, ASPError, Request, Response, Server, Session y ObjectContext. Cada objeto tiene un grupo de funcionalidades frecuentemente usadas y útiles para crear páginas Web dinámicas.
Las páginas pueden ser generadas mezclando código de scripts del lado del servidor (incluyendo acceso a base de datos) con HTML. Por ejemplo:
___________________________________________________________________________
<html><head>
<title>Ejemplo de ASP</title>
</head>
<body>
<%if x=1 then%>
<b>X igual a uno</b>
<%else%>
<b>X diferente a uno</b>
<%end if%>
</body></html>
___________________________________________________________________________
Se facilita la programación de sitios Web mediante varios objetos integrados, como por ejemplo un objeto de sesión basada en cookies, que mantiene las variables mientras se pasa de página a página.
Desde 2002, el ASP clásico está siendo reemplazado por ASP.NET, que, entre otras cosas, reemplaza los lenguajes interpretados como VBScript o JScript por lenguajes compilados a código intermedio (llamado MSIL o Microsoft Intermediate Language) como Visual Basic, C#, o cualquier otro lenguaje que soporte la plataforma .NET. El código MSIL se compila con posterioridad a código nativo. (...)[9]
A continuación en la figura 3, se muestra un ejemplo gráfico de lo anterior:
Figura 3. Ciclo de vida de una página en ASP.Net.
Fuente: ASP 101. (2006).
JSP
JavaServer Pages (JSP) es una tecnología Java que permite generar contenido dinámico para Web, en forma de documentos HTML, XML o de otro tipo.Esta tecnología es un desarrollo de la compañía Sun Microsystems. La Especificación JSP 1.2 fue la primera que se liberó y en la actualidad está disponible la Especificación JSP 2.1.
Las JSP's permiten la utilización de código Java mediante scripts. Además es posible utilizar algunas acciones JSP predefinidas mediante etiquetas. Estas etiquetas pueden ser enriquecidas mediante la utilización de Librerías de Etiquetas (TagLibs o Tag Libraries) externas e incluso personalizadas. Microsoft, la más directa competencia de Sun, ha visto en esta estrategia de Sun una amenaza, lo que le ha llevado a que su plataforma .NET incluya su lenguaje de scripts ASP.NET que permite ser integrado con clases .NET (ya estén hechas en C++, VisualBasic o C#) del mismo modo que jsp se integra con clases Java.
JSP puede considerarse como una manera alternativa, y simplificada, de construir servlets. Es por esto que una página puede hacer todo lo que un servlet puede hacer, y viceversa. Cada versión de la especificación de JSP está fuertemente vinculada a una versión en particular de la especificación de servlets. El funcionamiento general de la tecnología JSP es que el Servidor de Aplicaciones interpreta el código contenido en la página JSP para construir el código Java del servlet a generar. Este servlet será el que genere el documento (típicamente HTML) que se presentará en la pantalla del Navegador del usuario.
JSP -> Servidor Aplicaciones (Servlets) -> Cliente (Navegador).
Figura 4. Arquitectura del JSP.
Fuente: Wikipedia (2008).
El rendimiento de una página JSP es el mismo que tendría el servidor equivalente, ya que el código es compilado como cualquier otra clase Java. A su vez, la máquina virtual compilará dinámicamente a código de máquina las partes de la aplicación que lo requieran. Esto hace que JSP tenga un buen desempeño y sea más eficiente que otras tecnologías Web que ejecutan el código de una manera puramente interpretada. La principal ventaja de JSP frente a otros lenguajes es que el lenguaje Java es un lenguaje de propósito general que excede el mundo Web y que es apto para crear clases que manejen lógica de negocio y acceso a datos de una manera prolija.
Esto permite separar en niveles las aplicaciones Web, dejando la parte encargada de generar el documento HTML en el archivo JSP. Otra ventaja es que JSP hereda la portabilidad de Java, y es posible ejecutar las aplicaciones en múltiples plataformas sin cambios. Es común incluso que los desarrolladores trabajen en una plataforma y que aplicación termine siendo ejecutada en otra. Los servlets y Java Server Pages (JSPs) son dos métodos de creación de páginas Web dinámicas en servidor usando el lenguaje Java. En ese sentido son similares a otros métodos o lenguajes tales como el PHP, los CGIs (common gateway interface), programas que generan páginas Web en el servidor, o ASP (Active Server Pages), un método específico de Microsoft. Sin embargo, se diferencian de ellos en otras cosas. Para empezar, los JSPs y servlets se ejecutan en una máquina virtual Java, lo cual permite que, en principio, se puedan usar en cualquier tipo de ordenador, siempre que exista una máquina virtual Java para él. Cada servlet (o JSP, a partir de ahora lo usaremos de forma indistinta) se ejecuta en su propia hebra, es decir, en su propio contexto; pero no se comienza a ejecutar cada vez que recibe una petición, sino que persiste de una petición a la siguiente, de forma que no se pierde tiempo en invocarlo (cargar programa + intérprete).
Su persistencia le permite también hacer una serie de cosas de forma más eficiente: conexión a bases de datos y manejo de sesiones, por ejemplo. Los JSPs son en realidad servlets: un JSP se compila a un programa en Java la primera vez que se invoca, y del programa en Java se crea una clase que se empieza a ejecutar en el servidor como un servlet. La principal diferencia entre los servlets y los JSPs es el enfoque de la programación: un JSP es una página Web con etiquetas especiales y código Java incrustado, mientras que un servlet es un programa que recibe peticiones y genera a partir de ellas una página Web.
Un Ejemplo del código de las JSP's es:
__________________________________________________________________________
<%@ page errorPage="myerror.jsp" %><%@ page import="com.foo.bar" %>
<html>
<head>
<%! int serverInstanceVariable = 1;%>
...
<% int localStackBasedVariable = 1; %>
<table>
<tr><td></td></tr>...
___________________________________________________________________________
Extraído de Wikipedia (2008).[10].
PERL
Según Allen (2008), “Perl es un lenguaje de propósito general originalmente desarrollado para la manipulación de texto y que ahora es utilizado para un amplio rango de tareas incluyendo administración de sistemas, desarrollo Web, programación en red, desarrollo de GUI y más. Se previó que fuera práctico (facilidad de uso, eficiente, completo) en lugar de hermoso (pequeño, elegante, mínimo). Sus principales características son que es fácil de usar, soporta tanto la programación estructurada como la programación orientada a objetos y la programación funcional, tiene incorporado un poderoso sistema de procesamiento de texto y una enorme colección de módulos disponibles.”[11]
Para Wikipedia (2008), “La estructura completa de Perl deriva ampliamente del lenguaje C. Perl es un lenguaje imperativo, con variables, expresiones, asignaciones, bloques de código delimitados por llaves, estructuras de control y subrutinas. Perl también toma características de la programación shell. Todas las variables son marcadas con un signo precedente (sigil). Los sigil identifican inequívocamente los nombres de las variables, permitiendo a Perl tener una rica sintaxis. Notablemente, los sigil permiten interpolar variables directamente dentro de las cadenas de caracteres (strings). Como en los shell, Perl tiene muchas funciones integradas para tareas comunes y para acceder a los recursos del sistema. Perl toma las listas del Lisp, hash (memoria asociativa) del AWK y expresiones regulares del sed. Todo esto simplifica y facilita todas las formas del análisis sintáctico, manejo de texto y tareas de gestión de datos.
En Perl 5, se añadieron características para soportar estructuras de datos complejas, funciones de primer orden (p. e. clausuras como valores) y un modelo de programación orientada a objetos. Éstos incluyen referencias, paquetes y una ejecución de métodos basada en clases y la introducción de variables de ámbito léxico, que hizo más fácil escribir código robusto (junto con el pragma strict). Una característica principal introducida en Perl 5 fue la habilidad de empaquetar código reutilizable como módulos. Larry Wall indicó más adelante que "la intención del sistema de módulos de Perl 5 era apoyar el crecimiento de la cultura Perl en vez del núcleo de Perl".
Todas las versiones de Perl hacen el tipificado automático de datos y la gestión de memoria. El intérprete conoce el tipo y requerimientos de almacenamiento de cada objeto en el programa; reserva y libera espacio para ellos según sea necesario. Las conversiones legales de tipo se hacen de forma automática en tiempo de ejecución; las conversiones ilegales son consideradas errores fatales.” (Wikipedia, 2008)[12]
Un ejemplo de la famosa frese: “Hola mundo” en Perl, es el siguiente:
___________________________________________________________________________
#!/usr/bin/perl -wuse strict;
print "¡Hola mundo!\n"; # "\n" es un 'nueva línea'
___________________________________________________________________________
Según Wikipedia (2008)[13]: XML Lenguaje Extensible de Marcas es una tecnología en realidad muy sencilla que tiene a su alrededor otras tecnologías que la complementan y la hacen mucho más grande y con unas posibilidades mucho mayores.
XML, con todas las tecnologías relacionadas, representa una manera distinta de hacer las cosas, más avanzada, cuya principal novedad consiste en permitir compartir los datos con los que se trabaja a todos los niveles, por todas las aplicaciones y soportes. Así pues, el XML juega un papel importantísimo en este mundo actual, que tiende a la globalización y la compatibilidad entre los sistemas, ya que es la tecnología que permitirá compartir la información de una manera segura, fiable, fácil. Además, XML permite al programador y los soportes dedicar sus esfuerzos a las tareas importantes cuando trabaja con los datos, ya que algunas tareas tediosas como la validación de estos o el recorrido de las estructuras corre a cargo del lenguaje y está especificado por el estándar, de modo que el programador no tiene que preocuparse por ello.
Vemos que XML no está sólo, sino que hay un mundo de tecnologías alrededor de él, de posibilidades, maneras más fáciles e interesantes de trabajar con los datos y, en definitiva, un avance a la hora de tratar la información, que es en realidad el objetivo de la informática en general. XML, o mejor dicho, el mundo XML no es un lenguaje, sino varios lenguajes, no es una sintaxis, sino varias y no es una manera totalmente nueva de trabajar, sino una manera más refinada que permitirá que todas las anteriores se puedan comunicar entre si sin problemas, ya que los datos cobran sentido.
XML es interesante en el mundo de Internet y el e-bussiness, ya que existen muchos sistemas distintos que tienen que comunicarse entre si, pero como se ha podido imaginar, interesa por igual a todas las ramas de la informática y el tratamiento de datos, ya que permite muchos avances a la hora de trabajar con ellos.
El XML proviene de un lenguaje que inventó IBM allá por los años 70. El lenguaje de IBM se llama GML (General Markup Language) y surgió por la necesidad que tenían en la empresa de almacenar grandes cantidades de información de temas diversos.
Imaginar por un momento la cantidad de documentación que generaría IBM sobre todas las áreas en las que trabajaba e investigaba, y la cantidad de información que habrá generado hasta hoy. Así pues, necesitaban una manera de guardar la información y los expertos de IBM se inventaron GML, un lenguaje con el que poder clasificarlo todo y escribir cualquier documento para que se pueda luego procesar adecuadamente.
Objetivos y usos del XML
- Que fuera idéntico a la hora de servir, recibir y procesar la información que el HTML, para aprovechar toda la tecnología implantada para este último.
- Que fuera formal y conciso desde el punto de vista de los datos y la manera de guardarlos.
- Que fuera extensible, para que lo puedan utilizar en todos los campos del conocimiento.
- Que fuese fácil de leer y editar.
- Que fuese fácil de implantar, programar y aplicar a los distintos sistemas.
El XML se puede usar para infinidad de trabajos y aporta muchas ventajas en amplios escenarios. Veamos algunas ventajas del XML en algunos campos prácticos.
- Comunicación de datos. Si la información se transfiere en XML, cualquier aplicación podría escribir un documento de texto plano con los datos que estaba manejando en formato XML y otra aplicación recibir esta información y trabajar con ella.
- Migración de datos. Si tenemos que mover los datos de una base de datos a otra sería muy sencillo si las dos trabajasen en formato XML.
- Aplicaciones web. Hasta ahora cada navegador interpreta la información a su manera y los programadores del web tenemos que hacer unas cosas u otras en función del navegador del usuario. Con XML tenemos una sola aplicación que maneja los datos y para cada navegador o soporte podremos tener una hoja de estilo o similar para aplicarle el estilo adecuado. Si mañana nuestra aplicación debe correr en WAP solo tenemos que crear una nueva hoja de estilo o similar.
XML: Tiene una sintaxis extremadamente sencilla.
Dicen que el XML es un 10% del SGML y de verdad lo es, porque en realidad las normas que tiene son muy simples. Se escribe en un documento de texto ASCII, igual que el HTML y en la cabecera del documento se tiene que poner el texto
<?xml version="1.0"?>
En el resto del documento se deben escribir etiquetas como las de HTML, las etiquetas que nosotros queramos, por eso el lenguaje se llama XML, lenguaje de etiquetas extendido. Las etiquetas se escriben anidas, unas dentro de otras.
<ETIQ1>...<ETIQ2>...</ETIQ2>...</ETIQ1>
Cualquier etiqueta puede tener atributos. Le podemos poner los atributos que queramos.
<ETIQ atributo1="valor1" atributo2="valor2"...>
Los comentarios de XML se escriben igual que los de HTML.
<!-- Comentario -->
Y esto es todo lo que es el lenguaje XML en si, aunque tenemos que tener en cuenta que el XML tiene muchos otros lenguajes y tecnologías trabajando alrededor de él. Sin embargo, no cabe duda que la sintaxis XML es realmente reducida y sencilla.
Para definir qué etiquetas y atributos debemos utilizar al escribir en XML tenemos que fijarnos en la manera de guardar la información de una forma estructurada y ordenada. Por ejemplo, si deseamos guardar la información relacionada con una película en un documento XML podríamos utilizar un esquema con las siguientes etiquetas.
<?xml version="1.0"?>
<PELICULA nombre="El Padrino" año=1985>
<PERSONAL>
</DIRECTOR nombre="Georgie Lucar">
</INTERPRETE nombre="Marlon Brando" interpreta-a="Don Corleone">
</INTERPRETE nombre="Al Pacino" interpreta-a="Michael Corleone">
</PERSONAL>
</ARGUMENTO descripción="Pelicula de mafias sicilianas en Estados Unidos">
</PELICULA>
Como podéis ver, nos hemos inventado las etiquetas que nos venían en gana para poner este ejemplo y las hemos anidado de manera que la etiqueta más grande es la PELICULA y dentro de ella tenemos el PRESONAL y el ARGUMENTO. A su vez, dentro de PERSONAL tenemos tanto al DIRECTOR como a los actores (INTERPRETE).
Xml tiene una ventaja que se puede convertir en un inconveniente: cada persona/autor puede crear sus propias etiquetas.
Esto no trae problemas si trabajamos solos; pero, ¿y si trabajamos en equipo?,¿y si queremos exportar nuestros documentos?¿que estándar seguiremos?
Ej:
"A" puede escribir el nombre como sigue:
<nombre>Juan</nombre>
Sin embargo, "B" puede hacerlo así:
<nombre id="Juan"/>
Las 2 versiones son igual de correctas pero son diferentes; si extrapolamos esto a muchas marcas, entonces la lectura y/o modificación de documentos por diferentes personas puede ser un caos. (y como me enseñaron a mí en la universidad, "no es plan" que hagas una aplicación que sólo entiendas tú, de forma q si se quiere modificar, la empresa te tiene q pedir de rodillas a ti q lo hagas).
Para resolver estos problemas, proporcionando un pequeño estandar acerca de la sintaxis a utilizar, xml ofrece dos posibles soluciones:
- Las DTD's.
- Los Xml Schemas.
En las DTD's podemos hacer 4 tipos de declaraciones:
- Declaraciones de tipo de elemento (Element Type Declarations).
- Declaraciones de listas de atributos (Attribute List Declarations).
- Declaraciones de Entidades (Entity Declarations).
- Declaraciones de notación (Notation Declarations).
Las trataré una a una en los siguientes apdos.
Declaraciones de tipo de elemento
Estas declaraciones establecen qué elementos pueden formar parte del documento y cuales pueden formar parte de su interior (los elementos se anidan unos dentro de otros).
Sintaxis:
Los elementos que puede contener cada elemento (valga la redundancia) van siempre encerrados entre paréntesis y precedidos de la etiqueta <!ELEMENT.
Dentro de las etiquetas, cada elemento (atributo) podrá llevar uno de los siguientes símbolos detrás de su nombre:
| SÍMBOLO |
SIGNIFICADO (Indica...) |
, |
Secuencia de elementos |
? |
0 ó 1 ocurrencias |
* |
0 ó más ocurrencias |
+ |
1 ó más ocurrencias |
Empty |
que el elemento está vacío. |
Any |
Cualquier contenido es válido. |
#PCDATA |
que el contenido de la cadena puede ser una cadena de texto. |
Ejs:
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT nombre EMPTY>
<!ELEMENT cliente (nombre,apellidos,nif?,tlf*,direccion+)>
Este último ej. quiere expresar lo siguiente:
El elemento cliente debe contener a nombre y apellidos, puede contener a nif y tlf - a este incluso más de una vez- y debe contener al menos una vez la dirección del cliente (para poder enviarle el pedido a casa).
NOTA: Luego podemos hacer una redefinición de los subelementos si queremos.
EJ:
<!ELEMENT cliente (nombre,apellidos,nif?,tlf*,direccion+)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos(ape1,ape2?)>
.....
Además de esto, tambien podemos indicar que existen varias alternativas; para ello se usa el símbolo | (relción OR). Ej:
<!ELEMENT apellidos (#PCDATA|(ape1,ape2))>>
<!ELEMENT ape1 (#PCDATA)>
<!ELEMENT ape2 (#PCDATA)>
indica q se puede elejir entre teclear los 2 apellidos juntos ó por separado:
- <apellidos> Perez López </apellidos>
- <apellidos> <ape1> Perez </ape1> <ape2> López </ape2> </apellidos>
Declaraciones de listas de atributos
Ya hemos visto como denotar los elementos q puede tener el documento. Pero, ¿qué pasa con los atributos (si es q tienen) de todos y acada uno de los elementos?
Para definirlos se usan las declaraciones de listas de atributos, cuya sintaxis es la siguiente:
Sintaxis:
Todas las definiciones de atributos empezarán por: <!ATTLIST
Cada atributo está formado por 3 partes:
Nombre
Tipo del atributo
Valor por defecto
Las posibilidades para describir el tipo de un atributo(campo) y el valor por defecto del mismo las podeis ver en las siguientes tablas:
Tipo del atributo
| VALOR |
SIGNIFICADO |
CDATA |
El atributo será una cadena de caracteres. |
ID |
El atributo sirve para identificar al elemento dentro del documento. |
IDREF/S |
Este atributo se empleará para referenciar a otros elementos del documento a partir de su ID. |
ENTITY/S |
Contiene nombres de entidades. Ver siguiente apdo. |
NMTOKEN/S |
Contiene una única cadena de texto (ed, una sóla palabra). |
(<<enumerados>>) |
Aquí especificamos EL conjunto de valores q puede tomar el atributo; esto lo hacemos separandolos con |. |
NOTA: El valor para los atributos acabados en S (ej. IDEREFS) será una lista de valores separados por espacios en blanco.
Valores por defecto
VALOR |
SIGNIFICADO |
#REQUIRED |
Con esto indicamos que es obligatorio darle un valor al atributo. |
#IMPLIED |
Con esto indicamos que es opcional darle un valor al atributo. |
<<valor>> |
Podemos poner un valor (NO lista de valores) opcional directamente; entonces, si no se le otorga un nuevo valor posteriormente, asumirá el dado (ed, es el valor x por defecto). |
#FIXED <<valor>>> |
Con esto obligamos a q el atributo tome necesariamente el valor especificado en <<valor>> |
EJ:
<!ATTLIST cliente
numcli ID #REQUIRED
edad ("Menos de 18" | "entre 18 y 65" | "Más de 65") #IMPLIED
>
Al ser numcli de tipo ID indicamos q no puede haber 2 clientes con idéntico numcli.
Edad es un atributo no obligatorio q sólo puede tomar los valores de la lista enumerada.
Diferencias
A continuación, se especifican algunas diferencias de sintaxis de los lenguajes antes detallados.
Declaración y Asignación de Variables |
|
PHP |
Normalmente PHP elegirá un tipo apropiado de acuerdo al contexto para cada variable: |
ASP |
<% |
JSP |
<%! |
Perl |
my $animal = "camel"; |
Estructuras de control |
|
PHP |
<?php
<?php |
ASP |
<%
<% |
JSP |
<%
<% |
Perl |
if ( condition ) {
while ( condition ) { |
Comentarios |
|
PHP |
<? |
ASP |
<% |
JSP |
• Sólo visibles en página JSP |
Perl |
# Esto es un comentario |