viernes, 24 de abril de 2009

J2SE: StringBuilder

La clase String nos permite almacenar cadenas de caracteres, pero desgraciadamente no son manipulables. En caso de que se precise modificar es recomendable el uso de StringBuilder.

La clase StringBuilder dispone de muchos métodos para modificar el contenido de los objetos StringBuilder, sin embargo consume más recursos que String. StringBuilder remplaza a StringBuffer

Los métodos principales son append e insert; append añade caracteres al final de la memoria mientras que insert los inserta en un punto determinado.

Por Ejemplo:

StringBuilder sb = new StringBuilder("o");
sb.append("o");
sb.insert(1, "j");
System.out.println(sb);

El resultado obtenido sería "ojo" partiendo solamente de la primera "o".

Cuando concatenamos con el signo '+' con varios objetos String, estamos utilizando internamente StringBuilder.

Al igual que podemos insertar, podemos eliminar, incluso remplazar. Veamos algunos ejemplos:

sb.replace(0, 1, "oooo"); //remplazamos caracteres por cadena
sb.delete(0, 2); //Elimina Rangos
sb.deleteCharAt(1); //Elimina caracter

Para controlar mejor el StringBuilder tenemos métodos para cambiarlo como String, saber la longitud de la cadena y la capacidad del objeto.

System.out.println("buffer = " + sb); //Cadena
System.out.println("String = " + sb.toString()); //Cambia a String
System.out.println("length = " + sb.length()); //Longitud de Cadena
System.out.println("capacity = " + sb.capacity()); //Capacidad Actual

J2SE: ArrayList

Las Arrays son muy útiles para almacenar datos comunes, pero en ocasiones no conocemos la longitud de cada vector y crea un problema de estabilidad en nuestro programa. ArrayList es una potente clase que se encuentra dentro del paquete java.util que nos permite trabajar sin conocer los espacios que vamos a necesitar.

Actualmente al crear un ArrayList se debe de indicar su tipología:
ArrayList<String> lista = new ArrayList<String>();

Para agregar datos se utiliza el método add
lista.add("Hola");
lista.add(0, "Hola");
Podremos señalar la posición o por defecto escribirá después de la última.

Si necesitamos leer el método get nos permitirá hacerlo indicando el índice
lista.get(0)

Un listado más avanzado para el uso de ArrayList
lista.size() # Retorna númericamente el número de índices usados
lista.contains("Hola") # Retorna un booleano afirmativo si existe la ocurrencia
lista.indexOf("Hola") # Devuelve la posición exacta de la primera ocurrencia
lista.lastIndexOf("Hola") # Para la última ocurrencia
lista.remove(0) # Elimina el contenido de dicho índice
lista.set(0, "Hi") # Modifica una posición
lista.trimToSize() # Reduce al mínimo el almacenamiento, ya que por defecto min.10
lista.ensureCapacity(20) # Reserva un mínimo de capacidad, en este caso min.20
lista.toArray(vector) # Migra un ArrayList a un Vector ya definido
lista.clear() # Vacía la ArrayList
lista.isEmpty() # Retorna true si la ArrayList está vacía

jueves, 23 de abril de 2009

Servlet: Controlando Caracteres Especiales de HTML

Es posible que en un formulario se inserten caracteres especiales reservados por HTML, en ocasiones la insercción de estos caracteres será por desconocimiento o malicia para controlar código a modo de exploit.

La permisión de estos caracteres deben de ser tratados y evaluados antes que puedan dañar el sistema

El ejemplo muestra un método (filter) que usa la clase StringBuffer para manipular por partes la variable e intercambiar el símbolo por su código en HTML, para aligerar el proceso, se ha desarrollado otro método (hasSpecialChars) que comprueba si debe de ser controlado, ya que la clase StringBuffer consume bastante más que la String y crear un objeto para cada palabra sería innecesario y no fructifero.

Servlet: Usar Valores Por Defecto en Formularios Incompletos

Cuando se crea un formulario es necesario por seguridad chequear tres condiciones:
  • El valor es nulo
  • El valor está vacío
  • El formato es incorrecto
No basta con chequear con un JS, también sería necesario cerciorarse desde el servidor, además cabría la posiblidad que tubiera desactivado JS en el navegador.

Para remplazar los datos vacíos que el usuario se haya podido dejar por equibocación usar el método replaceIfMissing(title, "Título por Defecto");

sábado, 11 de abril de 2009

