Mostrando entradas con la etiqueta WML. Mostrar todas las entradas
Mostrando entradas con la etiqueta WML. Mostrar todas las entradas

lunes, 17 de mayo de 2010

WMLScript - Parte IV / IV

4.1 Introducción   

Con la finalidad de agilizar la tarea del programador y de reducir el número de código a enviar al teléfono cada vez que se ejecuta un programa en WMLScript, se han incorporado a los móviles una serie de bibliotecas estándar de WMLScript, de cuyas funciones podemos hacer uso.

Destacar que, para poder llamar a alguna de dichas funciones:

1. No es necesario incluir ningún fichero extra en el fichero desde el que se hace la llamada

2. La llamada a funciones de biblioteca tiene la forma:

nombreDeLaBiblioteca.nombreDeLaFuncion( parámetros )

Es decir, que se usa el punto (.) y no la almohadilla para llamar a la función.

4.2 WMLBrowser   

La biblioteca WMLBrowser se usa para poder acceder al contexto de la página WML, esto es, a sus variables. Las funciones que forman parte de esta biblioteca devolverán el valor invalid solo si el teléfono no soporta llamadas a esta biblioteca.

Veamos algunas de sus funciones (atención a mayúsculas y minúsculas):

--------------------------------------------------------------------------------

getVar( nombreDeVariablestring )

Devuelve el valor de la variable nombreDevariable. Si dicha variable no existiera, devuelve la cadena vacía.

Ejemplo:

var a=WMLBrowser.getVar( 'edad' );

--------------------------------------------------------------------------------

setVar( nombreDeVariablestring, valorstring )

Asigna a la variable el valor especificado.

Devuelve true si la asignación es satisfactoria, false en otro caso.

Ejemplo:

var a=WMLBrowser.setVar( 'edad', '18' ); // a=true

--------------------------------------------------------------------------------

go( urlstring )

Carga en el teléfono la página indicada en url. Si url es la cadena vacía, no hace nada.

Devuelve cadena vacía.

Ejemplo:

var a=WMLBrowser.go( 'http://geneura.ugr.es/wap/index.wml' ); // a=""

-------------------------------------------------------------------------------

prev( )

Carga en el teléfono la página anterior a la actual en el historial.

Devuelve cadena vacía.

Ejemplo:

var a=WMLBrowser.prev(); // a=""

--------------------------------------------------------------------------------

newContext( )

Reinicia el contexto de la página WML activa.

Devuelve cadena vacía.

Ejemplo:

var a=WMLBrowser.newContext(); // a=""

--------------------------------------------------------------------------------

getCurrentCard( )

Devuelve el URL relativo más pequeño especificando la carta (si es que la hay) que está siendo procesada en ese instante por el teléfono.

Ejemplo:

var a=WMLBrowser.getCurrentCard(); //

--------------------------------------------------------------------------------

refresh( )

Actualiza el contexto del teléfono haciendo que muestre de nuevo la carta que está procesando. Es especialmente útil para mostrar en pantalla el valor de las variables "globales" una vez han sido calculadas.

Devuelve la cadena vacía

Ejemplo:

var a=WMLBrowser.refresh(); //

--------------------------------------------------------------------------------

Ejercicio 1:

Realizar una página WML con tres cartas.
La primera dará un mensaje de bienvenida; también pedirá el nombre y el año de nacimiento de una persona e incorporará una opción de "ENTRAR AL SITIO WAP". Al seleccionar esta opción se invocará a una función WMLScript que calculará a partir del año de nacimiento si el usuario tiene más de 17 años o no. Si tiene más de 17 años lo enviará a la segunda carta indicándole que puede entrar al sitio WAP. Si no tiene más de 17 años lo enviará a la tercera carta diciéndole que NO puede entrar.

Ejercicio 2:

Realizar una página WML compuesta de dos cartas.
La primera de ellas debe disponer de una variable que comience valiendo 5 y un temporizador de 2 segundos de duración. Cuando se active el evento provocado por el temporizador se debe llamar a una función en WMLScript que haga decrecer la variable contadora, la muestre en pantalla y provoque un salto de nuevo a la primera carta si el contador no ha llegado a cero y a la segunda si ya lo ha hecho.
La segunda carta no tiene más que mostrar un mensaje para confirmar que se ha saltado a ella.

4.3 Lang   

Esta biblioteca, Lang, contiene un conjunto de funciones directamente relacionadas con la especificación del lenguaje WMLScript.

--------------------------------------------------------------------------------

abs( valornúmero )

Devuelve el valor absoluto del número que se le pasa.

Ejemplo:

var a=Lang.abs( -24.89 ); // a=24.89

--------------------------------------------------------------------------------

min( valor_1número, valor_2número )

Devuelve el valor menor de los dos que se le pasan.

Ejemplo:

var a=Lang.min( 75, -1 ); // a=-1

-------------------------------------------------------------------------------

max( valor_1número, valor_2número )

Devuelve el valor mayor de los dos que se le pasan.

Ejemplo:

var a=Lang.max( 75, -1 ); // a=75



--------------------------------------------------------------------------------

parseInt( valorstring )

Devuelve el valor entero correspondiente a la cadena que se le ha pasado, parando en el momento en que encuentra cualquier carácter distinto de los dígitos 0 al 9.

Ejemplo:

var a=Lang.parseInt( '120 km/h' ); // a=175

--------------------------------------------------------------------------------

parseFloat( valorstring )

Devuelve el valor real correspondiente a la cadena que se le ha pasado, parando en el momento en que encuentra cualquier carácter distinto de los dígitos 0 al 9, el punto (.) o la letra e indicadora de la notación científica.

Ejemplo:

var a=Lang.parseFloat( '-1.20e2 km/h' ); // a=1.2e2

--------------------------------------------------------------------------------

isInt( valorcualquier tipo )

Devuelve true si el valor pasado puede convertirse a entero usando parseInt

Ejemplo:

var a=Lang.isInt( '24.78 km/h' ); // a=true

--------------------------------------------------------------------------------

isFloat( valorcualquier tipo )

Devuelve true si el valor pasado puede convertirse a real usando parseFloat

Ejemplo:

var a=Lang.isFloat( '24.78e3 km/h' ); // a=true

--------------------------------------------------------------------------------

maxInt()

Devuelve el mayor número entero soportado.

Ejemplo:

var a=Lang.maxInt( ); // a=2147483647

--------------------------------------------------------------------------------

minInt()

Devuelve el menor número entero soportado.

Ejemplo:

var a=Lang.minInt( ); // a=-2147483648

--------------------------------------------------------------------------------

float()

Devuelve true si se soportan los números reales, false si no.

Ejemplo:

var a=Lang.float( ); // a=depende del teléfono

--------------------------------------------------------------------------------

exit ( valorcualquier tipo)

Finaliza la interpretación del código en WMLScript devolviendo el control a la entidad que llamó a la función.

Devuelve el valor que se le pasa como parámetro.

Ejemplo:

Lang.exit( "Finalizando. Código 1");

--------------------------------------------------------------------------------

abort( valorstring)

Finaliza la interpretación del código en WMLScript devolviendo el control a la entidad que llamó a la función junto a una descripción del error. Se utiliza cuando no se puede continuar con la ejecución del código en WMLScript debido a problemas serios.

Devuelve el valor que se le pasa como parámetro.

Ejemplo:

Lang.abort( "Fatal error");

--------------------------------------------------------------------------------

random( valornúmero)

Devuelve un número entero aleatorio (bueno, pseudo-aleatorio) entre 0 y el valor que se le pasa (ambos incluidos). El valor no puede ser negativo, y si es un número real, primero se pasa a entero (con Float.int).

Ejemplo:

var a=Lang.random( 10 )-5; // a=-5..5

--------------------------------------------------------------------------------

seed( valornúmero)

Inicializa el generador de números aleatorios con el valor que se le pasa. Si dicho valor es negativo se usa inicializa a un valor aleatorio. Si es un valor no válido, no se cambia el valor de inicialización.

Devuelve cadena vacía.

Ejemplo:

var a=Lang.seed( 5 ); // a=""

--------------------------------------------------------------------------------

characterSet( )

Devuelve el código del juego de caracteres usado por el teléfono que está ejecutando el WMLScript. Dicho código es establecido por el IANA.

Ejemplo:

var a=Lang.characterSet(); // a=4 para latin1

--------------------------------------------------------------------------------

Ejercicio 3:

Realizar una página WML que pida dos números reales y permita elegir una operación entre: SUMAR, RESTAR, MULTIPLICAR y DIVIDIR.
Una vez elegida la operación e introducidos los números, llamar a una función WMLScript que realice la operación y muestre el resultado.

