Tuesday, December 08, 2009

Reglas para declarar variables en PHP

Pues este es el primer post acerca de PHP más adelante iré publicando algunos otros, pero empezaremos asumiendo que se tiene una noción básica de como correr los scripts en XAMP o algun otro server.

PHP es un lenguaje que utiliza variables dinámicas, es decir, las variables no son declaradas para ser de un tipo en específico como es el caso de C o Java. Una variable en PHP se define como un contenedor que se puede usar para almacenar datos, cada variable debe tener un nombre único.

Algunas reglas para declarar variables validas:
  1. El primer caracter de la variable debe comenzar con un signo de pesos($), después puede venir una letra o un guión bajo ( _ ), seguido por una letra, un guión bajo o un número.
  2. La longitud mínima para el nombre de una variable es de 1 caracter.
  3. Caracteres especiales diferentes al guión bajo o al signo de pesos($) no son permitidos
Algunas mejores prácticas que no causan errores al correr los scripts pero que son recomendadas:
  1. Usar minúsculas para los nombres de las variables
  2. Separar las palabras con guiones bajos. Por ejemplo: $primer_nombre
Aún cuando PHP no es sensible a mayúsculas y minúsculas en los nombres de los métodos, las variables si lo son, es decir $var y $VAR son diferentes variables. Las variables pueden contener Booleanos (true, false), Numerico ( 1.5, -7), Arreglos, Objetos o el valor NULL.

    Monday, December 07, 2009

    Google App Engine

    Como siempre Google esta inovando en el servicio que da a sus usuarios, ahora se brincaron la barda y estan permitiendo que los desarrolladores puedan hostear sus aplicaciones Java en la infraestrctura de google, chequen el siguiente video:



    Eclipse RCP Buenos Tutoriales

    Esta es una lista de algunos tutoriales para Eclipse que encontré en la página de Lars Vogel, creo que es una página muy interesante y con muy buenos recursos.

    Eclipse Java IDE Tutorial  – http://www.vogella.de/articles/Eclipse/article.html

    Java Debugging with Eclipse – http://www.vogella.de/articles/EclipseDebugging/article.html

    Eclipse Shortcuts – http://www.vogella.de/articles/EclipseShortcuts/article.html

    Eclipse Plug-in Development - http://www.vogella.de/articles/EclipsePlugIn/article.html

    Eclipse RPC Development – http://www.vogella.de/articles/RichClientPlatform/article.html

    Para una lista completa de todos los recursos visite http://www.vogella.de

    Struts - Hola Mundo

    Estructura de los Archivos e Instalación

    Las aplicaciones Web poseen una estructura de archivos definida para poder ejecutarse en un contenedor de Servlets, como el Tomcat de Apache, esta estructura por lo regular no se modifica y solamente se le agregan algunas librerías para poder correr una aplicación utilizando Struts.


    Para obtener e instalar Struts se debe obtener una versión de la herramienta en la dirección http://struts.apache.org/download.cgi. Dentro del archivo comprimido de la distribución, existe un directorio llamado lib que se debe copiar a la carpeta WEB-INF. Esta carpeta contiene todos los archivos JAR que utiliza la aplicación.  Al momento de compilar los archivos java se debe asegurar que los archivos contenidos dentro de la carpeta lib estén en el classpath.


    Componentes de Struts

    MVC es parte fundamental de Struts, para explicar como encajan las partes de este patrón, se explicará un ejemplo modificado del clásico "Hola Mundo".

    Elementos de la Vista

    La vista esta conformada de dos JSPs: index.jsp y hola.jsp, dentro de index.jsp se declara una forma que hace referencia a la acción hola.do, esta compuesta de un campo de texto y un botón para enviar la forma. El campo de texto tiene un atributo name = “nombre” que especifica un nombre lógico para la forma.

    <form  method="POST" action="hola.do" >
        Escriba su nombre:
        <input type="text" name="nombre"/>
        <input  type="submit" value="Enviar"/>
    </form>
    

    Para el manejo de formas, Struts provee una clase llamada ActionForm que se debe extender para darle funcionalidad. Dentro de la subclase, por cada campo dentro de la forma, se debe declarar una variable instancia con el mismo nombre que se asignó al atributo name en el código HTML, para cada variable se deben escribir métodos get y set como se muestra en el siguiente ejemplo:

    /*
    * HolaForm.java
    */
    package aldo.ejemplo;
    
    //area de imports
    import javax.servlet.http.HttpServletRequest;
    import org.apache.struts.action.*;
    /**
    *
    * @author Aldo A. Solis
    */
    public class HolaForm extends ActionForm{
    
        /** Esta variable sirve para guardar el nombre del usuario */
        private String nombre;
    
        /**
        * Sirve para obtener la variable nombre
        * @return variable String nombre
        */
        public String getNombre(){
            return this.nombre;
        }
    
        /**
        * Sirve para asignar un nombre a la variable
        * @param nombre cadena que se asignará
        */
        public void setNombre(String nombre){
            this.nombre = nombre;
        }
    
        public void reset(ActionMapping map, HttpServletRequest req){
            this.nombre = “”;
        }
    
        public ActionErrors validate(ActionMapping map,
        HttpServletRequest req){
            ActionErrors errors = new ActionErrors();
            if((nombre == null) || (nombre.length() < 1))
                errors.add(“nombre”, new ActionMessage(“error.nombre”));
            return errors;
        }
    }
    

    Adicionalmente se pueden sobrescribir los métodos reset y validate que tienen funcionalidades específicas. El método reset es invocado para reinicializar las variables a un valor dado por el programador, mientras el método validate se usa para validar que los datos no tengan errores de captura o valores nulos.

    El archivo hola.jsp tiene la función de desplegar un letrero con el nombre que el usuario introdujó en index.jsp, esto mediante la siguiente línea de código:

    <h1>Hola  <%= request.getAttribute("nombre")%></h1>

    La línea anterior pide un atributo llamado “nombre” dentro del request y lo despliega en la página.

    Elementos del controlador

    Struts implementa el controlador mediante la clase ActionServlet del paquete org.apache.struts.action, es importante aclarar que esta clase es concreta, es el servlet principal de nuestra aplicación y no se necesita extender para poder usar el framework.

    Toda aplicación Web debe tener un descriptor de despliegue (conocido en inglés como deployment descriptor) llamado web.xml, en este archivo se debe especificar el uso de Struts de la siguiente manera:

    <?xml  version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    version="2.4">
    <servlet>
    <servlet-name>action</servlet-name>
    <!–- nombre completo de la clase  ActionServlet–>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <!-- parámetro que contiene la ruta donde se  encuentra nuestro archivo de configuración de struts -->
    
    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    </servlet>
    <!—- Todas las peticiones *.do son para el  ActionServlet -->
    <servlet-mapping>
    
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    </web-app>
    

    El desarrollador indica al framework las acciones, las formas y otros atributos mediante un archivo de configuración que por convención se llama struts-config.xml y tiene los siguientes campos para la aplicación "Hola Mundo":

    <?xml  version="1.0" encoding="UTF-8"?>
    <!DOCTYPE  struts-config PUBLIC
    "-//Apache Software Foundation//DTD  Struts Configuration 1.2//EN"
    "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"  >
    <struts-config>
    <form-beans>
    <form-bean name="forma"
    type="aldo.ejemplo.HolaForm"/>
    
    </form-beans>
    <action-mappings>
    <action path="/hola"
    type="aldo.ejemplo.HolaAction"
    name="forma"
    scope="request"
    input="/index.jsp"
    validate="true" >
    
    <forward  name="DecirHola"
    path="/hola.jsp" />
    </action>
    </action-mappings>
    </struts-config>
    

    La etiqueta form-beans sirve para declarar las clases que representan formas HTML, en el atributo name se escribe un nombre lógico con el que se le hará una referencia futura y en type se especifica el nombre completo de la clase.

    Dentro de la etiqueta action-mappings se especifican las acciones, en este caso tenemos una sola acción pero por lo regular se tendrá más de una. La etiqueta action describe los atributos de una acción, en path se indica el nombre de como se llamará al recurso sin el “.do” (dado que esta terminación sirve para llamar al ActionServlet) y agregándose una diagonal al principio. El atributo name sirve para especificar el ActionForm que se usará por esta Action mediante su nombre lógico, validate indica si se llamará o no al método validate del ActionForm, así como input debe tener el nombre del JSP al que se redireccionará si validate regresa algún error.

    La etiqueta forward especifica un nombre lógico y una página JSP, que el Action utiliza para continuar con el flujo de la navegación.

    Para crear una acción se debe extender la clase org.apache.struts.action.Action y sobrescribir el método execute que tiene la siguiente firma:

    public ActionForward  execute( ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response )

    El siguiente ejemplo muestra como implementar el Action de la aplicación "Hola Mundo":

    /*
    * HolaAction.java
    */
    package aldo.ejemplo;
    
    // librerias necesarias
    import org.apache.struts.action.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
    * Esta clase se encarga de sobre-escribir el método execute
    * que extiende de la clase Action, recupera una forma tipo
    * HolaForm, y obtiene la variable nombre, después agrega el
    * atributo nombre al request y decide la siguiente página a
    * mostrar.
    *
    * @author Aldo A. Solis
    */
    public class HolaAction extends Action{
    
        public ActionForward execute(ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response){
    
            // Recuperamos la forma
            HolaForm forma = (HolaForm) form;
            // Obtenemos el nombre introducido por el usuario
            String nombre = forma.getNombre();
            // Hacemos una instancia del modelo
            HolaModelo modelo = new HolaModelo();
            // Llamamos a un método del modelo
            nombre = modelo.mayusculas(nombre);
            // Agregamos al request el atributo nombre
            request.setAttribute(“nombre”, nombre);
            // Seleccionamos la siguiente pagina “DecirHola”
            // definida en el struts-config.xml
            ActionForward fwd = mapping.findForward(“DecirHola”);
            return fwd;
        }
    }
    

    Elementos del Modelo


    El modelo es lo que al desarrollador le interesa. En el modelo se lleva acabo la lógica aplicativa del sistema Web que se esta desarrollando. Struts no provee elementos que faciliten al desarrollador la implementación del modelo, ya que es responsabilidad del programador hacerlo. A continuación se muestra el modelo utilizado por la aplicación ejemplo:

    /*
    * HolaModelo.java
    */
    package aldo.ejemplo;
    
    public class HolaModelo {
    
        /**
        * Invierte una cadena
        * @param cadena String a modificar
        * @return String modificado
        */
        public String voltear(String cadena){
            String nuevaCadena=new String(” “);
            System.out.println(cadena);
            for (int i=cadena.length()-1; i>=0; i–){
                String tmp = cadena.substring(i,i+1);
                nuevaCadena = nuevaCadena.concat(tmp);
            }
            return nuevaCadena;
        }
    
        /**
        * Convierte una cadena a mayúsculas
        * @param cadena String a modificar
        * @return String modificado
        */
        public String mayusculas(String cadena){
            return cadena.toUpperCase();
        }
    
        /**
        * Convierte una cadena a minúsculas
        * @param cadena String a modificar
        * @return String modificado
        */
        public String minusculas(String cadena){
            return cadena.toLowerCase();
        }
    }

    Correr la Aplicación

    Para correr la aplicación se deben compilar las clases y copiar los paquetes generados al directorio classes dentro de WEB-INF, por otra parte se deben copiar también las páginas o JSPs encargadas de la vista a la carpeta raíz, una vez tenida la estructura mostrada en la primer figura de este tutorial, se procede a copiar la carpeta de la aplicación al directorio de nuestro contenedor de Servlets. La aplicación funciona de la siguiente manera:

    1. El sistema pregunta al usuario su nombre
    2. El usuario lo escibre y presiona el botón de enviar
    3. El sistema procesa la solicitud
    4. El sistema despliega el resultado



    ¿Qué es Struts?

    La primera vez que utilicé Struts fue en el año 2005 cuando estuve haciendo mi Tesis profesional, me parece que es un buen framework para empezar, y depués entender como funcionan los demás. El creador de este framework es Craig McClanahan.
    Cuando se construyen aplicaciones, se tienen 2 opciones, tener varios controladores uno por cada vista-modelo que utilicemos o utilizar un solo controlador con varios modelos y vistas. Utilizar varios controladores tiene la desventaja que se generan demasiados Servlets con duplicación de código y se tiene que implementar cada uno de los controladores. Por eso la mayoría de las veces se usa la segunda opción ya que centraliza todas las peticiones del usuario en una sola parte.
    Por otro lado, si se analiza la estructura de una aplicación Web con un solo controlador, encontramos que la ventaja de centralizar todas las tareas en un solo lugar puede causar que el controlador este muy saturado y dependiendo de la petición, además de tener que validar los parámetros, el controlador debe buscar el modelo que debe actualizar y la vista que va a presentar. Por ejemplo, si se tiene que desarrollar una aplicación con 15 JSP, y cada uno tiene 5 ligas, el número total de peticiones que el controlador debe manejar suma un total de 75, es decir, 75 bloques de IF en una sola clase, esto hace que el controlador sea muy difícil de mantener.
    La solución por la que se puede optar es hacer el controlador configurable y utilizar clases externas que se encarguen de las peticiones, es decir, seguir usando un solo controlador que puede ser configurado desde un archivo de texto, donde se especifican las clases que se encargan de las peticiones de las vistas, es decir, dividir el controlador en 3 partes, un solo Servlet que recibe todos las peticiones, varias clases (Manejadores de Peticiones) que ayuden al Servlet con las peticiones y la comunicación con los modelos, y un archivo de configuración donde se especifiquen las relaciones entre peticiones y clases para que el Servlet principal pueda delegar responsabilidades a las clases especificadas.





    Struts facilita el desarrollo de aplicaciones Web encargándose de las desventajas mostradas sobre el uso del modelo 2, ya que utiliza un solo controlador, el cuál por medio de un archivo XML sabe a que modelo, vista o acción acudir dependiendo de la petición del usuario.
    En general un cliente hace una petición a un Servlet central (ActionServlet), que ya viene implementado en el framework, este servlet busca dentro del archivo de configuración (strus-config.xml un a clase de Java (Action) que corresponde a esa petición, el cual puede acceder a la logica del negocio y por consiguiente a datos persistentes, esta clase de Java (Action) regresa como resultado la siguiente vista que se debe mostrar al cliente. El ciclo se repite hasta que el usuario deja de hacer peticiones a la applicación.



    Para ver un ejemplo completo con Struts, ver el siguiente Blog.

    Convertidor Code2HTML

    Esta vez quiero recomendarles un programita que me encontre en internet y que me sirve para publicar estos blogs, estoy hablando de Code2HTML Converter, esta aplicación permite convertir codigo en cualquier lenguaje a HTML con formato de acuerdo a la sintaxis del lenguaje en cuestion. Esta aplicación esta disponible en la siguiente url http://www.palfrader.org/code2html/.

    La única desventaja de este programa es que no corre en Windows, pero tiene una version Online que es la que pueden usar para no tener que instalar  emuladores.