Servlet: Leyendo datos de formularios

Leer datos de los formularios es una de las tareas más útiles que permite la tecnología servlet, existen varios métodos para desempeñar dicha función de diferentes maneras:


getParameter
Para leer una petición de parámetro de un formulario, tan solo, hay que llamar al método getParameter procedente de la clase HttpServletRequest, suministrando el nombre del parámetro como un argumento. Es preciso recordar que distingue entre mayúsculas y minúsculas.

El programador facilita el nombre exacto del parámetro tal como figura en código HTML, y se recoge el resultado como el usuario final lo ha insertado. A diferencia de muchas alternativas de la tecnología servlet, se usa el método getParameter tanto para datos mandados por GET (doGet) o POST (doPost); el servlet sabe por qué método ha sido enviado el dato y automáticamente usa el método apropiado para leerlo.

Una cadena vacía es devuelta si el parámetro existe pero carece de valor, sino existe se devuelve un null. Es necesario tener presente la distinción de las mayúsculas y minúsculas, ya que no es lo mismo, y puede llevar a errores. Por ejemplo entre request.getParameter("Nombre") y request.getParameter("nombre").


getParameterValues

Si algún nombre de parámetro puede aparecer más de una vez en el formulario, se debería de llamar el método getParameterValues que devuelve un vector de strings. El valor devuelto de getParameterValues es nullo si no existe dicho parámetro y un elemento en la array si el parámetro solamente tiene un valor, es decir, es simple.

Se puede usar siempre el valor simple con getParameter y evitar getParameterValues. Sin embargo cuando se trabaja en grupo, es posible que necesites desenvolverte con este tipo de métodos. Además, para los valores multiseleccionables de las cajas de listados repiten el nombre del parámetro por cada elemento seleccionado de la lista. Por tanto no se puedes evitar siempre los valores multievaluados.


getParameterNames
Se usa getParametersNames para obtener una lista Enumeration de cada entrada en String empleadas en una llamada a getParameter o getParameterValues. Si no existen parámetros en la petición actual, getParametersNames devuelve un Enumeration vacío, que no nulo. Se ha de tener en cuenta que Enumeration es una interface que simplemente garantiza que existan métodos hasMoreElements y nextElement; no garantiza que cualquier estructura de datos pueda ser usada.


getParameterMap
Este método es una alternativa a getParameterNames. Devuelve un mapa: los nombres de parámetro con sus respectivos valores formando una tabla de valores. El nombre de cada parámetro será el identificador, por supuesto.


getReader o getInputStream
En vez de leer los parámetros de forma individual, también se puede acceder a la consulta de datos directamente llamando a getReader o getInputStream dentro de HttpServletRequest. Por otra parte, si se lee el dato en dicha manera, no se garantiza que esté disponible con getParameter. Estas herramientas se utilizan en dos situaciones; cuando los datos deben de ser analizados y provienen de un cliente personalizado en vez de un formulario HTML, o cuando los datos se leen desde un archivo subido (input type="file"...), aunque para leer tales archivos es necesario una librería como puede ser el proyecto Jakarta de Apache ya que desafortunadamente la api de servlet no soporta dicha función.


setCharacterEncoding
Igual es útil leer datos de entrada en distinta codificación de caracteres, por defecto getParameter usa la codificación del servidor por el que corre. Para cambiarlo se usa el método setCharacterEncoding de ServletRequest. Podría existir la opción de tener que trabajar con varios sistemas de codificación de caracteres a la vez, en ese caso, lo lógico sería utilizar una función de detección automática para luego convertirla a la codificación por defecto. Aquí está la lista de codificaciones que soporta Java.


Ejemplo con getParameter para leer valores simples de un formulario
















Ejemplo con getParameterNames para valores de nombres de parámetros desconocidos (Dicho código inmerso en los métodos doGet o doPost)




No se suele utilizar mucho, pero bueno, ahí está por si acaso es necesario obtener información de formularios donde no conocemos los nombres de los parámetros.

viernes, 10 de abril de 2009

Servlet: El método init

El método init() es usado para inicializar los parámetros de configuración como la conexión con una base de datos, la inicialización de archivos y otros valores de entorno.

Init() es llamado solamente cuando se carga por primera vez el Servlet, justo antes de que la primera petición (request) sea procesada.

Un ejemplo sencillo, que crea números aleatorios cuando es llamado el Servlet:

Per un domini punt val