Etiqueta: java

Redirect en Java conservando los parámetros POST

Si alguna vez habéis usado el método SendRedirect de un HttpServletResponse intentando respetar los parámetros de una petición POST habréis comprobado que cada navegador hace lo que le viene en gana. Esto es porque el SendRedirect envía un código HTTP 302: found, que al parecer cada navegador interpreta como quiere. Si queréis un workaround sólido para esta problemática, podemos enviar un código de respuesta HTTP 307: temporary redirect que sí respeta este tipo de peticiones. Hacerlo es muy sencillo: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String URL = "https://www.luaces-novo.es"; response.setStatus(response.SC_TEMPORARY_REDIRECT); response.addHeader("Location", URL); } De esta forma se respetará cualquier parámetro envíado mediante un método POST. Recordad que al estar modificando los headers no podéis enviar otro tipo de información que no sean headers o status codes.

Publicado en howtos Etiquetado con: , ,

web.xml ignorando WebServlet

Un truco relámpago en el caso de que os encontréis con problemas al desplegar Servlets a una aplicación con ficheros web.xml que utilizan versiones que no deben. Si al utilizar la anotación WebServlet el servidor de aplicaciones os responde con que no conoce el recurso solicitado seguramente es porque esteis usando una versión del motor de despliegue de aplicaciones que no se lleve bien con la anotación. Para solucionarlo solo tenéis que ver la etiqueta web-app de vuestro web.xml. Si véis en la especificación una versión inferior a la 3.0 ahí tenéis vuestro problema. Esto puede ocasionar también otra serie de problemas. Aquí tenéis un web-app usando una declaración para el motor de despliegue 3.0, que directamente ignora el web.xml. <web-app version=”3.0″ xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”>

Publicado en howtos Etiquetado con: , ,

Catalina_base y catalina_home en Apache Tomcat

Hoy me despisté un poco porque instalé el paquete de Netbeans J2EE que ya incluye ya un servidor GlassFish y Apache Tomcat. Estuve un rato trasteando con la configuración de Tomcat y me enfadé un poco porque ningún cambio parecía tener efecto; entonces es cuando me di cuenta de que netbeans por defecto establece la variable de entorno catalina_base a un valor distinto de catalina_home. Tras ver el problema me costó muy poco toparme con esto que explica de que va esa variable llamada catalina_base. Si estáis muy perdidos en toda esta jerga, voy a empezar desde el principio. Catalina es el codename del contenedor de servlets del Tomcat, catalina_home es una variable de entorno que debería apuntar al directorio de instalación y configuración del tomcat. Dependiendo del entorno en el que trabajéis (principalmente del sistema operativo y la infraestructura de vuestros sistemas) la instalación del Tomcat estará repartida de una forma u otra, pero el catalina_home va a estar presente en todas las instalaciones (aunque hay formas alternativas de trabajar con Tomcat). El caso es que el sistema va siempre a buscar las configuraciones del servidor en catalina_home. ¿Siempre?, aquí es donde yo metí la pata… solo usará catalina_home si la

Publicado en howtos Etiquetado con: , ,

Java: Foreach con Map

Aquí os pongo un truco relámpago para usar una sentencia foreach (o enhanced for, como llaman algunos de Oracle) con el fin de recorrer las entradas de una colección de tipo Map. La cosa consiste en utilizar la interfaz Entry contra el KeySet del Map, consiguiendo así hacerlo lo más rápido posible. La definición de la interfaz: Interface Map.Entry<K,V> La interfaz está estrechamente vinculada con los Maps porque solo existe en su interior. Cada Entry representa un par clave -> valor dentro del Map. Sabiendo esto, deduzco que ya sabréis como se hace el foreach, pero por si acaso aquí va un ejemplo funcional. package pruebas; import java.util.Map; import java.util.HashMap; import java.util.Map.Entry; /** * * @author Héctor Luaces Novo */ public class EjemploForeachMap { public static void main(String args[]) { Map<Integer, String> h = new HashMap<>(); h.put(1, "uno"); h.put(2, "dos"); h.put(3, "tres"); h.put(4, "cuatro"); for(Entry<Integer, String> e: h.entrySet()) { System.out.println(e.getKey() + " : " + e.getValue()); } } } } La ejecución da el siguiente output: 1 : uno 2 : dos 3 : tres 4 : cuatro Es bastante eficiente hacerlo así, a la par que muy fácil de ver y entender. ¡Hasta el próximo truco relámpago!

Publicado en howtos Etiquetado con: ,

Guía de colecciones en Java