Ejercicio 4:

Hacer una función WMLScript que genere secuencias de números de 4 dígitos aleatorios. Estos números podemos pensar que son los PINES de las tarjetas de crédito de una persona.
Para utilizar la función crear una página WML que pida un pin de 4 dígitos el cual será usado como semilla para generar la secuencia anteriormente citada.
Lo que se persigue es que siempre que el usuario introduzca el mismo pin se le muestre la misma secuencia de pines aleatorios.

4.4 Float   


La biblioteca Float contiene las funciones que más se utilizan a la hora de operar con números reales.

--------------------------------------------------------------------------------

int( valornúmero )

Devuelve la parte entera del número que se le pasa como parámetro.

Ejemplo:

var a=Float.int( -0.34) // a=0

--------------------------------------------------------------------------------

floor( valornúmero )

Devuelve el número entero más cercano pero no mayor que el valor que se le pasa.

Ejemplo:

var a=Float.floor( -0.34) // a=-1
var b=Float.floor( 2.34) // b=2

--------------------------------------------------------------------------------

ceil( valornúmero )

Devuelve el número entero más cercano pero no menor que el valor que se le pasa.

Ejemplo:

var a=Float.ceil( -0.34) // a=-0
var b=Float.ceil( 2.34) // b=3

--------------------------------------------------------------------------------

pow( valor_1número,valor_2número )

Devuelve valor_1 elevado a valor_2, teniendo en cuenta que si valor_1 es negativo, valor_2 debe ser un entero.

Ejemplo:

var a=Float.pow( 5,3) // a=125

--------------------------------------------------------------------------------

round( valornúmero )

Devuelve el número entero más cercano al valor que se le pasa.

Ejemplo:

var a=Float.round( -0.34) // a=-0
var b=Float.round( 2.65) // b=3

------------------------------------------------------------------------------

sqrt( valornúmero )

Devuelve la raíz cuadrada del valor que se le pasa. Dicho valor debe ser positivo, si no devuelve invalid.

Ejemplo:

var a=Float.sqrt( 123*123) // a=123

--------------------------------------------------------------------------------

maxFloat( )

Devuelve el mayor número real soportado.

Ejemplo:

var a=Float.maxFloat() // a=4.40282347E+38

--------------------------------------------------------------------------------

minFloat( )

Devuelve el menor número real soportado.

Ejemplo:

var a=Float.minFloat() // a=1.17549435E-38

--------------------------------------------------------------------------------

Ejercicio 5:

Modificar la calculadora del ejercicio 3 para que permita hacer otras operaciones como potencias, raíces cuadradas, etc.

4.5 String   

String aglutina funciones para el tratamiento de cadenas, aunque también nos puede servir para implementar matrices.

--------------------------------------------------------------------------------

length( cadenastring )

Devuelve un número entero indicando el número de caracteres que forman la cadena.

Ejemplo:

var a=String.length( "Hola!" ) // a=5

--------------------------------------------------------------------------------

isEmpty( cadenastring )

Devuelve true si la cadena es vacía.

Ejemplo:

var a=String.isEmpty( "Hola!" ) // a=false

--------------------------------------------------------------------------------

charAt( cadenastring, posicionnúmero )

Devuelve el carácter que se halla en la posición indicada de la cadena (el primer carácter está en la posición 0).

Ejemplo:

var a=String.charAt( "Hola!",2 ) // a="l"

--------------------------------------------------------------------------------

subString( cadenastring, posicionnúmero, longitudnúmero )

Devuelve la subcadena incluida en cadena empezando en posición y tomando longitud caracteres a partir de ella.

Ejemplo:

var a=String.subString( "Hola!",2,3 ) // a="la!"

--------------------------------------------------------------------------------

find( cadena_1string, cadena_2string )

Devuelve el índice del carácter a partir del cual se encuentra la cadena_2 incluida en cadena_1. Si no se incluye, devuelve -1.

Ejemplo:

var a=String.find( "Hola!","ol" ) // a=1

--------------------------------------------------------------------------------

replace( cadenastring, viejostring, nuevostring )

Devuelve una nueva cadena en la que se han substuido todas las ocurrencias de viejo por nuevo.

Ejemplo:

var a=String.replace( "Pandereta","a","1" ) // a="P1nderet1"

--------------------------------------------------------------------------------

elements( cadenastring, separadorcarácter )

Devuelve el número de elementos en la cadena separados por el separador.

Ejemplo:

var a=String.elements( "mi.casa.es","." ) // a=3

--------------------------------------------------------------------------------

elementAt( cadenastring, posiciónnúmero, separadorcarácter )

Devuelve el elemento número posición que resulta de descomponer la cadena según el separador.

Ejemplo:

var a=String.elementAt( "mi.casa.es",2,"." ) // a="es"

--------------------------------------------------------------------------------

removeAt( cadenastring, posiciónnúmero, separadorcarácter )

Devuelve la misma cadena en la que se ha quitado el elemento número posición que resulta de descomponer la cadena según el separador. El separador que sigue al elemento a quitar también desaparece.

Ejemplo:

var a=String.removeAt( "mi.casa.es",1,"." ) // a="mi.es"

--------------------------------------------------------------------------------

replaceAt( cadenastring, nuevostring posiciónnúmero, separadorcarácter )

Devuelve la misma cadena en la que se ha substituido por nuevo el elemento número posición que resulta de descomponer la cadena según el separador.

Ejemplo:

var a=String.replaceAt( "mi.casa.es","perro",1,"." ) // a="mi.perro.es"

--------------------------------------------------------------------------------

insertAt( cadenastring, nuevostring posiciónnúmero, separadorcarácter )

Devuelve la misma cadena en la que se ha incluido nuevo el elemento número posición que resulta de descomponer la cadena según el separador. Junto a nuevo se incluye el separador si hace falta.

Ejemplo:

var a=String.insertAt( "mi.casa.es","perro",1,"." ) // a="mi.perro.casa.es"

--------------------------------------------------------------------------------

squeeze( cadenastring )

Devuelve la misma cadena en la que se han substituido los grupos de espacios en blanco por uno solo.

Ejemplo:

var a=String.squeeze( "esta      es mi    casa" ) // a="esta es mi casa"

--------------------------------------------------------------------------------

trim( cadenastring )

Devuelve la misma cadena en la que se han quitado todos los espacios del principio y del final.

Ejemplo:

var a=String.trim( "    esta    es mi  casa " ) // a="esta    es mi  casa"

--------------------------------------------------------------------------------

compare( cadena_1string, cadena_2string )

Devuelve -1 si cadena_1 va alfabéticamente antes que cadena_2; 0 si son iguales y 1 si es al revés.

Ejemplo:

var a=String.compare( "Juan", "Luis") // a=-1

--------------------------------------------------------------------------------

toString( valorcualquier tipo )

Devuelve una cadena que representa al valor que se le ha pasado.

Ejemplo:

var a=String.toString( 12 ) // a="12";
var b=String.toString( false ) // b="false";
--------------------------------------------------------------------------------

format( formatocadena, valorcualquier tipo )

Devuelve una cadena que representa al valor que se le ha pasado utilizando el formato que se le indica como parámetro.

El formato se especificará como:

%[longitud].[precision] tipo

donde el tipo puede ser:

d Entero
f Real
s Cadena

Ejemplo:

var a=String.format( "%4d",12 ) // a="  12";
var b=String.toString( "%2.3f", 1.25 ) // b="1.250";

--------------------------------------------------------------------------------
Ejercicio 6:

Crear una función que compruebe si tras quitar los espacios iniciales y finales a una cadena sigue quedando algo o es la cadena vacía.

Ejercicio 7:

Realizar una página WML que pida el nombre y apellidos de una persona. Llamar posteriomente a una función WMLScript que muestre en pantalla las iniciales de dicha persona a partir de su nombre y apellidos.

Ejercicio 8:

Realizar una página WML qie pida el nombre y apellidos de una persona. Posteriormente llamara a una función WMLScript que le genere cinco posibles identificadores (para login o correo electrónico) atendiendo a las siguientes cinco reglas:
1. Iniciales del nombre seguidas del primer apellido.
2. Primer nombre más iniciales de los apellidos.
3. Iniciales del nombre y del primer apellido seguidas del último apellido.
4. Primer nombre y primer apellido separados por _.
5. Nombre completo (cambiando los espacios por _ si los hubiera) seguido de 4 dígitos aleatorios.

4.6 Url   