Lo que me motivó a escribir esta guía de colecciones en java es el inmenso tamaño del framework de colecciones que puede echar para a atrás a cualquier programador que se ponga a investigar las APIs sin ordenar un poco las ideas. Hay tantas interfaces e implementaciones que es fácil perderse y no saber que usar en cada momento. Esta pequeña guía de colecciones en Java pretende explicar, de manera sencilla, que las colecciones en Java y que implementación sería mejor que usases para cada caso. Este va a ser un post extenso, así que voy a ser tan amable de proporcionaros una pequeña tabla de contenidos. Tipos de colecciones en java Listas Sets Maps Colas Listas ArrayList LinkedList Vector CopyOnWriteArrayList Sets HashSet LinkedHashSet TreeSet EnumSet CopyOnWriteArraySet ConcurrentSkipListSet Maps HashMap LinkedHashMap TreeMap EnumMap WeakHashMap HashTable ConcurrentHashMap Colas ArrayDeque LinkedBlockingDeque LinkedList PriorityQueue PriorityBlockingQueue Diagramas de clases Diagrama de clases: Listas Diagrama de clases: Sets Diagrama de clases: Maps Diagrama de clases: Colas Notas finales

Publicado en howtos Etiquetado con: ,

Libro de arquitectura JEE gratuito en castellano

Cecilio Álvarez Caules es un SCEA que ha escrito un libro de arquitectura JEE gratuito en castellano. Podéis descargarlo gratuitamente de aquí. Una lectura apuesto que bastante enriquecedora, en breves le echaré un ojo. Fuente

Publicado en howtos Etiquetado con: , , ,

Enlace dinamico en Java

Ayer mismo os hablaba del polimorfismo en POO y como lo implementa Java. Espero que el post fuese ilustrador, pero con él pretendía asentar las bases para hablar del Enlace dinámico en Java. Permitidme que os aclare que en la lengua de Shakespeare esto se llama Dynamic Binding. Si cometéis el mismo error que yo y pretendéis buscar información sobre el tema usando las kewywords Dynamic Linking  estaréis leyendo sobre un tema muy distinto. Aclarado esto, vamos al grano… ¿Qué es el enlace dinamico en Java? Si recordáis el post anterior, cuando hablabamos del polimorfismo de asignación, os decía que cualquier variable tiene un tipo estático y un tipo dinámico. Esto significa que una misma variable tiene dos tipos: un tipo que se interpreta en tiempo de ejecución (tipo dinámico) y un tipo que se interpreta en tiempo de compilación (tipo estático). Se que esta definición no aclarará mucho, así que vamos a intentar entenderlo paso a paso y con ejemplos. Al acabar, espero que la definición la entendáis mucho mejor. Empecemos poniendo la base de nuestro pequeño ejemplo. Supongamos que tenemos estas clases: abstract class DriverBD { abstract public boolean conectar(String host, int puerto, String bd); abstract public boolean desconectar();

Publicado en howtos Etiquetado con: ,

Polimorfismo en Java

Tenía pensado escribir sobre el enlace dinámico y estático en los Tipos de Java, pero creo que para que un programador pueda entender correctamente estos conceptos, primero ha de estar familiarizado con el concepto de polimorfismo en Java y en POO. En el artículo voy a hablar tanto en términos generales (aplicables a cualquier lenguaje POO) como específicos. No todos los lenguajes tienen los mismos tipos de polimorfismo que Java, pero creo que leyendo todo se conseguirá obtener un nivel de comprensión de este concepto mucho mayor, que a veces es un tema que es conocido, pero que no se entiende completamente.   Polimorfismo en Java El polimorfismo es la habilidad de una función, método, variable u objeto de poseer varias formas distintas. Podríamos decir que un mismo identificador comparte varios significados diferentes. El propósito del polimorfismo es implementar un estilo de programación llamado envío de mensajes en el que los objetos interactúan entre ellos mediante estos mensajes, que no son más que llamadas a distintas funciones. Java tiene 4 grandes formas de polimorfismo (aunque conceptualmente, muchas más): Polimorfismo de asignación Polimorfismo puro Sobrecarga Polimorfismo de inclusión   Polimorfismo de asignación El polimorfismo de asignación es el que está más relacionado

Publicado en howtos Etiquetado con: , ,

Genéricos para recién llegados a Java

p>Recientemente he empezado a preparar una certificación de Java. He programado en POO desde años atrás gracias a administrar y programar en el juego online Reinos de Leyenda durante muchos años, por lo que empezar a “pensar en Java” me costó poco, aunque he de reconocer que algunas cosas me tuvieron en vilo más que otras. En el curso me di cuenta de que la idea de los genéricos en Java es algo que muchos programadores no entienden. Precisamente por eso me apeteció escribir este artículo Genéricos para recién llegados a Java; porque espero que pueda ayudar a alguien que tenga problemas para entender estos conceptos. Probablemente la primera pregunta relacionada con los genéricos que se hace un programador que recién ha llegado a java es: “¿que es esa que veo en muchas declaraciones de clases, interfaces o métodos?”. Pues bien: eso es un genérico. ¿Para qué sirven los genéricos en Java? Los genéricos sirven para permitir que métodos o clases puedan operar con distintos tipos de objetos proporcionando seguridad en tiempo de compilación. Esto nos permite crear código más legible y mucho más robusto. Supongamos las siguientes dos clases: class A() { } class B() { } Imaginemos que

Publicado en howtos Etiquetado con: ,