La biblioteca URL contiene funciones que manejan direcciones URL tanto absolutas como relativas.

Téngase en cuenta que la sintaxis genérica de un URL es:

scheme://host:port/path;params?query#fragment

--------------------------------------------------------------------------------

isValid( urlcadena )

Devuelve true si la cadena que se le pasa tiene una sintaxis correcta de URL, y false si no.

Ejemplo:

var a=URL.isValid( "http://geneura.ugr.es/w.html?a=5" )// a=true
var b=URL.isValid( "algo:??//conecta.com" ); // b=false

--------------------------------------------------------------------------------

getScheme( urlcadena )
getHost( urlcadena )
getPort( urlcadena )
getPath( urlcadena )
getParameters( urlcadena )
getQuery( urlcadena )
getFragment( urlcadena )

Devuelven cada una la parte del URL correspondiente según la sintaxis:

scheme://host:port/path;params?query#fragment

Ejemplo:

var a=URL.getScheme( "http://www.algo.es/" ) // a="http" var b=URL.getHost( "http://www.algo.es" ) // b="www.algo.es" var c=URL.getPort( "http://www.algo.es:8080" ) // c="8080" var d=URL.getPath( "http://www.algo.es/d1/d2/h.html" ) // d="/d1/d2/h.html" var e=URL.getParameters( "http://www.algo.es/h.html;3;4" ) // e="3;4" var f=URL.getQuery( "http://www.algo.es/h.html?name=pepe" ) // f="name=pepe" var g=URL.getFragment( "http://www.algo.es/h.html#ancla" ) // g="ancla"

--------------------------------------------------------------------------------

getBase( )

Devuelve el URL absoluto (sin la parte del fragment) de la biblioteca en que se ejecuta.

Ejemplo:

var a=URL.getBase( ) // a="http://www.algo.es/w.wmls"

--------------------------------------------------------------------------------

getReferer( )

Devuelve el URL relativo más pequeño del fichero desde el que se llamó a la biblioteca en que se ejecuta.

Ejemplo:

var a=URL.getReferer( ) // a="w1.wml"

--------------------------------------------------------------------------------

resolve( URLBasestring, URLIncluidostring )

Devuelve el URL absoluto que se forma uniendo el URLBase con el URLIncluido.

Ejemplo:

var a=URL.resolve( "http://www.a.es/","h.html") // a="http://www.a.es/h.html"

--------------------------------------------------------------------------------

escapeString( cadenastring )

Devuelve la cadena que se le pasa convirtiendo los caracteres especiales en su correspondiente secuencia en hexadecimal con la forma %xx.

Los caracteres especiales son:

- De control: del 00 al 1F y el 7F.
- Espacio: el 20.
- Reservados: ; / ? : @ & = + $ ,
- Otros: { } | \ ^ [ ] `
- Delimitadores: < > # % "

Ejemplo:

var a=URL.escapeString( "http://www.a.es/") // a="http%3a%2f%2fwww.a.es%2f"

--------------------------------------------------------------------------------

unescapeString( cadenastring )

Devuelve la cadena que se le pasa convirtiendo los caracteres especiales de su correspondiente secuencia en hexadecimal a su representación normal.

Ejemplo:

var a=URL.escapeString( "http%3a%2f%2fwww.a.es%2f") // a="http://www.a.es/"

--------------------------------------------------------------------------------

loadString( urlstring, contenidostring )

Devuelve el contenido especificado por el url absoluto y el tipo de contenido

Ejemplo:

var a=URL.loadString( "http://www.a.es/yo.vcf", "text/x-vcard") // a=contendría la información de la vcard especificada.

4.7 Dialogs   
Dialogs es una biblioteca con tres funciones cuyos nombres y funcionalidad serán muy conocidos por los programadores de JavaScript.

--------------------------------------------------------------------------------

alert( mensajestring)

Muestra el mensaje al usuario y espera hasta que pulsa OK.

Devuelve la cadena vacía.

Ejemplo:

Dialogs.alert( "Contacte en el 555 45 43 42" );

--------------------------------------------------------------------------------

confirm( mensajestring, aceptarstring, cancelarstring )

Muestra al usuario un mensaje junto a las alternativas aceptar y cancelar, y espera a que éste elija una de ellas.

Devuelve true si el usuario elige la alternativa aceptar, false si elige cancelar.

Ejemplo:

var a=Dialogs.confirm( "¿Desea acabar?", "Si", "No") // a=true o false

--------------------------------------------------------------------------------

prompt( mensajestring, valorPorDefectostring )

Muestra al usuario un mensaje y le permite introducir un valor, dándole también un valor por defecto.

Devuelve una cadena con el valor introducido por el usuario.

Ejemplo:

var a=Dialogs.prompt( "Su marca de coche:", "Seat" ); // a=lo que introduzca el usuario

--------------------------------------------------------------------------------
Ejercicio 9:

Realizar una página WML que permita introducir pares de valores nombre de producto/precio, alertando al usuario si introduce valores vacíos o negativos. La página debe ser tal que permita añadir nuevos productos, vaciar la lista entrea y visualizarla.

WMLScript - Parte III / IV

3.1 Introducción   

En Javascript, lenguaje del que se deriva WMLScript, el código de los programas se puede colocar indistintamente en medio de la página HTML o en un fichero aparte en el cual se definen funciones.

WMLScript es distinto. Es necesario definir funciones en ficheros externos y, posteriormente, hacer llamadas a las mismas desde la página WML.

Los ficheros con código WMLScript deben llevar extensión .wmls. Estos ficheros son a su vez compilados a un código intermedio, llamado bytecode que es el que realmente se manda al teléfono. Las extensiones de los ficheros compilados a bytecode es .wmlsc, conservándose como nombre el mismo que el del fichero con el código fuente.

La estructura de un fichero en WMLScript está formada por dos partes:

1. Zona de directivas pragma.

2. Zona de declaración de funciones.

Pasemos a ver cada una de ellas.

3.2 Directivas Pragma   

Los ficheros con código WMLScript comienzan por una zona en la que se incluyen los llamados pragma, que traduciremos por directivas del compilador, dado que son sentencias con información para el compilador, más que para las páginas WML.

Existen tres tipos de directivas:

- Para incluir ficheros externos (pragma url)
- Para controlar el acceso a las funciones(pragma access)
- Para añadir información adicional(pragma meta)

Veamos para qué sirven y cómo se usan cada uno de ellos.

3.3.1. Pragma url

Sirve para poder usar en nuestra biblioteca funciones que están definidas en otras bibliotecas.

Se usan de la siguiente forma:

use url identificador direccion_de_la_biblioteca_a_usar;

Por ejemplo:

use url mi_bib_1 "http://geneura.ugr.es/wap/script/bib_1.wmls";

El haber incorporado esta línea a la biblioteca permitirá hacer llamadas a funciones que estén definidas en el fichero bib_1.wmls que se especifica, y además proporciona un identificador a dicho fichero (en este caso el identificador es mi_bib_1), de modo que podremos hacer llamadas como la siguiente:

mi_bib_1#mi_funcion( parametros)

Por supuesto, la dirección del fichero con la biblioteca externa puede ser absoluta (como en el ejemplo) o relativa al fichero que contiene la biblioteca que estemos construyendo en ese instante. En cualquier caso, deben ser direcciones válidas que NO contengan el carácter #.

Se pueden incluir tantas directivas url como sean necesarias.

3.3.3. Pragma access

Permite restringir el acceso a las funciones contenidas en la biblioteca solo a las páginas WML que procedan de ciertos dominios y/o directorios.

Se usa de la siguiente forma:

use access domain dominio_permitido;
use access path directorio_permitido;
use access domain dominio_permitido path directorio_permitido;

Por ejemplo:

use access domain "ugr.es" path "/wml
Permitiría el acceso desde las siguientes direcciones:

- geneura.ugr.es/wml/~victor/wap
- goliat.ugr.es/wml/wap-pages
- fedro.ugr.es/wml

Pero no lo permitiría a llamadas que proviniesen de sitios como:

- geneura.ugr.es/cgi-bin
- www.ujaen.es
- fedro.ugr.es/wap/wml

Solo se puede incluir una directiva access en cada fichero.

3.3.3. Pragma meta

Permiten añadir información extra al fichero WMLScript, sin requerir ninguna acción especial por parte del teléfono que llama a la función.

Existen tres tipos de directivas meta:

- use meta name nombre contenido esquemaopc;
- use meta http equiv nombre contenido esquemaopc;
- use meta user agent nombre contenido esquemaopc;

donde:

nombre especifica un nombre para la propiedad meta que se está definiendo.
contenido es el valor para dicha propiedad.
esquema indica un formato o estructura que debe ser usada para interpretar el valor (y que varía en función del tipo de meta que se define).

En un fichero en el que se está definiendo una biblioteca se pueden incluir más de una directiva meta, pero solo una de cada tipo.

3.3.3.1. use meta name

Crea información dirigida al servidor web, no al teléfono móvil. De hecho, los servidores suelen quitar está información del bytecode y no la envían al teléfono.

Ejemplo:

use meta name "autor" "Víctor Rivas Santos";

3.3.3.3. use meta http equiv

Permite crear cabeceras HTTP, de modo que podamos definir meta como en HTML

Ejemplo:

use meta http equiv "keywords" "WMLScript,Wap";

3.3.3.3. use meta user agent

Permite mandar cierta información al teléfono que realiza la llamada a la función. Evidentemente, la información que se puede mandar varía de unos teléfonos a otros.

Ejemplo:
use meta user agent "Type" "prueba";

3.3 Declarar funciones   

Antes de ver cómo se declaran funciones, vamos a dar algunos datos de ellas:

- No se pueden declarar funciones anidadas
- El nombre de cada función debe ser único dentro de cada fichero
- Todos los parámetros son pasados por VALOR a la función
- En las llamadas a una funcion se le deben pasar el mismo número de valores como parámetros necesite
- Todas las funciones devuelven un valor, que por defecto es la cadena vacía, ""

La declaración de funciones se realiza de la siguiente forma:

externopc function nombre( parámetrosopc ) {
     sentenciasopc
}

La palabra extern indica si la función que se declara puede ser llamada desde el exterior de la biblioteca o no (tomando en consideración el contenido del pragma access que se pudiera haber colocado). Como se ve, es necesario indicarlo para que se pueda llamar a la función desde fuera, pues por defecto no se permite.

Todas las funciones devuelven un valor que, por defecto es la cadena vacía. No obstante esto puede ser modificado mediante la sentencia:

return expresion;

Que permite devolver cualquier tipo de valor.

He aquí un ejemplo:

extern function percentage( cantidad, perc ) { return cantidad*perc/100; }

Como ya se dijo, la forma de realizar una llamada a una función dependerá de dónde esté declarada dicha función. Así, distinguiremos llamadas a funciones locales, externas o de biblioteca estándar.

Para la llamada a funciones locales (es decir, definidas en la misma biblioteca desde donde se realiza la llamada) solo hemos de poner el nombre de la función y los parámetros.
Ejemplo:

function f1() { // hace algo } function f2() { f1(); //llama a la función f1 }

Para la llamada a funciones externas (definidas en otra biblioteca), tendremos que dar un alias a la biblioteca externa y posteriormente usar la almohadilla (#) para llamar a la función.
Ejemplo:

use url mi_bib "bib.wmls"; function f1() { mi_bib#f2(); // Llama a f2() definida en bib.wmls }

Por último, Para la llamada a funciones de bibliotecas estándar usaremos el nombre de la biblioteca, un punto y el nombre de la función.
Ejemplo:

function f1() { Dialogs.alert( "Hola" ); // Llama a alert definida en Dialogs }

WMLScript - Parte II/IV

2.1 Filosofía General   

Al igual que Javascript, WMLScript toma su sintaxis de los lenguajes de programación más conocidos, fundamentalmente C, aunque también algo de Pascal.

- Se pueden añadir comentarios con; // y /* ... */
- Distingue entre mayúsculas y minúsculas
- Los nombres de las variables siguen el formato habitual de los lenguajes de programación: empieza por letra o por _, y sigue con más letras, o números o _
- No soporta objetos
- No soporta matrices
- Es obligatorio declarar las variables de la siguiente forma:

var nombreDeLaVariable=valor;

aunque la asignación de un valor inicial es opcional. Como se ve, no hay que decir el tipo de las variables.

- El ámbito de validez de una variable es únicamente la función en la que se ha declarado.
- Se pueden usar variables globales definiendo variables de entorno para la página WML. Estas variables de entorno pueden ser accedidas desde WMLScript mediante la biblioteca estándar WMLBrowser.
- El paso de parámetros a las funciones es SIEMPRE por valor; no existe paso por variable o referencia
- Se pueden usar cinco tipos de datos, que son: Integer, Float, String, Boolean, Invalid
- La función typeof devuelve un entero representando el tipo de dato que es:

0: Integer
1: Float
2: String
3: Boolean
4: Invalid

- A su vez, la función isvalid nos dice si la expresión que se le pasa como parámetro devuelve un valor válido o no. Por ejemplo:

isvalid( 1/0 )

devolvería false, dado que 1/0 no es un número válido.

2.2 Sentencias   

La sintaxis de las sentencias es similar a Javascript.

Secuenciales

La asignación se realiza de la misma forma que en C, es decir:

variable=expresion

La sentencia de escritura debe ser simulada mediante la introducción de variables de ENTORNO en las cartas WML. Para cambiar el contenido de la pantalla del móvil crearemos desde WML una variable vacía y la escribiremos en pantalla. Luego se modificará desde una función WMLScript que tendrá en alguna parte de su código instrucciones como las siguientes:

... WMLBrowser.setVar( 'edad', '75' ); WMLBrowser.refresh(); ...

Es el WMLBrowser.refresh(); el que provoca que se reescriba la carta en la pantalla del móvil haciendo que se vea el valor de la variable deseada.

Por su parte, también la sentencia de lectura es simulada con etiquetas del tipo input, o mediante llamadas a la función Dialogs.prompt(), la cual permite pedir un dato al usuario e introducirlo en una variable.

Condicionales


WMLScript incorpora la sentencia condicional por excelencia de cualquier lenguaje: IF... THEN... ELSE..., aunque eso sí en formato de C.

if ( condicion ) { sentencias_true; } else { sentencias_false; }


Iterativas


En este caso también nos encontramos con las sentencias típicas de cualquier lenguaje, a saber:

while( condicion ) { sentencias; }

do { sentencias; } while ( condicion );

for( inicializacion; condición; incremento ) { sentencias; }


Incrementos y operaciones con variables

Como ocurre con C y otros lenguajes, existen formas rápidas de incrementar y decrementar las variables, así como de hacer asignaciones selectivas:

variable++; ++variable; variable--; --variable;

variable+=valor; variable-=valor; variable*=valor; variable/=valor;

variable=(condicion)?valor_true:valor_false;

Comentarios

Como cualquier lenguaje que se precie, WMLScript permite documentar nuestro código mediante la inclusión de comentarios:

Con // obtendremos comentarios hasta el final de la línea. Mientras que con /* .... */ obtendremos comentarios de varias líneas.

WMLScript - Parte I/IV

1.1 Qué es WMLScript

WMLScript es un lenguaje que podemos considerar un dialecto de JavaScript. Lo que Javascript es para HTML en el entorno Web, lo es WMLScript para WML en el entorno WAP.
La intención de los creadores de WMLScript es dotar de un poco de inteligencia propia (dicho con todo el respeto que requiere la unión de la palabra inteligencia y cualquier aspecto relacionado con una máquina) al teléfono en el que se reciben las páginas WML, de modo que podamos descargar al servidor WAP de realizar más tareas que las estrictamente imprescindibles; a la vez, evitaremos el acabar con el poco ancho de banda que actualmente posee este sistema, dado que suprimiremos algunas conexiones entre el teléfono y el servidor.
La potencia de WMLScript es, hasta este momento, bastante limitada, pero permite al teléfono realizar cálculos, personalizar páginas WML o validar los datos introducidos por el usuario antes de enviarlos al servidor WAP, por citar algunas utilidades.
WMLScript es un lenguaje débilmente tipificado y que NO acepta objetos. Se compila en el servidor a un código intermedio denominado bytecode que es lo que se envía al teléfono cuando este lo requiere.
A diferencia de JavaScript, el código en WMLScript NO se encuentra en las páginas WML, sino que se encuentra en ficheros externos que, como se ha dicho, deben ser compilados.
Un fichero con código fuente WMLScript tendrá extensión .wmls, mientras que una vez compilado llevará extensión .wmlsc
Al programar en WMLScript se hace un uso intensivo de una serie de bibliotecas estándar definidas para este lenguaje. Estas bibliotecas agilizan el trabajo de los programadores dado que están incorporadas en el traductor de bytecode instalado el teléfono y son directamente ejecutables por él.
En las siguientes secciones veremos estas bibliotecas y aprenderemos a usar algunas de las funciones que incorporan.

1.2 Llamadas a funciones

Es imprescindible conocer a la perfección el modo en que desde WMLScript se hace una llamada a una función dado que es la única forma en la que podemos hacer uso del mismo desde una página WML.
Al revés que en Javascript, donde podemos poner código en cualquier sitio para que se ejecute en cuanto sea leido por el Navegdador, en WMLScript hemos de poner todo el código dentro de unfciones, y para ejecutarlo debemos hacer llamadas a dichas funciones.
La forma en que se realiza una llamada a una función depende de si la función pertenece a una biblioteca estándar o si pertenece a una biblioteca creada por nosotros
Si pertenece a una biblioteca estándar, haremos la llamada de la siguiente forma
nombreDeLaBiblioteca.nombreDeLaFuncion( parámetros )
en la que lo que destaca es que el punto (.) es el separador del nombre de la biblioteca y el nombre de la función.
Sin embargo, si la función pertenece a una biblioteca creada por nosotros la llamada se hará de la siguiente forma:
URLdelFichero.wmls#nombreDeLaFuncion( parámetros )
En este caso, es el carácter almohadilla (#) el que se usa.

Las llamadas a funciones en WMLScript se pueden realizar en cualquier sitio en el que podamos colocar una dirección URL.
Por ejemplo, se puede hacer que el usuario llame a una función en WMLScript desde cualquier punto de una página WML usando un enlace:
O bien, añadiendo una opción al menú de opciones del teléfono con la etiqueta y dentro de ella una etiqueta :
O, por último, como el resultado de que se lance un determinado evento. Como en el siguiente ejemplo:
...

lunes, 8 de marzo de 2010

WAP - WML en Visual Basic .Net

Actualmente vivimos en un mundo en continuo movimiento e interconectado. El no pertenecer o tomar ventajas de la tecnología y lo que hoy Internet ofrece nos colocaría en el lado opuesto y desfavorable de la llamada “Brecha Tecnológica”. Si bien hoy sigue siendo motivo de preocupación los índices de analfabetos en los países, es posible también realizar una medición de los analfabetos del nuevo siglo, es decir, todos aquellos que no saben que uso darle a una computadora.
Los avances del día a día nos sorprenden y todo lo relacionado a la movilidad esta tomando cada vez mas impulso. Ya no es algo limitado a aquellos aventureros que con sus Palm Tops o Pocket PCs o cualquier dispositivo para “colocar sobre la palma de la mano” o PDA, acceden a los diarios y noticias del día o consultan los valores de las acciones mientras van al trabajo, sino que ahora con la invasión de teléfonos móviles y la tecnología GSM a precios “accesibles” y la revolución de la tecnología Wi-Fi esto esta al alcance de todos. Hoy los teléfonos móviles son herramientas muy potentes y ofrecen muchas funcionalidades muy distantes de sus antecesores analógicos. Pues bien, quien tomara el control o la delantera, las PDAs o los teléfonos móviles, ya que es claro que van aproximándose a ser lo mismo, no es un debate de este artículo pero si algo a no perder de foco.
Ya hay una infinidad de aplicaciones que se apoyan en esta tecnología y con un simple teléfono móvil con acceso a Internet se pueden desarrollar actividades como registro de ventas en terreno, inventarios de stock in situ, historias clínicas para médicos que realizan visitas domiciliarias, consulta de resultados deportivos, acciones, cartelera de cines, horóscopos, etc.

No todo es rosas

Si bien parecería que estamos frente a un campo fértil aun no explotado, existen algunas características a contemplar a la hora de comenzar a sembrar:
- Las pantallas de los dispositivos móviles son relativamente chicas y los periféricos de entrada de datos a los mismos son un tanto tediosos al usarlos o lentos.
- El ancho de banda no es constante, debido por ejemplo al trafico existente, cambio de una base a otra en el caso de los celulares.
- Las baterías de estos dispositivos son de poca duración.
- Tienen una relativa baja velocidad de procesamiento.
Ahora pasando al terreno más técnico y práctico de este artículo hay algunas consideraciones y conceptos para comenzar a entender el tema y cual es la plataforma que soporta esta tecnología. Les tiro dos palabras:
- WAP
- WML

¿Qué es WAP? (Wireless Application Protocol)

Pues bien, podemos decir que es un protocolo que se base en los estándares de Internet. Su razón de ser es permitir a los teléfonos celulares o PDAs poder navegar en la Web. El protocolo WAP implica una serie de tecnologías como el WML (lenguaje de etiques), WMLScript (lenguaje script similar a un JavaScript) y el WTAI (Gíreles Telephony Application Interface).
En la práctica y para el desarrollador, una página creada para ser visualizada en un dispositivo WAP (un teléfono celular por ejemplo) tendrá la extensión wml, por ejemplo index.wml. Las mismas deberán estar hospedadas en un servidor como cualquier sitio web tradicional.  De hecho es posible utilizar el Internet Information Server aunque muy posiblemente se deberán realizar ciertos ajustes en relación a los tipos MIME, agregando los tipos que se detallan en la siguiente tabla.

MIME TYPE

Tipo de contenido

Mime Type

Extension

Fichero WML

text/vnd.wap.wml

wml

Bitmap

image/vnd.wap.wbmp

wbmp

WML Compilado

application/vnd.wap.wmlc

wmlc

Fichero WMLScript

text/vnd.wap.wmlscript

wmls

WMLScript compilado

application/vnd.wap.wmlscriptc

wmlsc
A continuación una figura de cómo quedarían establecidos en el Internet Information Server:

¿Qué es el WML?

Para empezar es un leguaje de etiquetas como su sigla lo indica, Wireless Markup Language. Es además un estándar de la industria para desplegar contenido WAP. Para mas información en especial la definición del mismo recomiendo visitar el sitio http://www.wapforum.org/
Se asemeja en gran parte con el HTML, definiendo etiquetas, que luego cualquier navegador WAP puede interpretarlas y desplegar el contenido de la página.
Su definición esta basada en el estándar ampliamente difundido del lenguaje XML, utilizando para ella elementos y atributos. Mediante WML podremos:
- Manipular texto e imágenes. El texto puede tener atributos de formato. Las imágenes tienen la extensión .wbmp
- Manipular variables y formularios, permitiendo esto transmitir información entre el dispositivo móvil y el servidor
- Navegación entre “decks”  (las páginas en WML) de la misma forma en que se navega entre páginas Web. (Un documento WML está formado por un elemento “deck” que puede contener múltiples elementos “card”)

Ahora si, manos a la obra

Antes de adentrarnos en la programación utilizando Visual Studio 2003 veremos algunos ejemplos sencillos que perfectamente pueden ser creados utilizando el Notepad como editor de texto. Adicionalmente se toma como un supuesto que se tiene instalado el Internet Information Server. Para poder probar todos estos ejemplos se deberá crear un sitio web local al que llamaremos “Guapeando” (de forma tal que podamos acceder al mismo colocando la direccion URL: http://localhost/Guapeando)
Ejemplo 0 – Un Archivo WML:
Este ejemplo lo único que realizará será mostrar un texto en un emulador WAP. Utilizaremos para crearlo simplemente el Notepad y copiaremos el siguiente codigo: 

<?xml version="1.0"?> 
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> 
<wml> 
  <card id="mycard" title="My first card"> 
   <p>Hola Hemisferio Sur</p> 
  </card> 
</wml>

El archivo la grabaremos como 1.wml en la carpeta del sitio Guapeando y lo probaremos en un emulador WAP.
NOTA: Podemos utilizar un emulador como el de Openwave el Microsoft Mobile  Explorer 3.0. Ademas para que esto funcione tenemos que haber agregado los tipos MIME que mencioné anteriormente en este articulo en las propiedades del sitio desde el Internet Information Server.


Ejemplo 1 – Un Archivo ASP:
Creamos una pagina ASP con el Notepad donde copiamos el siguiente código.
El resultado deberá mostrar la fecha  del día que tenga seteada el PC.

<% Response.ContentType = "text/vnd.wap.wml" %> 
<?xml version="1.0"?> 
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> 
<wml> 
   <card id="Principal" title="Principal"> 
      <p>Hoy es: <%= day(Now()) & "/" & month(Now()) & year(Now()) %></p> 
   </card> 
</wml>
El archivo la grabaremos como 1.asp en la carpeta del sitio Guapeando y lo
probaremos en un emulador WAP.


Ejemplo 2 – Una galletita?:
Este ejemplo es un poco mas elaborado ya que utiliza información almacenada en un “cookie”, pero de igual manera que el primer ejemplo puede ser realizado en el NotePad y grabado como una pagina ASP. 

<% Response.ContentType = "text/vnd.wap.wml" %> 
<% Response.Cookies ("ELUsuario")="Mickey" %> 
<?xml version="1.0"?> 
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> 
<wml> 
   <card id="Principal" title="Principal"> 
    <% DIM Name 
      Name=Request.Cookies ("ELUsuario") %> 
   <p> El usuario es: <%= Name %> </p> 
   </card> 
</wml>
El archivo la grabaremos como 2.asp en la carpeta del sitio Guapeando y lo
probaremos en un emulador WAP.
Pues bien, hasta aquí los ejemplos han sido trabajando con WML y ASP pero pasaremos a utilizar ASP.NET pero aun no abandonando el NotePad como editor de texto.

Ahora si un ejemplo práctico en .NET

A partir de ahora describiré en unos pocos pasos un ejemplo práctico y sencillo de creación de una pagina WAP que provea información de la cartelera de cines de una localidad. Nos conectaremos a una base Access y tomaremos de la misma los datos con la información de las películas a emitirse. 
Paso 1: Lo primero será crear un proyecto Visual Basic del tipo
“ASP.NET Mobile Web Application” al que llamaremos “Guapeando”.
Paso 2 : Al archivo MobileWebForm1.aspx que se crea una vez
generado el proyecto lo renombramos a Bienvenida.aspx. Este archivo
contiene lo que se denomina una pagina móvil y básicamente consiste en un
Form. En el agregaremos un texto “Películas WAP” y un enlace “Enviar” a otro
Form al que llamaremos Resultado.aspx
La sección HTML de la pagina Bienvenida.aspx debe quedar como se ve a contiuación: 

<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %> 
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Bienvenida.aspx.vb" Inherits="Guapeando.MobileWebForm1" %> 
<HEAD> 
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1"> 
    <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1"> 
    <meta name="vs_targetSchema" content="http:"//schemas.microsoft.com/Mobile/Page"> 
</HEAD> 
<body Xmlns:mobile="http:"//schemas.microsoft.com/Mobile/WebForm"> 
<mobile:Form id="Form1" runat="server" Font-Name="Arial Black" Font-Size=" Normal " Alignment="Center"><BR><BR>Peliculas WAP <BR><BR> 
<mobile:Link id="Ingresar" Font-Size="Small" runat="server" NavigateUrl="Resultado.aspx">Entrar</mobile:Link><BR> 
</mobile:Form> 
</body>

La sección de código Visual Basic de dicha página debe quedar como se muestra a continuación: 

Imports System.Data 
Imports System.Data.OleDb 
Imports System.Data.SqlClient 
  
Public Class MobileWebForm1 
  
   Inherits System.Web.UI.MobileControls.MobilePage 
  
#Region " Web Form Designer Generated Code " 
  
   'This call is required by the Web Form Designer. 
   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() 
  
   End Sub 
   Protected WithEvents Ingresar As System.Web.UI.MobileControls.Link 
   Protected WithEvents List1 As System.Web.UI.MobileControls.List 
   Protected WithEvents Form1 As System.Web.UI.MobileControls.Form 
  
   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Init 
      'CODEGEN: This method call is required by the Web Form Designer 
      'Do not modify it using the code editor. 
      InitializeComponent() 
   End Sub 
  
#End Region 
  
   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load 
      'Put user code to initialize the page here 
   End Sub 
End Class

Paso 3 :Agregamos un nuevo objeto al proyecto del tipo Mobile Web Form. A esta pagina la llamaremos Resultado.aspx. La pagina anterior del Paso 2, apuntará a esta como ya se dijo.
Paso 4: Dentro del Form colocaremos un control List tomado de la Toolbox de la zona Mobile Web Forms. En dicho control List mostraremos el resultado con la lista de películas tomadas de la base de datos.
La sección HTML de la pagina Resultado.aspx debe quedar como se ve a continuación: 

<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %> 
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Resultado.aspx.vb" Inherits="Guapeando.Resultado" %> 
<HEAD> 
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1"> 
    <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1"> 
    <meta name="vs_targetSchema" content="http:"//schemas.microsoft.com/Mobile/Page"> 
</HEAD> 
<body Xmlns:mobile="http:"//schemas.microsoft.com/Mobile/WebForm"> 
   <P> 
   <mobile:Form id="Form2" runat="server" Font-Size="Small">  
   <mobile:List id="List1" runat="server"></mobile:List></mobile:Form> 
   </P> 
</body>

La sección de código visual basic de dicha página debe quedar como se muestra a continuación: 

Imports System.Data.OleDb 
  
Public Class Resultado 
   Inherits System.Web.UI.MobileControls.MobilePage 
  
#Region " Web Form Designer Generated Code " 
  
   'This call is required by the Web Form Designer. 
   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() 
  
   End Sub 
   Protected WithEvents List1 As System.Web.UI.MobileControls.List 
   Protected WithEvents Form2 As System.Web.UI.MobileControls.Form 
  
   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Init 
      'CODEGEN: This method call is required by the Web Form Designer 
      'Do not modify it using the code editor. 
      InitializeComponent() 
   End Sub 
  
#End Region 
  
   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load 
      'Put user code to initialize the page here 
      Dim cn As OleDbConnection 
      Dim ds As Data.DataSet 
      Dim da As OleDbDataAdapter 
      Dim strConexion As String 
      Dim Ssql As String 
  
      strConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\inetpub\wwwroot\guapeando\cines.mdb" 
  
      'Abrimos la conexión 
      cn = New OleDbConnection(strConexion) 
      cn.Open() 
  
      ds = New Data.DataSet 
      Ssql = "SELECT * FROM cartelera" 
      da = New OleDbDataAdapter(Ssql, cn) 
  
      Dim cmdBuilder As New OleDbCommandBuilder(da) 
      'Cargamos el DataSet 
      da.Fill(ds, "cartelera") 
  
      Dim fila As DataRow 
      List1.Items.Clear() 
      For Each fila In ds.Tables("cartelera").Rows 
         List1.Items.Add(fila("cine") & " - " & fila("film") & " - " & fila("hora")) 
      Next 
   End Sub 
End Class

Lo interesante a mencionar en esta porción de código es que puede verse en el evento Load como se establece la conexión a la base de datos Access, el llenado del DataSet y del control List.
Compilando y ejecutando la aplicación en el emulador WAP el resultado debería ser el siguiente (la pagina a invocar debe ser naturalmente http://localhost/guapeando/beinvenida.aspx):

¿Hacia donde vamos?

Creo que alguna idea de mi opinión al respecto la mencione en los párrafos que inician este articulo. El campo de desarrollo podría decirse que es ilimitado y quizás la pregunta mas adecuada es “¿Que no se puede hacer desde un dispositivo móvil desde el punto de vista del usuario? No se puede detener el tren del avance de la tecnología sino que hay que subirse a el puesto que el mismo es un tren bala y si nos quedamos en la estación esperando por otro, difícilmente aparezca.
Pueden haber quienes opinen que estar conectados en todo momento y en cualquier lugar nos vuelve máquinas o superdependientes, y puede que en parte estén en lo cierto, pero ¿cuantas oportunidades pueden perderse de no estarlo? 
El estar informado y localizable  tiene sus pro y sus contra, y el buen uso de este tipo de tecnología puede brindarnos una enorme cantidad de ventajas.

sábado, 12 de diciembre de 2009

Manual WML - Parte VI Final

Las URL
relativas o absolutas

Puede ocurrir que el dispositivo WAP o el gateway no interprete correctamente una URL relativa. Para evitar esto ser recomienda usar la URL absoluta:




NO
SÍ
<a href="../foo/bar.wml">
<a href="#myID">
<a ref="http://my.server.com/foo/bar.wml">
<a
href="http://my.server.com/foo/bar.wml#myID">


Nombre de variables
y ficheros

No olvides que los datos se envian y reciben a través del aire. La velocidad suele se de 9600. Intenta que se envien el menor volumen de datos posible.
Idea 1: Usa nombres de ficheros lo más cortos posibles. Ej: http:"//my.server.com/i.wml" mejor que http://my.server.com/index.wml
Idea 2: Usa nombres de variables lo más cortos posibles. Si usas menos de 25 variables lo mejor es que uses las letras del alfabeto.




Imágenes

Cuidado. No todos los dispositivos WAP aceptan imágenes. Utilízalas lo menos posible. Alguna SDK si las aceptan, pero... Y si las utilizas no te olvides nunca de poner el atributo alt <img src="imagen.gif" alt="Icono" />




Nombre de variables
y ficheros

¿Has intentado alguna vez escribir un password en un teléfono móvil? Es muy fácil en un PC o en un PDA, pero en un teléfono... Procura no usar el atributo type="password" en los input




¿Listas o Links
normales?

Hay dos formas de crear una lista de 2 links, con un select o con a. Recomendamos la segunda por lo que se explica abajo






NO
SÍ
<select ivalue="0">
<option onpick="#Card2">Link
1</option>
<option onpick="#Card3">Link
2</option>
</select>
<p><a href="#Card2">Link
1</a></p>
<p><a href="#Card3">Link
2</a></p>

Así se va a ver


Así se va a ver


aaaa
bbb
El
problema es que como aparece
seleccionado el primer link,
no podemos
accionarlo, y
si bajamos al segundo,
se inicializa el evento
onpick
y nos vamos a al Card3
Link 1
Link 2


Newcontext="true"

&Iquest;Has visto en el código de alguna página <card id="card1" title="Currency" newcontext="true">? ¿ Lo has probado?
Si pones ese atributo, las variables se borran, incluso la history, por lo que no se puede usar el back. Para inicializar variables es mejor
<card title="Titulo">
<<onevent "onenterforward">
<refresh>
<setvar name="Var1" value="
"/>
<setvar name="some_var2" value="
"/>
</refresh>
</onevent>
...
</card>




Pasar datos a ASP o
CGI

Por ejemplo con un
input:
<input format="NN" name="Var1" title="Var1:"/>
<do
type="accept" label="Mandar:">
<go
href="http://*****/test.asp?datos=$(Var1)"/>




Detectar en el
servidor si se accede con un dispositivo WAP

Sorry, pero no lo he traducido...
XP
Sacado de http://www.egroups.com/group/wmlprogramming

I tried to redirect my browser clients using ASP and following your sample
code. For some reason the content type is text/html. I submit the code see if
any of you can see whats wrong. The redirect woks fine when I use the web
browser.

---------code-----------------------------------------------------

<%Response.ContentType = "text/vnd.wap.wml"%>
<% Dim uastring,
wmlURL, htmlURL
uastring = request.ServerVariables("HTTP_USER_AGENT")

wmlURL = "/martin/index.wml"
htmlURL = "some URL"
If
(InStr(uastring,"UP") Or InStr(uastring, "Nokia") Or InStr(uastring,
"Wap"))
Then
     Response.Redirect wmlURL
else

     Response.Redirect htmlURL
End If %>

-------End of code---------------------------------------
Marco

 

The only problem with this approach is when you encounter a phone that does
not support WMLScript, or your site gets hit by an HTML client. You're much
better off checking on the server end first. This is a trivial exercise in just
about any language, Perl, ASP, Java, etc...

In Perl 5
#!/usr/local/bin/perl5

$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ "UP"){ print "Status: 302 Moved
Temporarily\r Location: <one location>"; } elsif($ua =~ "Nokia"){ ...

You get the picture.

In asp, this construct would look like:

Dim uastring
uastring = request.ServerVariables("HTTP_USER_AGENT")
If
(InStr(uastring,"UP"))Then Response.Redirect(<onelocation>)

and in a Java Servlet it would look like this:

String ua = req.getHeader(HTTP_USER_AGENT);
if (ua.indexOf("UP")!= null){

res.setStatus(res.SC_MOVED_TEMPORARILY);
res.setHeader("Location",
<one location>);

Manual WML - Parte V

17-La etiqueta
postfield

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
name Nombre de la variable que va a enviar el usuario(Obligatorio) Texto
value Valor que toma la variable a enviar Texto
Notas: Atención: Normalmente los datos deben ser enviados en formato escape al servidor, por lo que si los recibimos de un input debemops transformarlos(<postfield name="f"
value="$(datos:e)"/> este tema se amplia en variables) Se utiliza
dentro de una etiqueta go. Acaba siempre con una barra /.
No todos los dispositivos WAP (Ej. Nokia 7110) aceptan el envio de
datos
Ejemplo
<go method="post"
href="http://www.empresa.com/cgi/banco">
<postfield name="Dinero"
value="10000"/>
<postfield name="Num_Cta"
value="12345"/>
<postfield name="Operacion"
value="Deposito"/>
</go>
Explicación:
Enviamos los campos Dinero=10000, Num_Cta=12345 y Operacion=Deposito al servidor
18- La etiqueta setvar

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
name Nombre de la variable que va a inicializar(Obligatorio) Texto
value Valor que toma la variable Texto
Notas: Se suele utilizar dentro de otras etiquetas. Acaba siempre con una barra /
Ejemplo
<go href="#card2">
<setvar name="Anterior" value="Card1" />
</go>

19- Las variables. Nombres y Usos

Las variables, siguen el formato normal de la gran mayoría de lenguajes. Deben empezar por una letra o guión bajo y pueden seguir por otras letras, guiones o números. No uses símbolos ni eñes y ni mucho menos el signo dólar &. Las variables son Case Sensitive, lo que implica que diferencian mayúsculas de minúsculas, Variable no es lo mismo que variable, ni que VaRiAbLe.

Sustitución de variables: A veces queremos que una valor o atributo sea sustituido por los datos que hay almacenados en una variable, y esto se consigue anteponiendo el signo dolar al nombre de la variable entre paréntesis.
Ej.
<input type="text" name="Nombre"/><postfield name="dato1" value="Nombre"/> Esto lo que hace es pasar al servidor el campo dato1 con el valor Nombre, no el nombre que introdujo el usuaior
<input type="text" name="Nombre"/><postfield name="dato1" value="$(Nombre)"/> Esto lo que hace es pasar al servidor el campo dato1 con el nombre que el usuario ha escrito en el input. (Cuidado aún tiene un pequeqo fallo que explicamos ahora).

Caracteres de escape: A veces los servidores necesitan obtener la información en formato de caracteres de escape(el típico
http:\\empresa.com\bancos?%24insertar%24%26true), o una información
obtenida en este formato pasarla a normal. Para ello usamos las transformaciones que implementa WML.
$(nombre_variable:e) --> Pasar a formato escape --> Si el valor de la variable es abc=? nos da
abc%3D%3F
$(nombre_variable:unesc) --> Pasar a formato unescape -->Si el valor de la variable es abc%3D%3F nos da abc=?

Manual WML - Parte IV

13- La etiqueta
input

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
name Nombre de la variable que va a tomar los datos que introduzca el
usuario(Obligatorio)
Texto
value Valor que aparece en el campo input por defecto. Debe cumplir las
reglas de formato de este campo o si no será ignorado; También será
ignorado si la variable ya tiene un valor previo
Texto
type Forma en la que se introducen los datos text Texto normal
password Aparecen asteriscos en vez del texto tecleado. NO se recomienda, ya que para escribir con un telef. móvil es muy complicado
format Formato en que se acepta la introducción de datos El formato por defecto es *M, o sea cualquier caracter en
mayúsculas.
A= Cualquier caracter no numérico en
mayúsculas
a= Cualquier caracter no numérico en
minúsculas
N= Sólo números
X= Cualquier caracter en mayúsculas
x= Cualquier caracter en minúsculas
\dato= Dato es un valor que queremos que aparezca tal cual
emptyok En true si queremos que no sea obligatorio introducir este dato, ya que si tenemos un formato en un campo y no queremos cubrirlo, si lo
dejamos en blanco puede no cumplir el formato, lo que nos da un error
True o false(Por defecto si el campo tiene formato)
size Especifica el ancho en caracteres del input Número
maxlenght Especifica el número máximo de caracteres a introducir Número
title Título usado en la presentación del objeto Texto
tabindex Especifica el orden en que se accede a los distintos objetos dentro de una card. Por defecto de arriba a abajo Número
Notas: Siempre se acaba la etiqueta con una barra /
Ejemplo
<input type="text" name="ape1"
format="A" maxlength="25" emptyok=true />  Acepta 25 letras en mayúsculas y las almacena en la variable ape1. No es un campo
obligatorio(emptyok=true)

<input type="text" name="fecha"
format="NN\-NN\-19NN" maxlength="10"/>   Acepta solamente
números y ya pone el los quiones y el 19, almacenando esto en la variable fecha. Es un campo obligatorio
14- La etiqueta select

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
name Nombre de la variable que va a tomar los datos que introduzca el
usuario(Obligatorio)
Texto
value Valor que tiene la variable por defecto. Texto
multiple Posibilidad de seleccionar más de una opción. Si es así el valor de la variable será ambos valores separados po ; True ó False(por defecto)
ivalue Deternima el index de la opción que queremos que esté seleccionada por defecto. El primer item es 0, el segundo 1.... Número
title Título usado en la presentación del objeto Texto
Notas: Siempre utilizaremos la opción ivalue=0, o al menu que queremos que sea seleccionado por defecto. Siempre se acaba con la etiqueta </select>. Dentro de esta etiqueta deben ir
<option> o <optgroup>
Ejemplo: Se ven en las siguientes etiquetas
15- La etiqueta option

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
value Valor que toma la variable al seleccionar este item Texto
title Título usado en la presentación del objeto Texto
onpick= Evento que ocurre al seleccionar o deseleccionar un item Href. URL o dirección de otra card
Notas: Siempre se acaba con la etiqueta
</option>. Debe estar dentro de la etiqueta <select>
Ejemplo:
<select name="mascota" value="N"
ivalue=1>
<option
value="N">Ninguno</option>
<option
value="P">Perro<</option>
<option
value="G">Gato<</option>
</select>
Explicación:
Tenemos 3 opciones, y por defecto Ninguno seleccionada(ivalue=1). Sólo podemos elegir 1 de ellas. Si elegimos Perro, la variable mascota es P, gato es G y si no elegimos nada N(value="N").
16- La etiqueta optgroup

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
title Título usado en la presentación del objeto Texto
Notas: Siempre se acaba con la etiqueta
</optgroup>. Esta etiqueta es usada para aglurinar a varias option
Ejemplo:
<select name="Pais">
<optgroup
title="América">
<option
value="USA">USA</option>
<option
value="Mex">México</option>
</optgroup>
<optgroup title="Europa">
<option
value="Esp">Espaqa</option>
<option
value="Fra">Francia</option>
</optgroup>
</select>
Explicación:
Tenemos 2 opciones dentro de cada subgrupo. Sólo podemos elegir 1 de ellas. Primero seleccionamos el continente, y dependiendo del seleccionado, nos salen las siguientes opciones, y allí elegimos el valor que asignaremos a la variable Pais

Manual WML - Parte III

9- La etiqueta
a

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
title El texto que sale al entrar en las opciones Texto
href Dirección a la que accederemos Href. URL u otra card
Notas: Se cierra con </a>
Ejemplo
<?xml
version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML
1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="links" title="Links">
<p>
Este es un texto normal, pero aquí hay un
<a title="LINK" href="#card2">link!
</a>
</p>
</card>
<card
id="card2" title="Segunda Card">
<p
align="center">
<br/>
Estamos en la
<br/>
Card2
</p>
</card>
</wml>
Explicación:
Aparece en la pantalla: Este es un texto normal, pero aquí hay un
link! y en la barra de navegación del browser aparece
options. Al acceder a options nos aparece la lista de links activos(en este caso solamente uno).
10- La etiqueta
timer

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
id Identificador del objeto. Usado para referirse a ella Texto
value Tiempo que debe pasar para que se inicialize el evento. Se expresa en décimas de segundo Número
Notas: Si se utiliza una etiqueta timer, siempre hay que definir en la card el valor ontimer, bién sea a otra card
ontimer="#card2" u a otra URL ontimer="http://otraempresa.com/pub/inicio.wml"
Ejemplo
<?xml
version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML
1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="card1" ontimer="#card2" title="Demostrando un timer">
<timer value="35"/>
<p align="center">
<br/>
<big> Bienvenidos a ... </big>
</p>
</card>
<card
id="card2" ontimer="#card3" title="Demostrando un timer">
<timer value="50"/>
<p align="center">
<br/>
<b>
WAP facil<br/></b>
<u> Wireless Application Protocol </u>
...
</p>
</card>
<card id="card3" title="Demostrando un timer">
<p
align="center">
<br/>
<big><i> El mejor curso!
</i></big>
</p>
</card>
</wml>

Explicación: Lo primero que vemos es una
pantalla con un texto que dice Bienvenidos a ... y al cumplirse el timer <timer value="35"/>, pasa a la siguiente y al cumplirse el timer de esta se pasa a la última.
11- La etiqueta img

Los atributos de esta etiqueta son:

Etiqueta Explicación Valores que puede tomar
src Lugar donde se encuentra la imagen Href. Por ahora solamente se aceptan ficheros .wbmp, pero en un futuro se aceptarán GIF y JPG(El Nokia WAP Toolkit 1.2 acepta GIF y JPG) . Descárgate el conversor de ficheros PULSANDO
AQUÍ
alt Texto alternativo. Se recomienda usarlo siempre Texto
vspace y hspace Espacio en blanco entre la imagen y el resto de contenidos. Si es
expresado en porcentaje, representa el espacio total de visión del
browser, no las medidas de la imagen
Número o porcentaje
align Alineación del texto con respecto a la imagen top, middle o bottom
height y width Alto y ancho de la imagen(por este orden) Número
id Identificador del objeto. Usado para referirse a ella Texto
Notas: Siempre se debe
utilizar la propiedad alt, ya que al estar WML aún en desarrollo,
nunca sabemos si el navegador que se está usando acepta imágenes. Esta etiqueta siempre acaba con una barra /
Ejemplo
<img src="./images/ojo.wbmp" alt="ojo"
align="middle" />
12- La etiqueta table

Los atributos de esta etiqueta son:


Etiqueta Explicación Valores que puede tomar
title Título de este elemento. Texto
colums Número de columnas que van a ser representadas. Se recomienda usarlo siempre. El valor 0 es un error en WML Número
align Alineación del texto dentro de su celda L= Izquierda
C= Centro
R= Derecha
id Identificador del objeto. Usado para referirse a el Texto
<tr> Definición de salto de línea. Se cierra con </tr> Ninguno
<td> Definición de salto de columna. Se cierra con </td> Ninguno

Ejemplo
<table
columns=2>
 <tr>
  <td>Pais</td><td>l/m2</td>
 </tr>
 <tr>
  <td>Suiza</td><td>1,3</td>
 </tr>
 <tr>
  <td>Francia</td><td>2,5</td>
 </tr>
</table>

Ventana del browser

Pais l/m2
Suiza 1,3
Francia 2,5

Manual WML - Parte II

5- La etiqueta access
Los atributos de esta etiqueta son:

Etiqueta
Explicación
Valores que puede tomar
id
Nombre de la etiqueta. Usado para referirse a ella
Texto
domain
Dominio de acceso
Href
path
Dirección de acceso
Href
Notas: Atención Esta etiqueta debe ir dentro de la etiqueta <head> AQUI
</head>. Si no se aplica la etiqueta access el acceso es libre.
Ej.
<access domain="miempresa.com"
path="/pub">
Se accede a: miempresa.com/pub/stock.asp ,
miempresa.com/pub/demos/ventas.cgi
No se accede a:
miempresa.com/cgi-bin/ , otraempresa.com/index.wml
6- La etiqueta
do


Los atributos de esta etiqueta son:
Etiqueta
Explicación
Valores que puede tomar
name
Nombre del objeto. Usado para referirse a ella
Texto
label
Texto que aparece al pulsar el botón options en el navegador para
iniciar el evento
Texto
type
Define el tipo de evento que se va a realizar
accept Aceptar
prev Ir atrás
reset Resetea el estado actual
options Operaciones opcionales
delete
Borra un objeto o selección
Notas: Las etiquetas que pueden ir dentro de un do son <go
href="...."/>,
<prev/>,
<noop/>, <refresh/>.
Si una etiqueta
do tiene el mismo name que otra definida en la
template se usa la de esta card.
Ejemplo
Si quieres ver este ejemplo
en acción con fotografías del teléfono móvil PULSA AQUI y se abrirá otra ventana
7- La etiqueta go
Los atributos de esta etiqueta son:

Etiqueta
Explicación
Valores que puede tomar
href
Dirección a la que se quiere ir
Href. Url o nombre de otra card
method
Utilizado para enviar datos al servidor. Se amplia con el tema
postfield
post o get
Notas: esta etiqueta siempre acaba con una barra
<go href="..."/>
Ejemplo
Si quieres ver este ejemplo en acción con fotografías del teléfono móvil PULSA AQUI y se abrirá otra ventana
8- Las etiquetas prev, noop y refresh
Estas etiquetas no tienen atributos

Etiqueta
Explicación
Ejemplo
<prev/>
Ir a la página anterior
<do type="accept" label="Oprima select"><go
href="#card2"/></do>
<noop/>
Ninguna operación
<do type="accept" label="Oprima select"><noop/></do>
<refresh/>
Resetea los valores
<do type="accept" label="Oprima
select"><refresh/></do>
Notas: estas etiquetas siempre acaban con una barra /